diff --git a/build.gradle b/build.gradle
index 15085381..a8d007d8 100644
--- a/build.gradle
+++ b/build.gradle
@@ -101,6 +101,7 @@ task make_etc() {
["steps", "step-file", "step-os", "step-paged-media",
"step-run", "step-text", "step-mail", "step-rdf", "step-validation",
+ "step-ixml"
].each { spec ->
Task t = task "copy_${spec}_build"(dependsOn: [ "buildspecs" ], type: Copy) {
from "$spec/build/"
@@ -653,6 +654,58 @@ task step_mail_xpl(dependsOn: ["step-mail:library"], type: Copy) {
rename ("library.xml", "steps.xpl")
}
+// ======================================================================
+// step-ixml
+
+task step_ixml(type: DocBookTask,
+ dependsOn: [ "download_xproc_toc",
+ "steps", "xproc_schemas", "spec_schemas",
+ "step-ixml:specification",
+ "step_ixml_assets",
+ "step_ixml_src", "step_ixml_xpl" ]) {
+ inputs.files fileTree(dir: "tools/xsl/")
+ inputs.files fileTree(dir: "tools/xpl/")
+ inputs.file "build/xproc/toc.xml"
+ input("source", "step-ixml/build/source.xml")
+ output("result", "build/dist/ixml/index.html")
+
+ param("schemaext.schema", file("build/schema/dbspec.rng"))
+ param("ci", getenv("CIWORKFLOW"))
+ param("ci-commit", getenv("CI_SHA1"))
+ param("ci-build-number", getenv("CI_BUILD_NUM"))
+ param("ci-user", getenv("CI_PROJECT_USERNAME"))
+ param("ci-repo", getenv("CI_PROJECT_REPONAME"))
+ param("ci-branch", getenv("CI_BRANCH"))
+ param("ci-tag", getenv("CI_TAG"))
+
+ option("style", file("tools/xsl/xproc-specs.xsl"))
+ option("diff", deltaxml())
+ option("specid", "ixml")
+ option("diffloc", buildAbsDir + "/ixml/diff.html")
+
+ pipeline "tools/xpl/formatspec.xpl"
+}
+buildspecs.dependsOn "step_ixml"
+
+task step_ixml_assets(type: Copy) {
+ from "src/main/resources"
+ into "build/dist/ixml/"
+}
+
+task step_ixml_src(dependsOn: ["step-ixml:source"], type: Copy) {
+ from "step-ixml/build/"
+ into "build/dist/ixml/"
+ include "source.xml"
+ rename ("source.xml", "specification.xml")
+}
+
+task step_ixml_xpl(dependsOn: ["step-ixml:library"], type: Copy) {
+ from "step-ixml/build/"
+ into "build/dist/ixml/"
+ include "library.xml"
+ rename ("library.xml", "steps.xpl")
+}
+
// ======================================================================
// Clean up
diff --git a/settings.gradle b/settings.gradle
index 1f1dc956..e92df9ae 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,2 +1,2 @@
include 'steps', 'step-validation', 'step-os', 'step-paged-media', 'step-run',
- 'step-file', 'step-text', 'step-mail'
+ 'step-file', 'step-text', 'step-mail', 'step-ixml'
diff --git a/step-ixml/build.gradle b/step-ixml/build.gradle
index c9e5eda9..0e771965 100644
--- a/step-ixml/build.gradle
+++ b/step-ixml/build.gradle
@@ -5,7 +5,7 @@ repositories {
configurations {
tools {
- description = "ixml tools"
+ description = "Run tools"
transitive = true
}
}
@@ -56,27 +56,37 @@ task glossary(dependsOn: ["xinclude"], type: XMLCalabashTask) {
pipeline "../tools/xpl/makeglossary.xpl"
}
-task specification(dependsOn: [ "source" ]) {
- // nop
+task library(dependsOn: ["source"], type: XMLCalabashTask) {
+ inputs.file "build/source.xml"
+ inputs.file "../tools/xpl/typed-pipeline-library.xpl"
+ inputs.file "../tools/xsl/typed-pipeline-library.xsl"
+ outputs.file "build/library.xml"
+ input("source", "build/source.xml")
+ output("result", "build/library.xml")
+ pipeline "../tools/xpl/typed-pipeline-library.xpl"
}
-// ================================================================================
-// Process the examples
-
-def stripFiles = [ ]
-
-stripFiles.each { String name ->
- String newname = name.substring(0, name.lastIndexOf(".")) + ".txt"
+task rnc(dependsOn: ["library"], type: XMLCalabashTask) {
+ inputs.file "build/library.xml"
+ inputs.file "../tools/xpl/library-to-rnc.xpl"
+ inputs.file "../tools/xsl/library-to-rnc.xsl"
+ outputs.file "build/steps.rnc"
+ input("source", "build/library.xml")
+ output("result", "build/steps.rnc")
+ pipeline "../tools/xpl/library-to-rnc.xpl"
+}
- task "process_$name"(type: StripAmblesTask) {
- input = file("src/main/examples/$name")
- output = file("$buildDir/examples/$newname")
- }
- xinclude.dependsOn "process_$name"
+task rng(dependsOn: ["rnc"], type: JavaExec) {
+ inputs.file "build/steps.rnc"
+ outputs.file "build/steps.rng"
+ classpath = configurations.tools
+ mainClass = 'com.thaiopensource.relaxng.translate.Driver'
+ args = ["build/steps.rnc", "build/steps.rng"]
}
-// ================================================================================
-// Process the examples
+task specification(dependsOn: [ "source", "library", "rng" ]) {
+ // nop
+}
task clean() {
doFirst {
diff --git a/step-ixml/src/main/xml/specification.xml b/step-ixml/src/main/xml/specification.xml
index 4f01cca5..2d3c0db9 100644
--- a/step-ixml/src/main/xml/specification.xml
+++ b/step-ixml/src/main/xml/specification.xml
@@ -75,18 +75,20 @@ steps is assumed; for background details, see
the specified Invisible XML grammar.
-
+
-
+
If no grammar is provided on the grammar port, the grammar for
Invisible XML is assumed. If an XML or text grammar is provided it
-should be an Invisible XML grammar.
-If any other grammar format is provided, its interpretation is
-implementation-defined.
+must be an Invisible XML grammar.
+It is a dynamic error if the grammar
+provided is not a valid Invisible XML grammar.
+It is a dynamic error if more than one
+document appears on the grammar port.
The source to be processed is usually text, but
there’s nothing in principle that prevents an Invisible XML grammar
@@ -118,16 +120,19 @@ in the output.
-Example
+Examples
-The following pipeline parses an Invisible XML grammar and returns
-its XML representation:
+Several examples demonstrate features of the step.
+
+
+Parsing an Invisible XML grammar
+
+In this first example, no grammar is provided, so the pipeline parses the
+Invisible XML grammar on the source port and returns its XML
+representation:
-
-Parsing an ixml grammar
-
This would produce an XML version of the grammar:
@@ -153,32 +158,35 @@ its XML representation:
]]>
-Providing the “date” grammar allows the step to parse dates:
+
+
+Parsing a date
+
+If the grammar is provided on the grammar port, it can be
+used to parse input, the string “31 December 2021” in this case:
-
-Parsing a date with ixml
-
This would produce an XML version of the date:
31December2021]]>
+
+
+Failed parses
+
If a parse fails, the implementation must indicate
this, but it may also provide information about where the processing failed.
-
-Failing to parse a date with ixml
-
Here the output might be something like this:
-
+
month -> • M a r c h
month -> M • a r c h
@@ -187,21 +195,24 @@ month -> M • a r c h
month -> • M a y
month -> M • a y
-]]>
+]]>
-There is nothing standard about this markup
-except the ixml:state attribute with the
-value “failed
”.
+In the case of failure, Invisible XML requires that the ixml:state attribute appear on the root element
+containing the token “failed
”. It doesn’t constrain the implementation’s
+choice of the root element or the content of the document.
+
+
+
+
+Ambiguous parses
An ixml grammar may be ambiguous. In the grammar below, there are three
different possible ways to parse the input. By default, one of them is returned.
-
-Parsing an ambiguous grammar
-
This might return any one of these parses:
@@ -219,41 +230,40 @@ different possible ways to parse the input. By default, one of them is returned.
>a123]]>
All are equally correct.
+
+
+
+Ambiguous parse selection
An implementation might provide a parameter to allow the author to
select a particular parse:
-
-Selecting a particular parse
-
This might return:
a123]]>
+>a123]]>
+
+
+
+Multiple ambiguous outputs
Or a processor might provide a parameter to return all of the parses.
-
-Selecting a particular parse
-
-This might return:
+This might return three documents:
-
-a123
-a123
-a123
-]]>
+a123
+a123
+a123]]>
As before, there is nothing standardized about the results in this case.
-
+