From 724ac024ddfc28e93d8b5dd909e722747286fa00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carsten=20Daureh=C3=B8j?= Date: Sat, 8 Feb 2020 17:24:18 +0100 Subject: [PATCH] feat: added capability to add css class and id to images + links + refactoring (#820) * method extraction * support for CSS class and id * Update package.json * Added tests for refactored render-methods * minor refactoring --- cypress/integration/sidebar/config.spec.js | 1 - ...- go to #helpersid=image-resizing.snap.png | Bin 90526 -> 0 bytes docs/helpers.md | 17 +- package-lock.json | 41 +++-- .../docsify-server-renderer/package-lock.json | 2 +- src/core/render/compiler.js | 133 ++------------- src/core/render/compiler/code.js | 10 ++ src/core/render/compiler/headline.js | 27 ++++ src/core/render/compiler/image.js | 42 +++++ src/core/render/compiler/link.js | 42 +++++ src/core/render/compiler/paragraph.js | 15 ++ src/core/render/compiler/taskList.js | 13 ++ src/core/render/compiler/taskListItem.js | 6 + test/unit/render.js | 153 +++++++++++++++++- 14 files changed, 369 insertions(+), 133 deletions(-) delete mode 100644 cypress/snapshots/sidebar/config.spec.js/sidebar.configurations -- go to #helpersid=image-resizing.snap.png create mode 100644 src/core/render/compiler/code.js create mode 100644 src/core/render/compiler/headline.js create mode 100644 src/core/render/compiler/image.js create mode 100644 src/core/render/compiler/link.js create mode 100644 src/core/render/compiler/paragraph.js create mode 100644 src/core/render/compiler/taskList.js create mode 100644 src/core/render/compiler/taskListItem.js diff --git a/cypress/integration/sidebar/config.spec.js b/cypress/integration/sidebar/config.spec.js index 507a9031e..d2ffbee68 100644 --- a/cypress/integration/sidebar/config.spec.js +++ b/cypress/integration/sidebar/config.spec.js @@ -239,7 +239,6 @@ context('sidebar.configurations', () => { 'set-target-attribute-for-link', 'disable-link', 'github-task-lists', - 'image-resizing', 'customise-id-for-headings', 'markdown-in-html-tag' ] diff --git a/cypress/snapshots/sidebar/config.spec.js/sidebar.configurations -- go to #helpersid=image-resizing.snap.png b/cypress/snapshots/sidebar/config.spec.js/sidebar.configurations -- go to #helpersid=image-resizing.snap.png deleted file mode 100644 index ababb8153caad0767e037cb7909b43c626769dad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90526 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 DV;|q6 diff --git a/docs/helpers.md b/docs/helpers.md index b047d3673..7d551c53e 100644 --- a/docs/helpers.md +++ b/docs/helpers.md @@ -81,9 +81,12 @@ You will get `link`html. Do not worry, you can still set ti - [ ] bim - [ ] lim -## Image resizing +## Image + +### Resizing ```md +![logo](https://docsify.js.org/_media/icon.svg ':size=WIDTHxHEIGHT') ![logo](https://docsify.js.org/_media/icon.svg ':size=50x100') ![logo](https://docsify.js.org/_media/icon.svg ':size=100') @@ -96,6 +99,18 @@ You will get `link`html. Do not worry, you can still set ti ![logo](https://docsify.js.org/_media/icon.svg ':size=100') ![logo](https://docsify.js.org/_media/icon.svg ':size=10%') +### Customise class + +```md +![logo](https://docsify.js.org/_media/icon.svg ':class=someCssClass') +``` + +### Customise ID + +```md +![logo](https://docsify.js.org/_media/icon.svg ':id=someCssId') +``` + ## Customise ID for headings ```md diff --git a/package-lock.json b/package-lock.json index e9ca08c28..5d959ac2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7520,7 +7520,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -7541,12 +7542,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7561,17 +7564,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -7688,7 +7694,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -7700,6 +7707,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -7714,6 +7722,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -7721,12 +7730,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -7745,6 +7756,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -7825,7 +7837,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -7837,6 +7850,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -7922,7 +7936,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -7958,6 +7973,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -7977,6 +7993,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -8020,12 +8037,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, diff --git a/packages/docsify-server-renderer/package-lock.json b/packages/docsify-server-renderer/package-lock.json index d26e84572..eae88000a 100644 --- a/packages/docsify-server-renderer/package-lock.json +++ b/packages/docsify-server-renderer/package-lock.json @@ -436,4 +436,4 @@ "integrity": "sha512-aSiJz7rGWNAQq7hjMK9ZYDuEawXupcCWgl3woQQSoDP2Oh8O4srWb/uO1PzzHIsrPEOqrjJ2sUb9FERfzuBabQ==" } } -} +} \ No newline at end of file diff --git a/src/core/render/compiler.js b/src/core/render/compiler.js index 6973de2b9..26f4cea91 100644 --- a/src/core/render/compiler.js +++ b/src/core/render/compiler.js @@ -1,14 +1,16 @@ -import marked from 'marked' -import Prism from 'prismjs' -import { helper as helperTpl, tree as treeTpl } from './tpl' +import { tree as treeTpl } from './tpl' import { genTree } from './gen-tree' import { slugify } from './slugify' import { emojify } from './emojify' import { isAbsolutePath, getPath, getParentPath } from '../router/util' import { isFn, merge, cached, isPrimitive } from '../util/core' - -// See https://github.com/PrismJS/prism/pull/1367 -import 'prismjs/components/prism-markup-templating' +import { imageCompiler } from './compiler/image' +import { highlightCodeCompiler } from './compiler/code' +import { paragraphCompiler } from './compiler/paragraph' +import { taskListCompiler } from './compiler/taskList' +import { taskListItemCompiler } from './compiler/taskListItem' +import { linkCompiler } from './compiler/link' +import marked from 'marked' const cachedLinks = {} @@ -189,7 +191,7 @@ export class Compiler { _initRenderer() { const renderer = new marked.Renderer() - const { linkTarget, linkRel, router, contentBase } = this + const { linkTarget, router, contentBase } = this const _self = this const origin = {} @@ -224,117 +226,12 @@ export class Compiler { return `${str}` } - // Highlight code - origin.code = renderer.code = function (code, lang = '') { - code = code.replace(/@DOCSIFY_QM@/g, '`') - const hl = Prism.highlight( - code, - Prism.languages[lang] || Prism.languages.markup - ) - - return `
${hl}
` - } - - origin.link = renderer.link = function (href, title = '', text) { - let attrs = '' - - const { str, config } = getAndRemoveConfig(title) - title = str - - if ( - !isAbsolutePath(href) && - !_self._matchNotCompileLink(href) && - !config.ignore - ) { - if (href === _self.config.homepage) { - href = 'README' - } - - href = router.toURL(href, null, router.getCurrentPath()) - } else { - attrs += href.indexOf('mailto:') === 0 ? '' : ` target="${linkTarget}"` - attrs += href.indexOf('mailto:') === 0 ? '' : (linkRel !== '' ? ` rel="${linkRel}"` : '') - } - - if (config.target) { - attrs += ' target=' + config.target - } - - if (config.disabled) { - attrs += ' disabled' - href = 'javascript:void(0)' - } - - if (title) { - attrs += ` title="${title}"` - } - - return `${text}` - } - - origin.paragraph = renderer.paragraph = function (text) { - let result - if (/^!>/.test(text)) { - result = helperTpl('tip', text) - } else if (/^\?>/.test(text)) { - result = helperTpl('warn', text) - } else { - result = `

${text}

` - } - - return result - } - - origin.image = renderer.image = function (href, title, text) { - let url = href - let attrs = '' - - const { str, config } = getAndRemoveConfig(title) - title = str - - if (config['no-zoom']) { - attrs += ' data-no-zoom' - } - - if (title) { - attrs += ` title="${title}"` - } - - const size = config.size - if (size) { - const sizes = size.split('x') - if (sizes[1]) { - attrs += 'width=' + sizes[0] + ' height=' + sizes[1] - } else { - attrs += 'width=' + sizes[0] - } - } - - if (!isAbsolutePath(href)) { - url = getPath(contentBase, getParentPath(router.getCurrentPath()), href) - } - - return `${text}` - } - - origin.list = renderer.list = function (body, ordered, start) { - const isTaskList = /
  • /.test(body.split('class="task-list"')[0]) - const isStartReq = start && start > 1 - const tag = ordered ? 'ol' : 'ul' - const tagAttrs = [ - (isTaskList ? 'class="task-list"' : ''), - (isStartReq ? `start="${start}"` : '') - ].join(' ').trim() - - return `<${tag} ${tagAttrs}>${body}` - } - - origin.listitem = renderer.listitem = function (text) { - const isTaskItem = /^(]*>)/.test(text) - const html = isTaskItem ? `
  • ` : `
  • ${text}
  • ` - - return html - } + origin.code = highlightCodeCompiler({ renderer }) + origin.link = linkCompiler({ renderer, router, linkTarget, compilerClass: _self }) + origin.paragraph = paragraphCompiler({ renderer }) + origin.image = imageCompiler({ renderer, contentBase, router }) + origin.list = taskListCompiler({ renderer }) + origin.listitem = taskListItemCompiler({ renderer }) renderer.origin = origin diff --git a/src/core/render/compiler/code.js b/src/core/render/compiler/code.js new file mode 100644 index 000000000..fb9d88021 --- /dev/null +++ b/src/core/render/compiler/code.js @@ -0,0 +1,10 @@ +import Prism from 'prismjs' +// See https://github.com/PrismJS/prism/pull/1367 +import 'prismjs/components/prism-markup-templating' + +export const highlightCodeCompiler = ({ renderer }) => renderer.code = function (code, lang = '') { + const langOrMarkup = Prism.languages[lang] || Prism.languages.markup + const text = Prism.highlight(code.replace(/@DOCSIFY_QM@/g, '`'), langOrMarkup) + + return `
    ${text}
    ` +} diff --git a/src/core/render/compiler/headline.js b/src/core/render/compiler/headline.js new file mode 100644 index 000000000..2a5cbb795 --- /dev/null +++ b/src/core/render/compiler/headline.js @@ -0,0 +1,27 @@ + +import { getAndRemoveConfig } from '../compiler' +import { slugify } from './slugify' + +export const headingCompiler = ({ renderer, router, _self }) => renderer.code = (text, level) => { + let { str, config } = getAndRemoveConfig(text) + const nextToc = { level, title: str } + + if (/{docsify-ignore}/g.test(str)) { + str = str.replace('{docsify-ignore}', '') + nextToc.title = str + nextToc.ignoreSubHeading = true + } + + if (/{docsify-ignore-all}/g.test(str)) { + str = str.replace('{docsify-ignore-all}', '') + nextToc.title = str + nextToc.ignoreAllSubs = true + } + + const slug = slugify(config.id || str) + const url = router.toURL(router.getCurrentPath(), { id: slug }) + nextToc.slug = url + _self.toc.push(nextToc) + + return `${str}` +} diff --git a/src/core/render/compiler/image.js b/src/core/render/compiler/image.js new file mode 100644 index 000000000..e07602dd8 --- /dev/null +++ b/src/core/render/compiler/image.js @@ -0,0 +1,42 @@ +import { getAndRemoveConfig } from '../compiler' +import { isAbsolutePath, getPath, getParentPath } from '../../router/util' + +export const imageCompiler = ({ renderer, contentBase, router }) => renderer.image = (href, title, text) => { + let url = href + let attrs = [] + + const { str, config } = getAndRemoveConfig(title) + title = str + + if (config['no-zoom']) { + attrs.push('data-no-zoom') + } + + if (title) { + attrs.push(`title="${title}"`) + } + + if (config.size) { + const [width, height] = config.size.split('x') + if (height) { + attrs.push(`width="${width}" height="${height}"`) + } else { + attrs.push(`width="${width}" height="${width}"`) + } + } + + if (config.class) { + attrs.push(`class="${config.class}"`) + } + + if (config.id) { + attrs.push(`id="${config.id}"`) + } + + if (!isAbsolutePath(href)) { + url = getPath(contentBase, getParentPath(router.getCurrentPath()), href) + } + + return `${text}` +} + diff --git a/src/core/render/compiler/link.js b/src/core/render/compiler/link.js new file mode 100644 index 000000000..53e6250cc --- /dev/null +++ b/src/core/render/compiler/link.js @@ -0,0 +1,42 @@ +import { getAndRemoveConfig } from '../compiler' +import { isAbsolutePath } from '../../router/util' + +export const linkCompiler = ({ renderer, router, linkTarget, compilerClass }) => renderer.link = (href, title = '', text) => { + let attrs = [] + const { str, config } = getAndRemoveConfig(title) + + title = str + + if (!isAbsolutePath(href) && !compilerClass._matchNotCompileLink(href) && !config.ignore) { + if (href === compilerClass.config.homepage) { + href = 'README' + } + + href = router.toURL(href, null, router.getCurrentPath()) + } else { + attrs.push(href.indexOf('mailto:') === 0 ? '' : `target="${linkTarget}"`) + } + + if (config.target) { + attrs.push(`target="${config.target}"`) + } + + if (config.disabled) { + attrs.push('disabled') + href = 'javascript:void(0)' + } + + if (config.class) { + attrs.push(`class="${config.class}"`) + } + + if (config.id) { + attrs.push(`id="${config.id}"`) + } + + if (title) { + attrs.push(`title="${title}"`) + } + + return `${text}` +} diff --git a/src/core/render/compiler/paragraph.js b/src/core/render/compiler/paragraph.js new file mode 100644 index 000000000..63ff1c111 --- /dev/null +++ b/src/core/render/compiler/paragraph.js @@ -0,0 +1,15 @@ +import { helper as helperTpl } from '../tpl' + +export const paragraphCompiler = ({ renderer }) => renderer.paragraph = text => { + let result + if (/^!>/.test(text)) { + result = helperTpl('tip', text) + } else if (/^\?>/.test(text)) { + result = helperTpl('warn', text) + } else { + result = `

    ${text}

    ` + } + + return result +} + diff --git a/src/core/render/compiler/taskList.js b/src/core/render/compiler/taskList.js new file mode 100644 index 000000000..fbf76aa9f --- /dev/null +++ b/src/core/render/compiler/taskList.js @@ -0,0 +1,13 @@ +export const taskListCompiler = ({renderer}) => renderer.list = (body, ordered, start) => { + const isTaskList = /
  • /.test(body.split('class="task-list"')[0]) + const isStartReq = start && start > 1 + const tag = ordered ? 'ol' : 'ul' + const tagAttrs = [ + (isTaskList ? 'class="task-list"' : ''), + (isStartReq ? `start="${start}"` : '') + ] + .join(' ') + .trim() + + return `<${tag} ${tagAttrs}>${body}` +} diff --git a/src/core/render/compiler/taskListItem.js b/src/core/render/compiler/taskListItem.js new file mode 100644 index 000000000..df705ce58 --- /dev/null +++ b/src/core/render/compiler/taskListItem.js @@ -0,0 +1,6 @@ +export const taskListItemCompiler = ({ renderer }) => renderer.listitem = text => { + const isTaskItem = /^(]*>)/.test(text) + const html = isTaskItem ? `
  • ` : `
  • ${text}
  • ` + + return html +} diff --git a/test/unit/render.js b/test/unit/render.js index 44b1493f8..d1afea681 100644 --- a/test/unit/render.js +++ b/test/unit/render.js @@ -40,7 +40,7 @@ describe('render', function () { - [linktext](link) - just text`) expectSameDom(output, ``) }) @@ -83,4 +83,155 @@ text `) }) }) + + describe('image', function () { + it('regular', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('![alt text](http://imageUrl)') + + expectSameDom(output, '

    alt text

    ') + }) + + it('class', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('![alt text](http://imageUrl \':class=someCssClass\')') + + expectSameDom(output, '

    alt text

    ') + }) + + it('id', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('![alt text](http://imageUrl \':id=someCssID\')') + + expectSameDom(output, '

    alt text

    ') + }) + + it('no-zoom', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('![alt text](http://imageUrl \':no-zoom\')') + + expectSameDom(output, '

    alt text

    ') + }) + + describe('size', function () { + it('width and height', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('![alt text](http://imageUrl \':size=WIDTHxHEIGHT\')') + + expectSameDom(output, '

    alt text

    ') + }) + + it('width', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('![alt text](http://imageUrl \':size=50\')') + + expectSameDom(output, '

    alt text

    ') + }) + }) + }) + + describe('heading', function () { + it('h1', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('# h1 tag') + expectSameDom(output, ` +

    + + h1 tag + +

    `) + }) + + it('h2', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('## h2 tag') + expectSameDom(output, ` +

    + + h2 tag + +

    `) + }) + + it('h3', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('### h3 tag') + expectSameDom(output, ` +

    + + h3 tag + +

    `) + }) + + it('h4', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('#### h4 tag') + expectSameDom(output, ` +

    + + h4 tag + +

    `) + }) + + it('h5', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('##### h5 tag') + expectSameDom(output, ` +
    + + h5 tag + +
    `) + }) + + it('h6', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('###### h6 tag') + expectSameDom(output, ` +
    + + h6 tag + +
    `) + }) + }) + + describe('link', function () { + it('regular', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('[alt text](http://url)') + + expectSameDom(output, '

    alt text

    ') + }) + + it('disabled', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('[alt text](http://url \':disabled\')') + + expectSameDom(output, '

    alt text

    ') + }) + + it('target', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('[alt text](http://url \':target=_self\')') + + expectSameDom(output, '

    alt text

    ') + }) + + it('class', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('[alt text](http://url \':class=someCssClass\')') + + expectSameDom(output, '

    alt text

    ') + }) + + it('id', async function () { + const { docsify } = await init() + const output = docsify.compiler.compile('[alt text](http://url \':id=someCssID\')') + + expectSameDom(output, '

    alt text

    ') + }) + }) })