From b45c5252295bc2ecc7adfe0db609e2b16c5fdde4 Mon Sep 17 00:00:00 2001 From: AV Date: Wed, 12 Jun 2024 15:10:35 +0330 Subject: [PATCH 1/4] Fixes the kroki-fetch-diagram attribute in NodeJS Version and also uses the disk cache file if available --- dist/browser/asciidoctor-kroki.js | 2 +- src/asciidoctor-kroki.js | 2 +- src/fetch.js | 32 ++++++++++++++++++++++--------- src/http/http-client.js | 6 ++++-- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/dist/browser/asciidoctor-kroki.js b/dist/browser/asciidoctor-kroki.js index d312624..5628167 100644 --- a/dist/browser/asciidoctor-kroki.js +++ b/dist/browser/asciidoctor-kroki.js @@ -20057,7 +20057,7 @@ function extend() { },{}],70:[function(require,module,exports){ module.exports={ "name": "asciidoctor-kroki", - "version": "0.17.0", + "version": "0.18.1", "description": "Asciidoctor extension to convert diagrams to images using Kroki", "type": "commonjs", "main": "./src/asciidoctor-kroki.js", diff --git a/src/asciidoctor-kroki.js b/src/asciidoctor-kroki.js index 27d4f82..411dddb 100644 --- a/src/asciidoctor-kroki.js +++ b/src/asciidoctor-kroki.js @@ -64,7 +64,7 @@ const createImageSrc = (doc, krokiDiagram, target, vfs, krokiClient) => { const shouldFetch = doc.isAttribute('kroki-fetch-diagram') let imageUrl if (shouldFetch && doc.getSafe() < SAFE_MODE_SECURE) { - imageUrl = require('./fetch.js').save(krokiDiagram, doc, target, vfs, krokiClient) + imageUrl = require('./fetch.js').save(krokiDiagram, doc, target, vfs, krokiClient, true) } else { imageUrl = krokiDiagram.getDiagramUri(krokiClient.getServerUrl()) } diff --git a/src/fetch.js b/src/fetch.js index 861d7e7..90af5ee 100644 --- a/src/fetch.js +++ b/src/fetch.js @@ -21,7 +21,7 @@ const getOutputDirectory = (doc) => { return baseDir } -module.exports.save = function (krokiDiagram, doc, target, vfs, krokiClient) { +module.exports.save = function (krokiDiagram, doc, target, vfs, krokiClient, use_data_url = false) { const exists = typeof vfs !== 'undefined' && typeof vfs.exists === 'function' ? vfs.exists : require('./node-fs.js').exists const read = typeof vfs !== 'undefined' && typeof vfs.read === 'function' ? vfs.read : require('./node-fs.js').read const add = typeof vfs !== 'undefined' && typeof vfs.add === 'function' ? vfs.add : require('./node-fs.js').add @@ -31,6 +31,7 @@ module.exports.save = function (krokiDiagram, doc, target, vfs, krokiClient) { const format = krokiDiagram.format const diagramName = `${target || 'diag'}-${rusha.createHash().update(diagramUrl).digest('hex')}.${format}` const filePath = path.format({ dir: imagesOutputDirectory, base: diagramName }) + let encoding let mediaType if (format === 'txt' || format === 'atxt' || format === 'utxt') { @@ -43,13 +44,26 @@ module.exports.save = function (krokiDiagram, doc, target, vfs, krokiClient) { mediaType = 'image/png' encoding = 'binary' } + // file is either (already) on the file system or we should read it from Kroki - const contents = exists(filePath) ? read(filePath, encoding) : krokiClient.getImage(krokiDiagram, encoding) - add({ - relative: imagesOutputDirectory, - basename: diagramName, - mediaType, - contents: Buffer.from(contents, encoding) - }) - return diagramName + + let contents + + if(!exists(filePath)) { + contents = read(diagramUrl) + + add({ + relative: imagesOutputDirectory, + basename: diagramName, + mediaType, + contents: Buffer.from(contents, encoding) + }) + } + + if (use_data_url) { + if (!contents) contents = read(filePath) + return 'data:' + mediaType + ";base64," + Buffer.from(contents, encoding).toString('base64') + } else { + return diagramName + } } diff --git a/src/http/http-client.js b/src/http/http-client.js index d7f50dd..76c71d1 100644 --- a/src/http/http-client.js +++ b/src/http/http-client.js @@ -4,8 +4,10 @@ const httpRequest = (XMLHttpRequest, uri, method, headers, encoding = 'utf8', bo try { const xhr = new XMLHttpRequest() xhr.open(method, uri, false) - for (const [name, value] in Object.entries(headers)) { - xhr.setRequestHeader(name, value) + if (headers) { + for (const [name, value] in Object.entries(headers)) { + xhr.setRequestHeader(name, value) + } } if (encoding === 'binary') { xhr.responseType = 'arraybuffer' From 8d1df6e991e16ce836aeea61011691b8d87a9b1c Mon Sep 17 00:00:00 2001 From: AV Date: Fri, 14 Jun 2024 06:24:21 +0330 Subject: [PATCH 2/4] Remove extra argument passing to fetch.js and return absolute file path if no dataUri is requested for diagram fetching --- src/asciidoctor-kroki.js | 2 +- src/fetch.js | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/asciidoctor-kroki.js b/src/asciidoctor-kroki.js index 411dddb..27d4f82 100644 --- a/src/asciidoctor-kroki.js +++ b/src/asciidoctor-kroki.js @@ -64,7 +64,7 @@ const createImageSrc = (doc, krokiDiagram, target, vfs, krokiClient) => { const shouldFetch = doc.isAttribute('kroki-fetch-diagram') let imageUrl if (shouldFetch && doc.getSafe() < SAFE_MODE_SECURE) { - imageUrl = require('./fetch.js').save(krokiDiagram, doc, target, vfs, krokiClient, true) + imageUrl = require('./fetch.js').save(krokiDiagram, doc, target, vfs, krokiClient) } else { imageUrl = krokiDiagram.getDiagramUri(krokiClient.getServerUrl()) } diff --git a/src/fetch.js b/src/fetch.js index 90af5ee..b65372d 100644 --- a/src/fetch.js +++ b/src/fetch.js @@ -21,12 +21,13 @@ const getOutputDirectory = (doc) => { return baseDir } -module.exports.save = function (krokiDiagram, doc, target, vfs, krokiClient, use_data_url = false) { +module.exports.save = function (krokiDiagram, doc, target, vfs, krokiClient) { const exists = typeof vfs !== 'undefined' && typeof vfs.exists === 'function' ? vfs.exists : require('./node-fs.js').exists const read = typeof vfs !== 'undefined' && typeof vfs.read === 'function' ? vfs.read : require('./node-fs.js').read const add = typeof vfs !== 'undefined' && typeof vfs.add === 'function' ? vfs.add : require('./node-fs.js').add const imagesOutputDirectory = getImagesOutputDirectory(doc) + const dataUri = doc.isAttribute('data-uri') const diagramUrl = krokiDiagram.getDiagramUri(krokiClient.getServerUrl()) const format = krokiDiagram.format const diagramName = `${target || 'diag'}-${rusha.createHash().update(diagramUrl).digest('hex')}.${format}` @@ -60,10 +61,10 @@ module.exports.save = function (krokiDiagram, doc, target, vfs, krokiClient, use }) } - if (use_data_url) { + if (dataUri) { if (!contents) contents = read(filePath) return 'data:' + mediaType + ";base64," + Buffer.from(contents, encoding).toString('base64') } else { - return diagramName + return filePath } } From c45f231dfa1a7d3ccc6a76322e88a399b2368c0f Mon Sep 17 00:00:00 2001 From: AV Date: Fri, 14 Jun 2024 06:34:35 +0330 Subject: [PATCH 3/4] Updating the test --- test/test.spec.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/test/test.spec.js b/test/test.spec.js index 72f3268..d3709ac 100644 --- a/test/test.spec.js +++ b/test/test.spec.js @@ -209,6 +209,18 @@ plantuml::test/fixtures/alice.puml[png,role=sequence] expect(html).to.contain(`https://kroki.io/plantuml/svg/${encode(macroFile)}`) expect(html).to.contain('
') }) + it('should download and embed an SVG image with kroki-fetch-diagram and kroki-data-uri', () => { + const registry = asciidoctor.Extensions.create() + asciidoctorKroki.register(registry) + const html = asciidoctor.convert(fs.readFileSync(fixturePath('fetch', 'doc.adoc')), { + attributes: { + 'kroki-data': '' + }, + extension_registry: registry, + safe: 'unsafe' + }) + expect(html).to.contain('