From 217c8a54f34e05cf305430704c0080343805a533 Mon Sep 17 00:00:00 2001 From: madhead Date: Mon, 23 Oct 2017 00:31:33 +0300 Subject: [PATCH 1/4] Fix #35: move document output settings upper in hierarchy of calls --- src/main/kotlin/by/dev/madhead/doktor/render/DokRenderer.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/by/dev/madhead/doktor/render/DokRenderer.kt b/src/main/kotlin/by/dev/madhead/doktor/render/DokRenderer.kt index 15f162d..34ed682 100644 --- a/src/main/kotlin/by/dev/madhead/doktor/render/DokRenderer.kt +++ b/src/main/kotlin/by/dev/madhead/doktor/render/DokRenderer.kt @@ -28,6 +28,9 @@ class DokRenderer( val content = markup.render(file) val document = Jsoup.parse(content.content) + + document.outputSettings().syntax(Document.OutputSettings.Syntax.xml) + val images = processImages(document, file) return RenderedDok( @@ -41,7 +44,6 @@ class DokRenderer( val result = mutableListOf() val magic = ContentInfoUtil() - document.outputSettings().syntax(Document.OutputSettings.Syntax.xml) document .getElementsByTag("img") .forEach { From 13e26cf4723b76e8576e05bad0c6dd3bab5f3079 Mon Sep 17 00:00:00 2001 From: madhead Date: Mon, 23 Oct 2017 03:44:14 +0300 Subject: [PATCH 2/4] Fix #36: wrap generated content in div with predefined class --- .editorconfig | 4 + build.gradle.kts | 4 + gradle.properties | 2 + .../by/dev/madhead/doktor/model/Attachment.kt | 22 ++++- .../dev/madhead/doktor/render/DokRenderer.kt | 37 ++++++-- .../madhead/doktor/render/DokRendererTest.kt | 80 ++++++++++++++++++ .../DokRenderer/adoc/local_image_alt.adoc | 7 ++ .../DokRenderer/adoc/local_image_alt.yml | 22 +++++ .../DokRenderer/adoc/local_image_height.adoc | 7 ++ .../DokRenderer/adoc/local_image_height.yml | 22 +++++ .../DokRenderer/adoc/local_image_no_alt.adoc | 7 ++ .../DokRenderer/adoc/local_image_no_alt.yml | 22 +++++ .../DokRenderer/adoc/local_image_title.adoc | 8 ++ .../DokRenderer/adoc/local_image_title.yml | 25 ++++++ .../DokRenderer/adoc/local_image_width.adoc | 7 ++ .../DokRenderer/adoc/local_image_width.yml | 22 +++++ .../DokRenderer/adoc/remote_image_alt.adoc | 7 ++ .../DokRenderer/adoc/remote_image_alt.yml | 20 +++++ .../DokRenderer/adoc/remote_image_height.adoc | 7 ++ .../DokRenderer/adoc/remote_image_height.yml | 20 +++++ .../DokRenderer/adoc/remote_image_no_alt.adoc | 7 ++ .../DokRenderer/adoc/remote_image_no_alt.yml | 20 +++++ .../DokRenderer/adoc/remote_image_title.adoc | 8 ++ .../DokRenderer/adoc/remote_image_title.yml | 23 +++++ .../DokRenderer/adoc/remote_image_width.adoc | 7 ++ .../DokRenderer/adoc/remote_image_width.yml | 20 +++++ .../render/DokRenderer/adoc/zero_image.adoc | 7 ++ .../render/DokRenderer/adoc/zero_image.yml | 22 +++++ .../doktor/render/DokRenderer/image.png | Bin 0 -> 67 bytes .../render/DokRenderer/md/local_image.md | 7 ++ .../render/DokRenderer/md/local_image.yml | 17 ++++ .../render/DokRenderer/md/remote_image.md | 7 ++ .../render/DokRenderer/md/remote_image.yml | 15 ++++ .../render/DokRenderer/md/zero_image.md | 7 ++ .../render/DokRenderer/md/zero_image.yml | 17 ++++ .../doktor/render/DokRenderer/zero.png | Bin 0 -> 60 bytes 36 files changed, 527 insertions(+), 9 deletions(-) create mode 100644 src/test/kotlin/by/dev/madhead/doktor/render/DokRendererTest.kt create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_alt.adoc create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_alt.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_height.adoc create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_height.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_no_alt.adoc create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_no_alt.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title.adoc create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_width.adoc create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_width.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_alt.adoc create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_alt.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_height.adoc create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_height.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_no_alt.adoc create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_no_alt.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title.adoc create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_width.adoc create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_width.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/zero_image.adoc create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/zero_image.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/image.png create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/local_image.md create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/local_image.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/remote_image.md create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/remote_image.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/zero_image.md create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/zero_image.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/zero.png diff --git a/.editorconfig b/.editorconfig index b147759..a89336c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,7 +6,11 @@ end_of_line = lf indent_style = tab indent_size = 4 insert_final_newline = true +trim_trailing_whitespace = true [*.yml] indent_style = space indent_size = 2 + +[src/test/**/*.yml] +trim_trailing_whitespace = false diff --git a/build.gradle.kts b/build.gradle.kts index 5d8473d..9f899dd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -27,11 +27,13 @@ val fuelVersion by project val jsoupVersion by project val kotlinxHtmlJvmVersion by project val simplemagicVersion by project +val commonsCodecVersion by project val jenkinsCredentialsPluginVersion by project val jenkinsWorkflowStepsAPIPluginVersion by project val testngVersion by project val wiremockVersion by project +val mockitoVersion by project val sezpozVersion by project @@ -51,12 +53,14 @@ dependencies { compile("org.jsoup:jsoup:${jsoupVersion}") compile("org.jetbrains.kotlinx:kotlinx-html-jvm:${kotlinxHtmlJvmVersion}") compile("com.j256.simplemagic:simplemagic:${simplemagicVersion}") + compile("commons-codec:commons-codec:${commonsCodecVersion}") jenkinsPlugins("org.jenkins-ci.plugins:credentials:${jenkinsCredentialsPluginVersion}@jar") jenkinsPlugins("org.jenkins-ci.plugins.workflow:workflow-step-api:${jenkinsWorkflowStepsAPIPluginVersion}@jar") testCompile("org.testng:testng:${testngVersion}") testCompile("com.github.tomakehurst:wiremock:${wiremockVersion}") + testCompile("org.mockito:mockito-core:${mockitoVersion}") // SezPoz is used to process @hudson.Extension and other annotations kapt("net.java.sezpoz:sezpoz:${sezpozVersion}") diff --git a/gradle.properties b/gradle.properties index c15e475..b41ee14 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,6 +25,7 @@ fuelVersion=1.10.0 jsoupVersion=1.10.3 kotlinxHtmlJvmVersion=0.6.4 simplemagicVersion=1.12 +commonsCodecVersion=1.11 jenkinsCoreVersion=2.60.1 jenkinsCredentialsPluginVersion=2.1.5 jenkinsWorkflowStepsAPIPluginVersion=2.12 @@ -32,5 +33,6 @@ jenkinsWorkflowStepsAPIPluginVersion=2.12 testngVersion=6.11 jacksonVersion=2.9.0 wiremockVersion=2.8.0 +mockitoVersion=2.11.0 sezpozVersion=1.12 diff --git a/src/main/kotlin/by/dev/madhead/doktor/model/Attachment.kt b/src/main/kotlin/by/dev/madhead/doktor/model/Attachment.kt index 7e53d80..eefeb82 100644 --- a/src/main/kotlin/by/dev/madhead/doktor/model/Attachment.kt +++ b/src/main/kotlin/by/dev/madhead/doktor/model/Attachment.kt @@ -1,8 +1,28 @@ package by.dev.madhead.doktor.model import java.io.Serializable +import java.util.Arrays data class Attachment( val fileName: String, val bytes: ByteArray -) : Serializable +) : Serializable { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as Attachment + + if (fileName != other.fileName) return false + if (!Arrays.equals(bytes, other.bytes)) return false + + return true + } + + override fun hashCode(): Int { + var result = fileName.hashCode() + + result = 31 * result + Arrays.hashCode(bytes) + return result + } +} diff --git a/src/main/kotlin/by/dev/madhead/doktor/render/DokRenderer.kt b/src/main/kotlin/by/dev/madhead/doktor/render/DokRenderer.kt index 34ed682..f8c04b5 100644 --- a/src/main/kotlin/by/dev/madhead/doktor/render/DokRenderer.kt +++ b/src/main/kotlin/by/dev/madhead/doktor/render/DokRenderer.kt @@ -12,12 +12,12 @@ import hudson.model.TaskListener import hudson.remoting.VirtualChannel import jenkins.SlaveToMasterFileCallable import kotlinx.html.stream.appendHTML +import org.apache.commons.codec.digest.DigestUtils import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.jsoup.parser.Parser import java.io.File import java.net.URI -import java.util.UUID class DokRenderer( val markup: Markup, @@ -27,7 +27,7 @@ class DokRenderer( taskListener.logger.println(Messages.doktor_render_DokRenderer_rendering(markup, file)) val content = markup.render(file) - val document = Jsoup.parse(content.content) + val document = Jsoup.parseBodyFragment(wrap(content.content)) document.outputSettings().syntax(Document.OutputSettings.Syntax.xml) @@ -53,8 +53,7 @@ class DokRenderer( if (null == URI(src).host) { val bytes = file.resolveSibling(src).readBytes() val contentInfo = magic.findMatch(bytes) - - val fileName = UUID.randomUUID().toString() + if ((null == contentInfo) || (null == contentInfo.fileExtensions)) { + val fileName = DigestUtils.md5Hex(bytes) + if ((null == contentInfo) || (null == contentInfo.fileExtensions)) { ".jpeg" // why not? } else { ".${contentInfo.fileExtensions[0]}" @@ -72,8 +71,15 @@ class DokRenderer( if (!it.attr("alt").isNullOrBlank()) { acAlt = it.attr("alt") } - if (!it.attr("title").isNullOrBlank()) { - acAlt = it.attr("title") + // Special support for Asciidoc image titles + it.parents().find { + it.attr("class")?.contains("imageblock") ?: false + }?.let { + it.children().find { + it.attr("class")?.contains("title") ?: false + }?.let { + acTitle = it.html() + } } riAttachment(fileName) } @@ -90,8 +96,15 @@ class DokRenderer( if (!it.attr("alt").isNullOrBlank()) { acAlt = it.attr("alt") } - if (!it.attr("title").isNullOrBlank()) { - acAlt = it.attr("title") + // Special support for Asciidoc image titles + it.parents().find { + it.attr("class")?.contains("imageblock") ?: false + }?.let { + it.children().find { + it.attr("class")?.contains("title") ?: false + }?.let { + acTitle = it.html() + } } riUrl(src) } @@ -104,4 +117,12 @@ class DokRenderer( return result } + + private fun wrap(content: String): String { + return """ +
+ ${content} +
+ """ + } } diff --git a/src/test/kotlin/by/dev/madhead/doktor/render/DokRendererTest.kt b/src/test/kotlin/by/dev/madhead/doktor/render/DokRendererTest.kt new file mode 100644 index 0000000..b84476e --- /dev/null +++ b/src/test/kotlin/by/dev/madhead/doktor/render/DokRendererTest.kt @@ -0,0 +1,80 @@ +package by.dev.madhead.doktor.render + +import by.dev.madhead.doktor.model.Markup +import by.dev.madhead.doktor.model.RenderedDok +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory +import com.fasterxml.jackson.module.kotlin.readValue +import com.fasterxml.jackson.module.kotlin.registerKotlinModule +import com.github.tomakehurst.wiremock.WireMockServer +import hudson.model.TaskListener +import org.mockito.Mockito +import org.testng.Assert +import org.testng.annotations.DataProvider +import org.testng.annotations.Test +import java.io.File +import java.io.PrintStream + +class DokRendererTest { + val objectMapper = ObjectMapper(YAMLFactory()).registerKotlinModule() + lateinit private var wiremock: WireMockServer + + @DataProvider(name = "markdowns") + fun markdowns(): Array> { + return listOf( + "local_image", + "remote_image", + "zero_image" + ).map { + arrayOf( + File(this::class.java.getResource("/by/dev/madhead/doktor/render/DokRenderer/md/${it}.md").toURI()), + objectMapper.readValue(this::class.java.getResourceAsStream("/by/dev/madhead/doktor/render/DokRenderer/md/${it}.yml")) + ) + }.toTypedArray() + } + + @DataProvider(name = "asciidocs") + fun asciidocs(): Array> { + return listOf( + "local_image_alt", + "local_image_height", + "local_image_no_alt", + "local_image_title", + "local_image_width", + "remote_image_alt", + "remote_image_height", + "remote_image_no_alt", + "remote_image_title", + "remote_image_width", + "zero_image" + ).map { + arrayOf( + File(this::class.java.getResource("/by/dev/madhead/doktor/render/DokRenderer/adoc/${it}.adoc").toURI()), + objectMapper.readValue(this::class.java.getResourceAsStream("/by/dev/madhead/doktor/render/DokRenderer/adoc/${it}.yml")) + ) + }.toTypedArray() + } + + @Test(dataProvider = "markdowns") + fun markdown(input: File, expected: RenderedDok) { + test(Markup.MARKDOWN, input, expected) + } + + @Test(dataProvider = "asciidocs") + fun asciidoc(input: File, expected: RenderedDok) { + test(Markup.ASCIIDOC, input, expected) + } + + private fun test(markup: Markup, input: File, expected: RenderedDok) { + val taskListener = Mockito.mock(TaskListener::class.java) + val logger = Mockito.mock(PrintStream::class.java) + val renderer = DokRenderer(markup, taskListener) + + Mockito.`when`(taskListener.logger).thenReturn(logger) + + val renderedDok = renderer.invoke(input, null) + + Assert.assertEquals(renderedDok.content, expected.content) + Assert.assertEquals(renderedDok.images, expected.images) + } +} diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_alt.adoc b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_alt.adoc new file mode 100644 index 0000000..650db0b --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_alt.adoc @@ -0,0 +1,7 @@ +--- +title: local_image_alt.adoc +--- + +You can't see this image, but it exists: + +image::../image.png[Minimal PNG] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_alt.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_alt.yml new file mode 100644 index 0000000..4ca2039 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_alt.yml @@ -0,0 +1,22 @@ +filePath: Not checked +content: + markup: ASCIIDOC + content: |- +
+
+

You can’t see this image, but it exists:

+
+
+
+ + + +
+
+
+ frontMatter: + title: local_image_alt.adoc + labels: [] +images: + - fileName: 93ca32a536da1698ea979f183679af29.png + bytes: !!binary iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg== diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_height.adoc b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_height.adoc new file mode 100644 index 0000000..1964830 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_height.adoc @@ -0,0 +1,7 @@ +--- +title: local_image_height.adoc +--- + +You can't see this image, but it exists: + +image::../image.png[Minimal PNG, 200, 200] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_height.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_height.yml new file mode 100644 index 0000000..d225b10 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_height.yml @@ -0,0 +1,22 @@ +filePath: Not checked +content: + markup: ASCIIDOC + content: |- +
+
+

You can’t see this image, but it exists:

+
+
+
+ + + +
+
+
+ frontMatter: + title: local_image_height.adoc + labels: [] +images: + - fileName: 93ca32a536da1698ea979f183679af29.png + bytes: !!binary iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg== diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_no_alt.adoc b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_no_alt.adoc new file mode 100644 index 0000000..2d0081f --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_no_alt.adoc @@ -0,0 +1,7 @@ +--- +title: local_image_no_alt.adoc +--- + +You can't see this image, but it exists and has no alt: + +image::../image.png[] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_no_alt.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_no_alt.yml new file mode 100644 index 0000000..e481ddb --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_no_alt.yml @@ -0,0 +1,22 @@ +filePath: Not checked +content: + markup: ASCIIDOC + content: |- +
+
+

You can’t see this image, but it exists and has no alt:

+
+
+
+ + + +
+
+
+ frontMatter: + title: local_image_no_alt.adoc + labels: [] +images: + - fileName: 93ca32a536da1698ea979f183679af29.png + bytes: !!binary iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg== diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title.adoc b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title.adoc new file mode 100644 index 0000000..85620ea --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title.adoc @@ -0,0 +1,8 @@ +--- +title: local_image_title.adoc +--- + +You can't see this image, but it exists and has title: + +.Minimal PNG +image::../image.png[Minimal PNG] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title.yml new file mode 100644 index 0000000..4b168ef --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title.yml @@ -0,0 +1,25 @@ +filePath: Not checked +content: + markup: ASCIIDOC + content: |- +
+
+

You can’t see this image, but it exists and has title:

+
+
+
+ + + +
+
+ Figure 1. Minimal PNG +
+
+
+ frontMatter: + title: local_image_title.adoc + labels: [] +images: + - fileName: 93ca32a536da1698ea979f183679af29.png + bytes: !!binary iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg== diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_width.adoc b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_width.adoc new file mode 100644 index 0000000..249b583 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_width.adoc @@ -0,0 +1,7 @@ +--- +title: local_image_width.adoc +--- + +You can't see this image, but it exists: + +image::../image.png[Minimal PNG, 200] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_width.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_width.yml new file mode 100644 index 0000000..5975384 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_width.yml @@ -0,0 +1,22 @@ +filePath: Not checked +content: + markup: ASCIIDOC + content: |- +
+
+

You can’t see this image, but it exists:

+
+
+
+ + + +
+
+
+ frontMatter: + title: local_image_width.adoc + labels: [] +images: + - fileName: 93ca32a536da1698ea979f183679af29.png + bytes: !!binary iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg== diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_alt.adoc b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_alt.adoc new file mode 100644 index 0000000..3ef166c --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_alt.adoc @@ -0,0 +1,7 @@ +--- +title: remote_image_alt.adoc +--- + +You can't see this image, and it does not exist: + +image::http://localhost:8080/image.png[Unexisting PNG] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_alt.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_alt.yml new file mode 100644 index 0000000..6dfe148 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_alt.yml @@ -0,0 +1,20 @@ +filePath: Not checked +content: + markup: ASCIIDOC + content: |- +
+
+

You can’t see this image, and it does not exist:

+
+
+
+ + + +
+
+
+ frontMatter: + title: remote_image_alt.adoc + labels: [] +images: [] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_height.adoc b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_height.adoc new file mode 100644 index 0000000..6271f20 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_height.adoc @@ -0,0 +1,7 @@ +--- +title: remote_image_height.adoc +--- + +You can't see this image, and it does not exist: + +image::http://localhost:8080/image.png[Unexisting PNG, 200, 200] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_height.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_height.yml new file mode 100644 index 0000000..b914e7a --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_height.yml @@ -0,0 +1,20 @@ +filePath: Not checked +content: + markup: ASCIIDOC + content: |- +
+
+

You can’t see this image, and it does not exist:

+
+
+
+ + + +
+
+
+ frontMatter: + title: remote_image_height.adoc + labels: [] +images: [] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_no_alt.adoc b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_no_alt.adoc new file mode 100644 index 0000000..aa5c376 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_no_alt.adoc @@ -0,0 +1,7 @@ +--- +title: remote_image_no_alt.adoc +--- + +You can't see this image, and it does not exist: + +image::http://localhost:8080/image.png[] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_no_alt.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_no_alt.yml new file mode 100644 index 0000000..cfa5793 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_no_alt.yml @@ -0,0 +1,20 @@ +filePath: Not checked +content: + markup: ASCIIDOC + content: |- +
+
+

You can’t see this image, and it does not exist:

+
+
+
+ + + +
+
+
+ frontMatter: + title: remote_image_no_alt.adoc + labels: [] +images: [] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title.adoc b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title.adoc new file mode 100644 index 0000000..ee1cee1 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title.adoc @@ -0,0 +1,8 @@ +--- +title: remote_image_title.adoc +--- + +You can't see this image, and it does not exist: + +.Unexisting PNG +image::http://localhost:8080/image.png[Unexisting PNG] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title.yml new file mode 100644 index 0000000..8ed8c07 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title.yml @@ -0,0 +1,23 @@ +filePath: Not checked +content: + markup: ASCIIDOC + content: |- +
+
+

You can’t see this image, and it does not exist:

+
+
+
+ + + +
+
+ Figure 1. Unexisting PNG +
+
+
+ frontMatter: + title: remote_image_title.adoc + labels: [] +images: [] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_width.adoc b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_width.adoc new file mode 100644 index 0000000..b7bcd32 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_width.adoc @@ -0,0 +1,7 @@ +--- +title: remote_image_width.adoc +--- + +You can't see this image, and it does not exist: + +image::http://localhost:8080/image.png[Unexisting PNG, 200] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_width.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_width.yml new file mode 100644 index 0000000..8079b54 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_width.yml @@ -0,0 +1,20 @@ +filePath: Not checked +content: + markup: ASCIIDOC + content: |- +
+
+

You can’t see this image, and it does not exist:

+
+
+
+ + + +
+
+
+ frontMatter: + title: remote_image_width.adoc + labels: [] +images: [] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/zero_image.adoc b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/zero_image.adoc new file mode 100644 index 0000000..ad89b8f --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/zero_image.adoc @@ -0,0 +1,7 @@ +--- +title: zero_image.adoc +--- + +You can't see this image, it is broken: + +image::../zero.png[Zeros] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/zero_image.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/zero_image.yml new file mode 100644 index 0000000..f161c99 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/zero_image.yml @@ -0,0 +1,22 @@ +filePath: Not checked +content: + markup: ASCIIDOC + content: |- +
+
+

You can’t see this image, it is broken:

+
+
+
+ + + +
+
+
+ frontMatter: + title: zero_image.adoc + labels: [] +images: + - fileName: a302a771ee0e3127b8950f0a67d17e49.jpeg + bytes: !!binary AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/image.png b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/image.png new file mode 100644 index 0000000000000000000000000000000000000000..91a99b94e23a00cc8133f22e3fe2a0b48a015808 GIT binary patch literal 67 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blE>9Q7kcv6UAQ@H$MqV!6EkIEQ MPgg&ebxsLQ07X&@0{{R3 literal 0 HcmV?d00001 diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/local_image.md b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/local_image.md new file mode 100644 index 0000000..cb43636 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/local_image.md @@ -0,0 +1,7 @@ +--- +title: local_image.md +--- + +You can't see this image, but it exists: + +![Minimal PNG](../image.png "Minimal PNG") diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/local_image.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/local_image.yml new file mode 100644 index 0000000..0afc406 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/local_image.yml @@ -0,0 +1,17 @@ +filePath: Not checked +content: + markup: MARKDOWN + content: |- +
+

You can't see this image, but it exists:

+

+ + +

+
+ frontMatter: + title: local_image.md + labels: [] +images: + - fileName: 93ca32a536da1698ea979f183679af29.png + bytes: !!binary iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg== diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/remote_image.md b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/remote_image.md new file mode 100644 index 0000000..69b7d2e --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/remote_image.md @@ -0,0 +1,7 @@ +--- +title: remote_image.md +--- + +You can't see this image, and it does not exist: + +![Minimal PNG](http://localhost:8080/image.png "Minimal PNG") diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/remote_image.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/remote_image.yml new file mode 100644 index 0000000..eb3f59e --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/remote_image.yml @@ -0,0 +1,15 @@ +filePath: Not checked +content: + markup: MARKDOWN + content: |- +
+

You can't see this image, and it does not exist:

+

+ + +

+
+ frontMatter: + title: remote_image.md + labels: [] +images: [] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/zero_image.md b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/zero_image.md new file mode 100644 index 0000000..cca95b6 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/zero_image.md @@ -0,0 +1,7 @@ +--- +title: zero_image.md +--- + +You can't see this image, it is broken: + +![Zeros](../zero.png "Zeros") diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/zero_image.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/zero_image.yml new file mode 100644 index 0000000..b54bdac --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/md/zero_image.yml @@ -0,0 +1,17 @@ +filePath: Not checked +content: + markup: MARKDOWN + content: |- +
+

You can't see this image, it is broken:

+

+ + +

+
+ frontMatter: + title: zero_image.md + labels: [] +images: + - fileName: a302a771ee0e3127b8950f0a67d17e49.jpeg + bytes: !!binary AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/zero.png b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/zero.png new file mode 100644 index 0000000000000000000000000000000000000000..86656a24bbf098e3d7eda7dd5211bda134c10f72 GIT binary patch literal 60 LcmZQzARhn#06YKz literal 0 HcmV?d00001 From be63e738e98d5878c3ba35874655f356dd83aa93 Mon Sep 17 00:00:00 2001 From: madhead Date: Tue, 24 Oct 2017 16:44:57 +0300 Subject: [PATCH 3/4] Fix specials in image titles --- .../dev/madhead/doktor/render/DokRenderer.kt | 4 +-- .../madhead/doktor/render/DokRendererTest.kt | 2 ++ .../adoc/local_image_title_specials.adoc | 8 ++++++ .../adoc/local_image_title_specials.yml | 26 +++++++++++++++++++ .../adoc/remote_image_title_specials.adoc | 8 ++++++ .../adoc/remote_image_title_specials.yml | 24 +++++++++++++++++ .../doktor/render/images/page/han_solo.adoc | 4 +-- .../doktor/render/images/page/han_solo.md | 4 +-- 8 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title_specials.adoc create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title_specials.yml create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title_specials.adoc create mode 100644 src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title_specials.yml diff --git a/src/main/kotlin/by/dev/madhead/doktor/render/DokRenderer.kt b/src/main/kotlin/by/dev/madhead/doktor/render/DokRenderer.kt index f8c04b5..39dc6d2 100644 --- a/src/main/kotlin/by/dev/madhead/doktor/render/DokRenderer.kt +++ b/src/main/kotlin/by/dev/madhead/doktor/render/DokRenderer.kt @@ -78,7 +78,7 @@ class DokRenderer( it.children().find { it.attr("class")?.contains("title") ?: false }?.let { - acTitle = it.html() + acTitle = it.text() } } riAttachment(fileName) @@ -103,7 +103,7 @@ class DokRenderer( it.children().find { it.attr("class")?.contains("title") ?: false }?.let { - acTitle = it.html() + acTitle = it.text() } } riUrl(src) diff --git a/src/test/kotlin/by/dev/madhead/doktor/render/DokRendererTest.kt b/src/test/kotlin/by/dev/madhead/doktor/render/DokRendererTest.kt index b84476e..9fd8f86 100644 --- a/src/test/kotlin/by/dev/madhead/doktor/render/DokRendererTest.kt +++ b/src/test/kotlin/by/dev/madhead/doktor/render/DokRendererTest.kt @@ -40,11 +40,13 @@ class DokRendererTest { "local_image_height", "local_image_no_alt", "local_image_title", + "local_image_title_specials", "local_image_width", "remote_image_alt", "remote_image_height", "remote_image_no_alt", "remote_image_title", + "remote_image_title_specials", "remote_image_width", "zero_image" ).map { diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title_specials.adoc b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title_specials.adoc new file mode 100644 index 0000000..1356586 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title_specials.adoc @@ -0,0 +1,8 @@ +--- +title: local_image_title_specials.adoc +--- + +You can't see this image, but it exists and has title: + +.This title contains https://en.wikipedia.org/wiki/Hyperlink[links]! +image::../image.png[Minimal PNG] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title_specials.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title_specials.yml new file mode 100644 index 0000000..0cb2a90 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/local_image_title_specials.yml @@ -0,0 +1,26 @@ +filePath: Not checked +content: + markup: ASCIIDOC + content: |- +
+
+

You can’t see this image, but it exists and has title:

+
+
+
+ + + +
+
+ Figure 1. This title contains + links! +
+
+
+ frontMatter: + title: local_image_title_specials.adoc + labels: [] +images: + - fileName: 93ca32a536da1698ea979f183679af29.png + bytes: !!binary iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg== diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title_specials.adoc b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title_specials.adoc new file mode 100644 index 0000000..1a5e462 --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title_specials.adoc @@ -0,0 +1,8 @@ +--- +title: remote_image_title_specials.adoc +--- + +You can't see this image, and it does not exist: + +.This title contains https://en.wikipedia.org/wiki/Hyperlink[links]! +image::http://localhost:8080/image.png[Unexisting PNG] diff --git a/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title_specials.yml b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title_specials.yml new file mode 100644 index 0000000..12d705d --- /dev/null +++ b/src/test/resources/by/dev/madhead/doktor/render/DokRenderer/adoc/remote_image_title_specials.yml @@ -0,0 +1,24 @@ +filePath: Not checked +content: + markup: ASCIIDOC + content: |- +
+
+

You can’t see this image, and it does not exist:

+
+
+
+ + + +
+
+ Figure 1. This title contains + links! +
+
+
+ frontMatter: + title: remote_image_title_specials.adoc + labels: [] +images: [] diff --git a/src/test/resources/by/dev/madhead/doktor/render/images/page/han_solo.adoc b/src/test/resources/by/dev/madhead/doktor/render/images/page/han_solo.adoc index eb41d6b..fcbd251 100644 --- a/src/test/resources/by/dev/madhead/doktor/render/images/page/han_solo.adoc +++ b/src/test/resources/by/dev/madhead/doktor/render/images/page/han_solo.adoc @@ -21,8 +21,8 @@ He was the son-in-law of fallen http://starwars.wikia.com/wiki/Jedi_Knight[Jedi ==== Early life -Han Solo was born on the planet Corellia during the waning years of the Galactic Republic. -He was orphaned at a young age, and turned to a life of crime as a thief in order to survive the perils of the galaxy. +Han Solo was [underline]#born# on the [overline]#planet# Corellia during the [line-through]#waning# years of the Galactic Republic. +[aqua]#He# [black]#was# [blue]#orphaned# [fuchsia]#at# [gray]#a# [green]#young# [lime]#age#, [maroon]#and# [navy]#turned# [olive]#to# [orange]#a# [purple]#life# [red]#of# [silver]#crime# [teal]#as# [white]#a# [yellow]#thief# in order to survive the perils of the galaxy. Solo, at some point, acquired a starship and became an exceptional pilot. Solo began working outside of the Galactic Empire's laws, beginning a career in illegal smuggling. Solo eventually met the Wookiee Chewbacca, whom he saved from imprisonment. diff --git a/src/test/resources/by/dev/madhead/doktor/render/images/page/han_solo.md b/src/test/resources/by/dev/madhead/doktor/render/images/page/han_solo.md index 547ac55..d07b510 100644 --- a/src/test/resources/by/dev/madhead/doktor/render/images/page/han_solo.md +++ b/src/test/resources/by/dev/madhead/doktor/render/images/page/han_solo.md @@ -20,8 +20,8 @@ He was the son-in-law of fallen [Jedi Knight](http://starwars.wikia.com/wiki/Jed #### Early life -Han Solo was born on the planet Corellia during the waning years of the Galactic Republic. -He was orphaned at a young age, and turned to a life of crime as a thief in order to survive the perils of the galaxy. +Han Solo was __born__ on the planet Corellia during the ~~waning~~ years of the Galactic Republic. +He was orphaned at a young age, and turned to a life of crime as a thief in order to survive the perils of the galaxy. Solo, at some point, acquired a starship and became an exceptional pilot. Solo began working outside of the Galactic Empire's laws, beginning a career in illegal smuggling. Solo eventually met the Wookiee Chewbacca, whom he saved from imprisonment. From 8eb6d8a8cfb6ea8598bea5d4f68195ffbc0ebf13 Mon Sep 17 00:00:00 2001 From: madhead Date: Tue, 24 Oct 2017 18:34:43 +0300 Subject: [PATCH 4/4] Add a few lines about custom stylesheets / selectors --- README.adoc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.adoc b/README.adoc index 6c6e30c..7157fb6 100644 --- a/README.adoc +++ b/README.adoc @@ -147,6 +147,11 @@ Requires https://mermaidjs.github.io[mermaid] (version prior to `7.x`) and http: - http://plantuml.com[`plantuml`] No additional tools needed. +==== Custom stylesheets + +Confluence allows space admins to provide custom stylesheets that override globals. +Doktor supports styling generated content by wrapping it in a `
`, so you can use `.doctor` prefix in your selector to stylize content. + === Configure Confluence servers As you might suspect, Confluence REST API requires authentication.