From 59b0baecec4acc9a820059feae78431532728795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Desbiens?= Date: Tue, 10 Oct 2023 10:28:55 -0400 Subject: [PATCH] =?UTF-8?q?Changes=20implementing=20feedback=20from=20ISO?= =?UTF-8?q?=20publishing=20team.=20Signed-off-by:=20Fr=C3=A9d=C3=A9ric=20D?= =?UTF-8?q?esbiens=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- specification/build.gradle.kts | 93 ++++++++++++++++++ .../chapters/Sparkplug_1_Introduction.adoc | 4 +- .../Sparkplug_5_Operational_Behavior.adoc | 6 +- .../sparkplug_spec_A4_reference_file.docx | Bin 0 -> 22566 bytes 4 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 specification/src/main/asciidoc/sparkplug_spec_A4_reference_file.docx diff --git a/specification/build.gradle.kts b/specification/build.gradle.kts index 8955085f..71a510b6 100644 --- a/specification/build.gradle.kts +++ b/specification/build.gradle.kts @@ -48,6 +48,99 @@ val asciidoctorDocbook by tasks.registering(AsciidoctorTask::class) { failureLevel = Severity.WARN } +// Full version of the spec in Docbook format. Used to produce the ISO/IEC 20237 version of the spec. +// To convert from Docbook to docx, use PanDoc. +// Once installed, execute the following commands from the specification/src/main/asciidoc folder: +// copy ..\..\..\build\docs\docbook\sparkplug_spec.xml +// pandoc --from docbook --to docx --output sparkplug_specv300_A4.docx --reference-doc sparkplug_spec_A4_reference_file.docx sparkplug_spec.xml +val asciidoctorDocbookFull by tasks.registering(AsciidoctorTask::class) { + group = "spec" + + baseDirFollowsSourceDir() + sourceDirProperty.set(layout.dir(combineSpecSourceWithNormativeAppendix.map { it.destinationDir })) + dependsOn(combineSpecSourceWithNormativeAppendix) // needed as sourceDirProperty does not capture dependency + sources { + include("sparkplug_spec.adoc") + } + outputDirProperty.set(layout.buildDirectory.dir("docs/docbookA4")) + + resources { + from("src/main/asciidoc/assets/images") + into("assets/images") + } + + outputOptions { + setBackends(listOf("docbook")) + } + + options = mapOf( + "doctype" to "article", + "header_footer" to "true" + ) + attributes = mapOf( + "project-version" to version, + "imagesdir" to "assets/images", + "toc" to "auto" + ) + + failureLevel = Severity.WARN +} + + + +val asciidoctorPdfA4 by tasks.registering(AsciidoctorTask::class) { + group = "spec" + + baseDirFollowsSourceDir() + sourceDirProperty.set(layout.dir(combineSpecSourceWithNormativeAppendix.map { it.destinationDir })) + dependsOn(combineSpecSourceWithNormativeAppendix) // needed as sourceDirProperty does not capture dependency + sources { + include("sparkplug_spec.adoc") + } + outputDirProperty.set(layout.buildDirectory.dir("docs/pdf")) + + resources { + from("src/main/asciidoc/assets/images") + into("assets/images") + } + + outputOptions { + setBackends(listOf("pdf")) + } + + configure { + modules { + diagram.use() + pdf.version(project.property("plugin.asciidoctor.pdf.version")) + } + } + + options = mapOf( + "doctype" to "book", + "header_footer" to "true", + "template_engine" to "slim", + "compact" to "false" + ) + attributes = mapOf( + "source-highlighter" to "highlight.js", + "pagenums" to "true", + "numbered" to "true", + "docinfo2" to "true", + "experimental" to "false", + "linkcss" to "false", + "toc" to "true", + "project-version" to project.version, + "imagesdir" to "assets/images", + "outfilesuffix" to "A4.pdf", + "pdf-page-size" to "A4", + "pdf-themesdir" to "themes" + // Removed the Sparkplug PDF theme since ISO does not want the yellow highlighting. + ) + + failureLevel = Severity.WARN +} + + val asciidoctorPdf by tasks.registering(AsciidoctorTask::class) { group = "spec" diff --git a/specification/src/main/asciidoc/chapters/Sparkplug_1_Introduction.adoc b/specification/src/main/asciidoc/chapters/Sparkplug_1_Introduction.adoc index 82bfebe5..5ddde04f 100644 --- a/specification/src/main/asciidoc/chapters/Sparkplug_1_Introduction.adoc +++ b/specification/src/main/asciidoc/chapters/Sparkplug_1_Introduction.adoc @@ -406,8 +406,8 @@ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "S "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [BCP14]. -All normative statements in this document are highlighted in [yellow-background]*yellow text as -shown here*. +All normative statements in this document are highlighted in **bold text as +shown here**. [[introduction_leveragint_standards_and_open_source]] === Leveraging Standards and Open Source diff --git a/specification/src/main/asciidoc/chapters/Sparkplug_5_Operational_Behavior.adoc b/specification/src/main/asciidoc/chapters/Sparkplug_5_Operational_Behavior.adoc index 972b8d5e..19a66b78 100644 --- a/specification/src/main/asciidoc/chapters/Sparkplug_5_Operational_Behavior.adoc +++ b/specification/src/main/asciidoc/chapters/Sparkplug_5_Operational_Behavior.adoc @@ -85,7 +85,7 @@ message denoting that the Primary Host application is online. .Figure 4 - Host Session Establishment plantuml::{assetsdir}assets/plantuml/host-session-establishment.puml[format=svg, alt="Host Session Establishment"] -The session diagram in Figure 3 - Host Session Establishment shows a very simple topology with a +The session diagram in Figure 4 - Host Session Establishment shows a very simple topology with a single MQTT Server. The steps outlined in the session diagram are defined as follows: [arabic] @@ -256,7 +256,7 @@ MQTT 'Session Expiry Interval' to zero. .Figure 5 - Edge Node MQTT Session Establishment plantuml::{assetsdir}assets/plantuml/edge-node-mqtt-session-establishment.puml[format=svg, alt="Edge Node MQTT Session Establishment"] -The session diagram in Figure 4 - Edge Node MQTT Session Establishment shows a very simple topology +The session diagram in Figure 5 - Edge Node MQTT Session Establishment shows a very simple topology with a single MQTT Server. The steps outlined in the session diagram are defined as follows: [arabic] @@ -436,7 +436,7 @@ session diagram outlines the requirements: .Figure 6 - MQTT Device Session Establishment plantuml::{assetsdir}assets/plantuml/mqtt-device-session-establishment.puml[format=svg, alt="MQTT Device Session Establishment"] -The session diagram in Figure 5 - MQTT Device Session Establishment shows a simple topology with +The session diagram in Figure 6 - MQTT Device Session Establishment shows a simple topology with all the Sparkplug elements in place i.e. Host Application, MQTT Server(s), Sparkplug Edge Node and this element, the device element. The steps outlined in the session diagram are defined as follows: diff --git a/specification/src/main/asciidoc/sparkplug_spec_A4_reference_file.docx b/specification/src/main/asciidoc/sparkplug_spec_A4_reference_file.docx new file mode 100644 index 0000000000000000000000000000000000000000..2938ed9f474a58f3d68f46964f6b67f2d99dd9ab GIT binary patch literal 22566 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 z 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 Bc4Ghl literal 0 HcmV?d00001