umberto 7.0.2 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -1799
- package/LICENSE.md +44 -5
- package/README.md +194 -9
- package/package.json +4 -8
- package/scripts/filter/after-post-render/gloria/append-copy-heading-buttons.js +99 -0
- package/scripts/filter/after-post-render/gloria/apply-design-doc-classes.js +145 -0
- package/scripts/filter/after-post-render/gloria/wrap-table-into-wrappers.js +30 -0
- package/scripts/filter/after-post-render/img-linker.js +1 -1
- package/scripts/filter/after-post-render/insert-error-codes.js +1 -1
- package/scripts/filter/after-post-render/linker.js +1 -1
- package/scripts/filter/after-post-render/snippets.js +5 -1
- package/scripts/filter/after-render/gloria/inline-svg.js +14 -0
- package/scripts/filter/after-render/gloria/spritesheet-svg.js +14 -0
- package/scripts/filter/before-post-render/add-project-info-to-page.js +1 -1
- package/scripts/filter/before-post-render/code-switcher.js +4 -0
- package/scripts/filter/before-post-render/execute-and-insert-function-results.js +3 -1
- package/scripts/filter/before-post-render/gloria/add-breadcrumbs-data-to-page.js +269 -0
- package/scripts/filter/before-post-render/gloria/prerender-admonitions.js +27 -0
- package/scripts/filter/before-post-render/gloria/prerender-xml-pug-components.js +339 -0
- package/scripts/filter/before-post-render/gloria/render-post-render-pug-components.js +94 -0
- package/scripts/filter/before-post-render/set-layout.js +4 -2
- package/scripts/helper/parse-href.js +28 -0
- package/scripts/helper/u-capitalize.js +13 -0
- package/scripts/helper/u-random-id.js +16 -0
- package/scripts/helper/u-remove-indentation.js +13 -0
- package/scripts/helper/u-toc.js +2 -63
- package/scripts/utils/add-indention.js +16 -0
- package/scripts/utils/capitalize.js +17 -0
- package/scripts/utils/concat-url-parts.js +19 -0
- package/scripts/utils/decode-html-entities.js +25 -0
- package/scripts/utils/drop-init-slash.js +14 -0
- package/scripts/utils/drop-trailing-slash.js +14 -0
- package/scripts/utils/drop-url-protocol.js +10 -0
- package/scripts/utils/inline-svg.js +152 -0
- package/scripts/utils/measure-call.js +16 -0
- package/scripts/utils/parse-href.js +37 -0
- package/scripts/utils/parseicontag.js +1 -1
- package/scripts/utils/parselinks.js +27 -6
- package/scripts/utils/parser-cursor.js +280 -0
- package/scripts/utils/pipe.js +17 -0
- package/scripts/utils/pug-renderer/create-prerender-pug-template.js +172 -0
- package/scripts/utils/pug-renderer/render-pug-component.js +73 -0
- package/scripts/utils/pug-to-xml-binding/parser/walk-xml-tree.js +150 -0
- package/scripts/utils/pug-to-xml-binding/parser/xml-components-parser.js +414 -0
- package/scripts/utils/pug-to-xml-binding/render-xml-pug-components-in-markdown.js +193 -0
- package/scripts/utils/pug-to-xml-binding/transform-xml-tree-to-pug.js +144 -0
- package/scripts/utils/random-id.js +67 -0
- package/scripts/utils/remove-indentation.js +48 -0
- package/scripts/utils/spritesheet-svg.js +183 -0
- package/scripts/utils/toc.js +71 -0
- package/scripts/utils/transform-markdown-admonitions.js +98 -0
- package/scripts/utils/uniq-by-last.js +32 -0
- package/src/api-builder/api-builder.js +49 -18
- package/src/api-builder/classes/description-parser.js +61 -10
- package/src/api-builder/classes/doc-data-factory.js +2 -2
- package/src/helpers/github-url.js +1 -1
- package/src/helpers/templates/scripts/default.js +1 -1
- package/src/helpers/templates/scripts/group.js +1 -1
- package/src/hexo/filter/project-locals.js +9 -0
- package/src/hexo/get-repo-urls.js +1 -1
- package/src/hexo/project-globals.js +4 -0
- package/src/hexo-manager.js +7 -2
- package/src/sdk-builder/sdk-builder.js +4 -4
- package/src/tasks/build-api-docs.js +5 -5
- package/src/tasks/build-documentation.js +45 -22
- package/src/tasks/cache-files.js +2 -2
- package/src/tasks/compile-sass.js +12 -0
- package/src/tasks/copy-assets.js +4 -0
- package/src/tasks/copy-project-icons.js +1 -1
- package/src/tasks/get-extra-files.js +1 -1
- package/src/tasks/get-project-config.js +1 -1
- package/src/tasks/overwrite-api-guides.js +1 -1
- package/themes/umberto/layout/gloria/404.pug +25 -16
- package/themes/umberto/layout/gloria/_api-docs/_header/_style.scss +31 -0
- package/themes/umberto/layout/gloria/_api-docs/_header/index.pug +50 -0
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_api-see-source.pug +1 -4
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_api-tree-item.pug +34 -26
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_class-item.pug +20 -13
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_dev-names.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_error.pug +10 -5
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_hierarchy-list.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_link-or-text.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_method.pug +45 -39
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_property.pug +26 -20
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_related.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_toc-list-item.pug +11 -0
- package/themes/umberto/layout/gloria/_api-docs/_partial/api-subheader.pug +0 -11
- package/themes/umberto/layout/gloria/_api-docs/_partial/api-toc.pug +33 -0
- package/themes/umberto/layout/gloria/_api-docs/_partial/classes.pug +5 -4
- package/themes/umberto/layout/gloria/_api-docs/_partial/config-options.pug +5 -4
- package/themes/umberto/layout/gloria/_api-docs/_partial/constants.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_partial/description.pug +2 -2
- package/themes/umberto/layout/gloria/_api-docs/_partial/events.pug +5 -4
- package/themes/umberto/layout/gloria/_api-docs/_partial/functions.pug +5 -4
- package/themes/umberto/layout/gloria/_api-docs/_partial/interfaces.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_partial/methods.pug +14 -13
- package/themes/umberto/layout/gloria/_api-docs/_partial/namespaces.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_partial/navtree.pug +4 -11
- package/themes/umberto/layout/gloria/_api-docs/_partial/properties.pug +14 -13
- package/themes/umberto/layout/gloria/_api-docs/_partial/type-parameters.pug +15 -12
- package/themes/umberto/layout/gloria/_api-docs/_partial/typedefs.pug +5 -4
- package/themes/umberto/layout/gloria/_api-docs/_subheader/_style.scss +5 -0
- package/themes/umberto/layout/gloria/_api-docs/_subheader/index.pug +10 -0
- package/themes/umberto/layout/gloria/_api-docs/_toc/_style.scss +227 -0
- package/themes/umberto/layout/gloria/_api-docs/_toc/index.pug +11 -0
- package/themes/umberto/layout/gloria/_api-docs/api-base.pug +24 -24
- package/themes/umberto/layout/gloria/_api-docs/class.pug +4 -4
- package/themes/umberto/layout/gloria/_api-docs/errors.pug +3 -3
- package/themes/umberto/layout/gloria/_api-docs/index.pug +3 -0
- package/themes/umberto/layout/gloria/_api-docs/interface.pug +4 -4
- package/themes/umberto/layout/gloria/_api-docs/mixin.pug +4 -4
- package/themes/umberto/layout/gloria/_api-docs/module.pug +4 -4
- package/themes/umberto/layout/gloria/_api-docs/namespace.pug +4 -4
- package/themes/umberto/layout/gloria/_api-docs/typedef.pug +22 -22
- package/themes/umberto/layout/gloria/_components/badge/_style.scss +27 -0
- package/themes/umberto/layout/gloria/_components/badge/index.pug +30 -0
- package/themes/umberto/layout/gloria/_components/banner/_style.scss +133 -0
- package/themes/umberto/layout/gloria/_components/banner/index.pug +3 -0
- package/themes/umberto/layout/gloria/_components/button/_style.scss +183 -0
- package/themes/umberto/layout/gloria/_components/button/index.pug +140 -0
- package/themes/umberto/layout/gloria/_components/callout/_style.scss +56 -0
- package/themes/umberto/layout/gloria/_components/callout/index.pug +87 -0
- package/themes/umberto/layout/gloria/_components/card/_style.scss +101 -0
- package/themes/umberto/layout/gloria/_components/card/index.pug +131 -0
- package/themes/umberto/layout/gloria/_components/card-learn-more-links/_style.scss +9 -0
- package/themes/umberto/layout/gloria/_components/card-learn-more-links/index.pug +56 -0
- package/themes/umberto/layout/gloria/_components/checkbox/_style.scss +117 -0
- package/themes/umberto/layout/gloria/_components/checkbox/index.pug +35 -0
- package/themes/umberto/layout/gloria/_components/cke5-code-switcher/index.pug +39 -0
- package/themes/umberto/layout/gloria/_components/code-block/_style.scss +111 -0
- package/themes/umberto/layout/gloria/_components/code-block/index.pug +67 -0
- package/themes/umberto/layout/gloria/_components/code-switcher/_style.scss +41 -0
- package/themes/umberto/layout/gloria/_components/code-switcher/index.pug +31 -0
- package/themes/umberto/layout/gloria/_components/columns/_style.scss +54 -0
- package/themes/umberto/layout/gloria/_components/columns/index.pug +30 -0
- package/themes/umberto/layout/gloria/_components/divider/_style.scss +6 -0
- package/themes/umberto/layout/gloria/_components/divider/index.pug +13 -0
- package/themes/umberto/layout/gloria/_components/dropdown/_style.scss +88 -0
- package/themes/umberto/layout/gloria/_components/dropdown/index.pug +77 -0
- package/themes/umberto/layout/gloria/_components/fake-devtools/_style.scss +233 -0
- package/themes/umberto/layout/gloria/_components/fake-devtools/index.pug +27 -0
- package/themes/umberto/layout/gloria/_components/heading-badge/index.pug +17 -0
- package/themes/umberto/layout/gloria/_components/heading-link/_style.scss +47 -0
- package/themes/umberto/layout/gloria/_components/heading-link/index.pug +26 -0
- package/themes/umberto/layout/gloria/_components/icon/_style.scss +12 -0
- package/themes/umberto/layout/gloria/_components/icon/index.pug +75 -0
- package/themes/umberto/layout/gloria/_components/icon-message/_style.scss +13 -0
- package/themes/umberto/layout/gloria/_components/icon-message/index.pug +17 -0
- package/themes/umberto/layout/gloria/_components/iframe/_style.scss +10 -0
- package/themes/umberto/layout/gloria/_components/iframe/index.pug +22 -0
- package/themes/umberto/layout/gloria/_components/img/index.pug +17 -0
- package/themes/umberto/layout/gloria/_components/index.pug +31 -0
- package/themes/umberto/layout/gloria/_components/input/_style.scss +82 -0
- package/themes/umberto/layout/gloria/_components/input/index.pug +34 -0
- package/themes/umberto/layout/gloria/_components/json-ld/index.pug +3 -0
- package/themes/umberto/layout/gloria/_components/keyboard-shortcut/_style.scss +49 -0
- package/themes/umberto/layout/gloria/_components/keyboard-shortcut/index.pug +23 -0
- package/themes/umberto/layout/gloria/_components/menu-dropdown/_style.scss +27 -0
- package/themes/umberto/layout/gloria/_components/menu-dropdown/index.pug +40 -0
- package/themes/umberto/layout/gloria/_components/mobile-overlay/_style.scss +70 -0
- package/themes/umberto/layout/gloria/_components/mobile-overlay/index.pug +37 -0
- package/themes/umberto/layout/gloria/_components/nav-tree/_style.scss +104 -0
- package/themes/umberto/layout/gloria/_components/nav-tree/index.pug +6 -0
- package/themes/umberto/layout/gloria/_components/nav-tree/nav-tree-item.pug +23 -0
- package/themes/umberto/layout/gloria/{_mixin → _components/nav-tree}/nav-tree-level.pug +31 -11
- package/themes/umberto/layout/gloria/_components/skeleton/_style.scss +22 -0
- package/themes/umberto/layout/gloria/_components/skeleton/index.pug +16 -0
- package/themes/umberto/layout/gloria/_components/spacer/_style.scss +9 -0
- package/themes/umberto/layout/gloria/_components/spacer/index.pug +19 -0
- package/themes/umberto/layout/gloria/_components/svg/index.pug +70 -0
- package/themes/umberto/layout/gloria/_components/tabs/_style.scss +80 -0
- package/themes/umberto/layout/gloria/_components/tabs/index.pug +81 -0
- package/themes/umberto/layout/gloria/_components/tag/_style.scss +79 -0
- package/themes/umberto/layout/gloria/_components/tag/index.pug +17 -0
- package/themes/umberto/layout/gloria/_components/tooltip-popover/_style.scss +194 -0
- package/themes/umberto/layout/gloria/_components/tooltip-popover/index.pug +38 -0
- package/themes/umberto/layout/gloria/_head/head-preloads.pug +32 -0
- package/themes/umberto/layout/gloria/{_partial → _head}/head.pug +8 -4
- package/themes/umberto/layout/gloria/_head/index.pug +1 -0
- package/themes/umberto/layout/gloria/_modules/algolia-search/_style.scss +202 -0
- package/themes/umberto/layout/gloria/_modules/algolia-search/_third-party.scss +1 -0
- package/themes/umberto/layout/gloria/_modules/algolia-search/index.pug +38 -0
- package/themes/umberto/layout/gloria/_modules/breadcrumbs/_style.scss +68 -0
- package/themes/umberto/layout/gloria/_modules/breadcrumbs/index.pug +18 -0
- package/themes/umberto/layout/gloria/_modules/footer/_style.scss +40 -0
- package/themes/umberto/layout/gloria/_modules/footer/index.pug +87 -0
- package/themes/umberto/layout/gloria/_modules/header/_style.scss +181 -0
- package/themes/umberto/layout/gloria/_modules/header/index.pug +70 -0
- package/themes/umberto/layout/gloria/_modules/header/nav-link.pug +19 -0
- package/themes/umberto/layout/gloria/_modules/header/nav-links.pug +11 -0
- package/themes/umberto/layout/gloria/_modules/header/nav-project-select-dropdown.pug +16 -0
- package/themes/umberto/layout/gloria/_modules/header/nav-suffix-links.pug +20 -0
- package/themes/umberto/layout/gloria/_modules/header-bar/_style.scss +56 -0
- package/themes/umberto/layout/gloria/_modules/header-bar/index.pug +40 -0
- package/themes/umberto/layout/gloria/_modules/header-legacy-warning/index.pug +11 -0
- package/themes/umberto/layout/gloria/_modules/header-nightly-info/index.pug +20 -0
- package/themes/umberto/layout/gloria/_modules/header-promobar/index.pug +18 -0
- package/themes/umberto/layout/gloria/_modules/index.pug +14 -0
- package/themes/umberto/layout/gloria/_modules/main/_style.scss +54 -0
- package/themes/umberto/layout/gloria/_modules/main/index.pug +10 -0
- package/themes/umberto/layout/gloria/_modules/mobile-nav/_style.scss +106 -0
- package/themes/umberto/layout/gloria/_modules/mobile-nav/index.pug +121 -0
- package/themes/umberto/layout/gloria/_modules/mobile-nav/slide-parts.pug +67 -0
- package/themes/umberto/layout/gloria/_modules/not-found/_style.scss +38 -0
- package/themes/umberto/layout/gloria/_modules/not-found/index.pug +16 -0
- package/themes/umberto/layout/gloria/_modules/sidebar/_style.scss +147 -0
- package/themes/umberto/layout/gloria/_modules/sidebar/index.pug +24 -0
- package/themes/umberto/layout/gloria/_modules/sidebar-api/_style.scss +2 -0
- package/themes/umberto/layout/gloria/_modules/sidebar-api/index.pug +6 -0
- package/themes/umberto/layout/gloria/_modules/toc/_style.scss +201 -0
- package/themes/umberto/layout/gloria/_modules/toc/index.pug +10 -0
- package/themes/umberto/layout/gloria/_trackers/google-tag-manager.pug +14 -0
- package/themes/umberto/layout/gloria/_trackers/index.pug +2 -0
- package/themes/umberto/layout/gloria/api.pug +43 -20
- package/themes/umberto/layout/gloria/base.pug +23 -32
- package/themes/umberto/layout/gloria/index.pug +19 -13
- package/themes/umberto/layout/gloria/page.pug +30 -11
- package/themes/umberto/layout/gloria/sdk.pug +1 -1
- package/themes/umberto/layout/gloria/theme.pug +304 -0
- package/themes/umberto/layout/umberto/404.pug +0 -1
- package/themes/umberto/layout/umberto/_partial/report-issue-widget.pug +0 -3
- package/themes/umberto/source/gloria/assets/_fonts/Menlo/Menlo-Regular.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Menlo/Menlo-Regular.woff +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/Mulish-Italic-VariableFont_wght.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/Mulish-Italic-VariableFont_wght.woff2 +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/Mulish-VariableFont_wght.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/Mulish-VariableFont_wght.woff2 +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Black.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-BlackItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Bold.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-BoldItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-ExtraBold.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-ExtraBoldItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-ExtraLight.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-ExtraLightItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Italic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Light.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-LightItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Medium.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-MediumItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Regular.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-SemiBold.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-SemiBoldItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/PublicSans-Italic-VariableFont_wght.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/PublicSans-Italic-VariableFont_wght.woff2 +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/PublicSans-VariableFont_wght.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/PublicSans-VariableFont_wght.woff2 +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Black.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-BlackItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Bold.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-BoldItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ExtraBold.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ExtraBoldItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ExtraLight.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ExtraLightItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Italic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Light.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-LightItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Medium.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-MediumItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Regular.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-SemiBold.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-SemiBoldItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Thin.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ThinItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_img/404-billboard.svg +181 -0
- package/themes/umberto/source/gloria/assets/_img/ckeditor-logo.svg +15 -0
- package/themes/umberto/source/gloria/assets/_img/hex-bg-2.svg +10 -0
- package/themes/umberto/source/gloria/assets/_img/hex-bg.svg +10 -0
- package/themes/umberto/source/gloria/assets/_img/icons/api-class.svg +10 -0
- package/themes/umberto/source/gloria/assets/_img/icons/api-folder.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/api-interface.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/api-module.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/api-package.svg +4 -0
- package/themes/umberto/source/gloria/assets/_img/icons/api-typedef.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/bulb.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/check-circle.svg +4 -0
- package/themes/umberto/source/gloria/assets/_img/icons/check.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/chevron-down.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/chevron-right.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/close-circle.svg +4 -0
- package/themes/umberto/source/gloria/assets/_img/icons/close.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/copy.svg +10 -0
- package/themes/umberto/source/gloria/assets/_img/icons/dislike.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/download.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/edit.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/exclamation-circle.svg +4 -0
- package/themes/umberto/source/gloria/assets/_img/icons/experiment.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/export.svg +4 -0
- package/themes/umberto/source/gloria/assets/_img/icons/eye.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/filter.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/github.svg +10 -0
- package/themes/umberto/source/gloria/assets/_img/icons/info-circle.svg +4 -0
- package/themes/umberto/source/gloria/assets/_img/icons/like.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/link.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/lock.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/menu-fold.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/menu-list.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/menu.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/more.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/notification.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/number.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/premium.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/right.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/search.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/status.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/trash.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/unordered-list.svg +5 -0
- package/themes/umberto/source/gloria/assets/_img/icons/warning.svg +10 -0
- package/themes/umberto/src/gloria/css/_fonts.scss +51 -0
- package/themes/umberto/src/gloria/css/_layers.scss +1 -0
- package/themes/umberto/src/gloria/css/_normalize.scss +118 -0
- package/themes/umberto/src/gloria/css/a11y/_focusable.scss +7 -0
- package/themes/umberto/src/gloria/css/a11y/_index.scss +4 -0
- package/themes/umberto/src/gloria/css/a11y/_mixins.scss +32 -0
- package/themes/umberto/src/gloria/css/a11y/_reduce-motion.scss +9 -0
- package/themes/umberto/src/gloria/css/a11y/_screen-reader.scss +15 -0
- package/themes/umberto/src/gloria/css/base/_buttons.scss +13 -0
- package/themes/umberto/src/gloria/css/base/_descriptions-list.scss +33 -0
- package/themes/umberto/src/gloria/css/base/_details.scss +7 -0
- package/themes/umberto/src/gloria/css/base/_headings.scss +111 -0
- package/themes/umberto/src/gloria/css/base/_iframes.scss +7 -0
- package/themes/umberto/src/gloria/css/base/_index.scss +12 -0
- package/themes/umberto/src/gloria/css/base/_inline-code.scss +15 -0
- package/themes/umberto/src/gloria/css/base/_links.scss +30 -0
- package/themes/umberto/src/gloria/css/base/_lists.scss +58 -0
- package/themes/umberto/src/gloria/css/base/_mixins.scss +3 -0
- package/themes/umberto/src/gloria/css/base/_paragraphs.scss +15 -0
- package/themes/umberto/src/gloria/css/base/_tables.scss +68 -0
- package/themes/umberto/src/gloria/css/base/_typography.scss +62 -0
- package/themes/umberto/src/gloria/css/components/_api-collapsing-list.scss +148 -0
- package/themes/umberto/src/gloria/css/components/_api-filter-dropdown.scss +17 -0
- package/themes/umberto/src/gloria/css/components/_api-item-heading.scss +58 -0
- package/themes/umberto/src/gloria/css/components/_api-tree.scss +202 -0
- package/themes/umberto/src/gloria/css/components/_hierarchy-list.scss +35 -0
- package/themes/umberto/src/gloria/css/components/_image-zoom.scss +13 -0
- package/themes/umberto/src/gloria/css/components/_index.scss +55 -0
- package/themes/umberto/src/gloria/css/components/_notification.scss +36 -0
- package/themes/umberto/src/gloria/css/components/_utils.scss +5 -0
- package/themes/umberto/src/gloria/css/doc/_details.scss +11 -0
- package/themes/umberto/src/gloria/css/doc/_editor-icons.scss +21 -0
- package/themes/umberto/src/gloria/css/doc/_images.scss +9 -0
- package/themes/umberto/src/gloria/css/doc/_index.scss +5 -0
- package/themes/umberto/src/gloria/css/doc/_snippets.scss +126 -0
- package/themes/umberto/src/gloria/css/doc/_typography.scss +5 -0
- package/themes/umberto/src/gloria/css/layout/_base.scss +27 -0
- package/themes/umberto/src/gloria/css/layout/_breakpoints.scss +88 -0
- package/themes/umberto/src/gloria/css/layout/_container.scss +38 -0
- package/themes/umberto/src/gloria/css/layout/_index.scss +6 -0
- package/themes/umberto/src/gloria/css/layout/_layout.scss +64 -0
- package/themes/umberto/src/gloria/css/layout/_mixins.scss +34 -0
- package/themes/umberto/src/gloria/css/layout/_zindex.scss +12 -0
- package/themes/umberto/src/gloria/css/modules/_index.scss +29 -0
- package/themes/umberto/src/gloria/css/modules/_utils.scss +7 -0
- package/themes/umberto/src/gloria/css/styles.scss +11 -117
- package/themes/umberto/src/gloria/css/theme/_light.scss +344 -0
- package/themes/umberto/src/gloria/css/utilities/_animation.scss +32 -0
- package/themes/umberto/src/gloria/css/utilities/_colors.scss +14 -0
- package/themes/umberto/src/gloria/css/utilities/_display.scss +13 -0
- package/themes/umberto/src/gloria/css/utilities/_flex.scss +33 -0
- package/themes/umberto/src/gloria/css/utilities/_gap.scss +8 -0
- package/themes/umberto/src/gloria/css/utilities/_index.scss +11 -0
- package/themes/umberto/src/gloria/css/utilities/_radius.scss +21 -0
- package/themes/umberto/src/gloria/css/utilities/_rotation.scss +8 -0
- package/themes/umberto/src/gloria/css/utilities/_shadows.scss +13 -0
- package/themes/umberto/src/gloria/css/utilities/_spacing.scss +96 -0
- package/themes/umberto/src/gloria/css/utilities/_stop-scrolling.scss +9 -0
- package/themes/umberto/src/gloria/css/utilities/_text.scss +42 -0
- package/themes/umberto/src/gloria/js/app.js +92 -54
- package/themes/umberto/src/gloria/js/components/api-nav-tree.js +171 -0
- package/themes/umberto/src/gloria/js/components/api-toggle.js +92 -0
- package/themes/umberto/src/gloria/js/components/base-component.js +41 -0
- package/themes/umberto/src/gloria/js/components/breadcrumbs.js +115 -0
- package/themes/umberto/src/gloria/js/components/code-block.js +226 -0
- package/themes/umberto/src/gloria/js/components/code-switcher.js +177 -0
- package/themes/umberto/src/gloria/js/components/dropdown.js +516 -0
- package/themes/umberto/src/gloria/js/components/expandable.js +79 -0
- package/themes/umberto/src/gloria/js/components/fake-devtools.js +722 -0
- package/themes/umberto/src/gloria/js/components/hash-link.js +60 -0
- package/themes/umberto/src/gloria/js/components/heading-link.js +135 -0
- package/themes/umberto/src/gloria/js/components/iframe.js +158 -0
- package/themes/umberto/src/gloria/js/{_imageModal.js → components/image-zoom.js} +1 -1
- package/themes/umberto/src/gloria/js/components/mobile-overlay.js +315 -0
- package/themes/umberto/src/gloria/js/components/nav-tree.js +164 -0
- package/themes/umberto/src/gloria/js/components/tabs.js +284 -0
- package/themes/umberto/src/gloria/js/components/tooltip-popover.js +576 -0
- package/themes/umberto/src/gloria/js/helpers/after-dom-ready.js +16 -0
- package/themes/umberto/src/gloria/js/helpers/animate-element.js +78 -0
- package/themes/umberto/src/gloria/js/helpers/body-scroll.js +22 -0
- package/themes/umberto/src/gloria/js/helpers/clamp.js +16 -0
- package/themes/umberto/src/gloria/js/helpers/classnames.js +64 -0
- package/themes/umberto/src/gloria/js/helpers/copy-to-clipboard.js +19 -0
- package/themes/umberto/src/gloria/js/helpers/create-anchor-positioning-watcher.js +46 -0
- package/themes/umberto/src/gloria/js/helpers/create-cleanup-registry.js +88 -0
- package/themes/umberto/src/gloria/js/helpers/create-hover-manager.js +93 -0
- package/themes/umberto/src/gloria/js/helpers/create-keyboard-blur-watcher.js +90 -0
- package/themes/umberto/src/gloria/js/helpers/create-keyboard-focus-cycler.js +251 -0
- package/themes/umberto/src/gloria/js/helpers/create-mutation-observer.js +49 -0
- package/themes/umberto/src/gloria/js/helpers/create-outside-click-watcher.js +39 -0
- package/themes/umberto/src/gloria/js/helpers/cubic-bezier.js +55 -0
- package/themes/umberto/src/gloria/js/helpers/date-time.js +21 -0
- package/themes/umberto/src/gloria/js/helpers/decode-html-entities.js +23 -0
- package/themes/umberto/src/gloria/js/helpers/escape-handler.js +59 -0
- package/themes/umberto/src/gloria/js/helpers/fetch-stylesheet.js +25 -0
- package/themes/umberto/src/gloria/js/helpers/find-code-lang.js +85 -0
- package/themes/umberto/src/gloria/js/helpers/focus-first-interactive.js +50 -0
- package/themes/umberto/src/gloria/js/helpers/format-html.js +181 -0
- package/themes/umberto/src/gloria/js/helpers/get-all-scrollable-parents.js +34 -0
- package/themes/umberto/src/gloria/js/helpers/get-parents-until.js +26 -0
- package/themes/umberto/src/gloria/js/helpers/highlight-code.js +18 -0
- package/themes/umberto/src/gloria/js/helpers/html-builder.js +69 -0
- package/themes/umberto/src/gloria/js/helpers/identity.js +8 -0
- package/themes/umberto/src/gloria/js/helpers/inject-resource-preload.js +51 -0
- package/themes/umberto/src/gloria/js/helpers/inject-script.js +79 -0
- package/themes/umberto/src/gloria/js/helpers/inject-stylesheet.js +108 -0
- package/themes/umberto/src/gloria/js/helpers/is-element-attached.js +28 -0
- package/themes/umberto/src/gloria/js/helpers/is-focusable.js +14 -0
- package/themes/umberto/src/gloria/js/helpers/is-hidden-element.js +8 -0
- package/themes/umberto/src/gloria/js/helpers/is-mobile.js +8 -0
- package/themes/umberto/src/gloria/js/helpers/is-unsafe-key.js +14 -0
- package/themes/umberto/src/gloria/js/helpers/lerp.js +27 -0
- package/themes/umberto/src/gloria/js/helpers/local-storage-helper.js +133 -0
- package/themes/umberto/src/gloria/js/helpers/pipe.js +8 -0
- package/themes/umberto/src/gloria/js/helpers/prefers-reduced-motion.js +13 -0
- package/themes/umberto/src/gloria/js/helpers/random-id.js +51 -0
- package/themes/umberto/src/gloria/js/helpers/sanitize-text.js +27 -0
- package/themes/umberto/src/gloria/js/helpers/scroll-to-hash.js +31 -0
- package/themes/umberto/src/gloria/js/helpers/take-last.js +19 -0
- package/themes/umberto/src/gloria/js/helpers/tap.js +11 -0
- package/themes/umberto/src/gloria/js/helpers/throttle.js +46 -0
- package/themes/umberto/src/gloria/js/helpers/timeout.js +14 -0
- package/themes/umberto/src/gloria/js/helpers/toggle-height.js +46 -0
- package/themes/umberto/src/gloria/js/helpers/tween.js +100 -0
- package/themes/umberto/src/gloria/js/helpers/wrap-around.js +39 -0
- package/themes/umberto/src/gloria/js/modules/algolia-search.js +168 -0
- package/themes/umberto/src/gloria/js/modules/api-filter.js +184 -0
- package/themes/umberto/src/gloria/js/modules/header-bar.js +154 -0
- package/themes/umberto/src/gloria/js/modules/header.js +242 -0
- package/themes/umberto/src/gloria/js/modules/links-prefetch.js +196 -0
- package/themes/umberto/src/gloria/js/modules/mobile-nav.js +327 -0
- package/themes/umberto/src/gloria/js/modules/sidebar.js +114 -0
- package/themes/umberto/src/gloria/js/modules/table-of-contents-api.js +214 -0
- package/themes/umberto/src/gloria/js/modules/table-of-contents.js +287 -0
- package/themes/umberto/src/gloria/js/public-api.js +75 -0
- package/themes/umberto/src/gloria/js/web-components/svg-icon.js +117 -0
- package/themes/umberto/src/umberto/js/_codeswitcherbuttons.js +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_api-title.pug +0 -17
- package/themes/umberto/layout/gloria/_mixin/nav-tree-item.pug +0 -13
- package/themes/umberto/layout/gloria/_partial/docsearch.pug +0 -21
- package/themes/umberto/layout/gloria/_partial/dropdown.pug +0 -12
- package/themes/umberto/layout/gloria/_partial/feedback-widget.pug +0 -20
- package/themes/umberto/layout/gloria/_partial/footer.pug +0 -6
- package/themes/umberto/layout/gloria/_partial/gh-contribute.pug +0 -8
- package/themes/umberto/layout/gloria/_partial/google-tag-manager.pug +0 -18
- package/themes/umberto/layout/gloria/_partial/header.pug +0 -64
- package/themes/umberto/layout/gloria/_partial/nav-tree.pug +0 -9
- package/themes/umberto/layout/gloria/_partial/report-issue-widget.pug +0 -26
- package/themes/umberto/layout/gloria/_partial/rwd-breadcrumbs.pug +0 -13
- package/themes/umberto/layout/gloria/_partial/search-box.pug +0 -6
- package/themes/umberto/layout/gloria/_partial/vwo.pug +0 -11
- package/themes/umberto/source/gloria/assets/_img/arrows.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/book.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/box-brown.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/box-orange.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/box-red.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/bulb.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/clipboard.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/cog.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/data.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/documentation.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/download.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/edit.svg +0 -2
- package/themes/umberto/source/gloria/assets/_img/exclamation-circle.svg +0 -2
- package/themes/umberto/source/gloria/assets/_img/eye.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/filter.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/filtering.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/folder.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/github.svg +0 -6
- package/themes/umberto/source/gloria/assets/_img/header-info-configs.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/header-info-events.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/header-info-methods.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/header-info-properties.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/heart.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/info-circle.svg +0 -4
- package/themes/umberto/source/gloria/assets/_img/info.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/list-nest.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/loupe.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/menu.svg +0 -4
- package/themes/umberto/source/gloria/assets/_img/plug.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/star-in-circle.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/tick.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/triangle-down.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/triangle-right.svg +0 -1
- package/themes/umberto/src/gloria/css/_api-content.scss +0 -32
- package/themes/umberto/src/gloria/css/_api-info-box.scss +0 -86
- package/themes/umberto/src/gloria/css/_api-props-filter.scss +0 -106
- package/themes/umberto/src/gloria/css/_api-see-source.scss +0 -35
- package/themes/umberto/src/gloria/css/_api-subheader.scss +0 -167
- package/themes/umberto/src/gloria/css/_api-tree.scss +0 -121
- package/themes/umberto/src/gloria/css/_badge.scss +0 -74
- package/themes/umberto/src/gloria/css/_code-switcher.scss +0 -61
- package/themes/umberto/src/gloria/css/_collapsinglist.scss +0 -262
- package/themes/umberto/src/gloria/css/_content.scss +0 -236
- package/themes/umberto/src/gloria/css/_docsearch.scss +0 -109
- package/themes/umberto/src/gloria/css/_dropdown.scss +0 -63
- package/themes/umberto/src/gloria/css/_editor-icon.scss +0 -26
- package/themes/umberto/src/gloria/css/_feedback-widget.scss +0 -11
- package/themes/umberto/src/gloria/css/_font-external.scss +0 -8
- package/themes/umberto/src/gloria/css/_footer.scss +0 -40
- package/themes/umberto/src/gloria/css/_formatted.scss +0 -285
- package/themes/umberto/src/gloria/css/_guide-content.scss +0 -37
- package/themes/umberto/src/gloria/css/_guide-sdk-tree.scss +0 -14
- package/themes/umberto/src/gloria/css/_loading-spinner.scss +0 -33
- package/themes/umberto/src/gloria/css/_main.scss +0 -59
- package/themes/umberto/src/gloria/css/_navigation.scss +0 -35
- package/themes/umberto/src/gloria/css/_notice.scss +0 -116
- package/themes/umberto/src/gloria/css/_print.scss +0 -20
- package/themes/umberto/src/gloria/css/_prism.scss +0 -223
- package/themes/umberto/src/gloria/css/_rwd-breadcrumbs.scss +0 -28
- package/themes/umberto/src/gloria/css/_rwd-menu.scss +0 -89
- package/themes/umberto/src/gloria/css/_secondary-navigation.scss +0 -152
- package/themes/umberto/src/gloria/css/_theme-dark.scss +0 -175
- package/themes/umberto/src/gloria/css/_toggler.scss +0 -46
- package/themes/umberto/src/gloria/css/_top.scss +0 -350
- package/themes/umberto/src/gloria/css/_tree.scss +0 -218
- package/themes/umberto/src/gloria/css/_warning-banner.scss +0 -46
- package/themes/umberto/src/gloria/css/components/_lightbox.scss +0 -12
- package/themes/umberto/src/gloria/css/helpers/_color.scss +0 -49
- package/themes/umberto/src/gloria/css/helpers/_font.scss +0 -60
- package/themes/umberto/src/gloria/css/helpers/_globals.scss +0 -129
- package/themes/umberto/src/gloria/css/helpers/_reset.scss +0 -52
- package/themes/umberto/src/gloria/css/helpers/_spacing.scss +0 -21
- package/themes/umberto/src/gloria/css/pages/_sdk.scss +0 -111
- package/themes/umberto/src/gloria/js/_anchors.js +0 -57
- package/themes/umberto/src/gloria/js/_apisearch.js +0 -126
- package/themes/umberto/src/gloria/js/_apitree.js +0 -67
- package/themes/umberto/src/gloria/js/_attachpermalinklistener.js +0 -50
- package/themes/umberto/src/gloria/js/_codeswitcherbuttons.js +0 -146
- package/themes/umberto/src/gloria/js/_collapsables.js +0 -135
- package/themes/umberto/src/gloria/js/_copymobileapinavigation.js +0 -26
- package/themes/umberto/src/gloria/js/_devnames.js +0 -37
- package/themes/umberto/src/gloria/js/_dropdowns.js +0 -55
- package/themes/umberto/src/gloria/js/_filtering.js +0 -139
- package/themes/umberto/src/gloria/js/_pagenavigation.js +0 -93
- package/themes/umberto/src/gloria/js/_prism.js +0 -104
- package/themes/umberto/src/gloria/js/_rwdmenu.js +0 -15
- package/themes/umberto/src/gloria/js/_samplecode.js +0 -23
- package/themes/umberto/src/gloria/js/_sidenavigation.js +0 -59
- package/themes/umberto/src/gloria/js/_toc.js +0 -93
- package/themes/umberto/src/gloria/js/_tooltips.js +0 -39
- package/themes/umberto/src/gloria/js/_warningbanner.js +0 -18
- package/themes/umberto/src/gloria/js/vendor/prism.js +0 -45
- /package/themes/umberto/layout/gloria/_api-docs/_partial/{api-info-box.pug → api-hierarchy.pug} +0 -0
- /package/themes/umberto/layout/gloria/{_partial → _trackers}/google-analytics.pug +0 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Transforms XML tree structure to Pug mixin format.
|
|
8
|
+
* This module converts parsed XML nodes into Pug template syntax with proper indentation and attribute handling.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
const { TreeWalkActions, walkXMLTree } = require( './parser/walk-xml-tree' );
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Transforms an XML tree structure into Pug mixin syntax.
|
|
17
|
+
*
|
|
18
|
+
* @param tree - The XML tree object to transform
|
|
19
|
+
* @param nesting - Base nesting level for indentation
|
|
20
|
+
* @param options - Configuration options
|
|
21
|
+
* @param options.nestingCharacter - Character used for indentation (default: '\t')
|
|
22
|
+
* @returns The transformed Pug mixin string
|
|
23
|
+
*/
|
|
24
|
+
function transformXMLTreeToPug( tree, nesting, options = {} ) {
|
|
25
|
+
const {
|
|
26
|
+
nestingCharacter = '\t',
|
|
27
|
+
parseText = str => str,
|
|
28
|
+
fallbackGlobalRequire
|
|
29
|
+
} = options;
|
|
30
|
+
|
|
31
|
+
let hasMissingImports = false;
|
|
32
|
+
|
|
33
|
+
// Walk through the XML tree and transform each node
|
|
34
|
+
const requireTags = new Set( [] );
|
|
35
|
+
const result = walkXMLTree( tree, {
|
|
36
|
+
leave( node, depth, parents ) {
|
|
37
|
+
// Calculate indentation based on nesting level and current depth
|
|
38
|
+
const indent = nestingCharacter.repeat( nesting + depth );
|
|
39
|
+
|
|
40
|
+
switch ( node.type ) {
|
|
41
|
+
case 'text': {
|
|
42
|
+
const parent = parents[ parents.length - 1 ];
|
|
43
|
+
let mappedContent = node.content;
|
|
44
|
+
|
|
45
|
+
if ( parent && parent.type === 'element' ) {
|
|
46
|
+
mappedContent = parseText( parent, mappedContent );
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if ( !mappedContent ) {
|
|
50
|
+
return TreeWalkActions.remove();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return TreeWalkActions.replace( `${ indent }| ${ mappedContent }\n` );
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
case 'element': {
|
|
57
|
+
if ( !node.patternElement?.requires?.length ) {
|
|
58
|
+
hasMissingImports = true;
|
|
59
|
+
} else if ( !hasMissingImports ) {
|
|
60
|
+
for ( const requirePath of node.patternElement.requires ) {
|
|
61
|
+
requireTags.add( requirePath );
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const mappedAttributes = (
|
|
66
|
+
node.patternElement?.attributesMapper ?
|
|
67
|
+
node.patternElement.attributesMapper( node ) :
|
|
68
|
+
node.attributes
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return TreeWalkActions.replace( [
|
|
72
|
+
`${ indent }+${ node.patternElement.mixinName || node.name }(${ serializeMixinAttributes( mappedAttributes ) })`,
|
|
73
|
+
...( node.children || [] )
|
|
74
|
+
].join( '\n' ) );
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
} );
|
|
79
|
+
|
|
80
|
+
// There is no need to duplicate requires if the fallback global require is already included.
|
|
81
|
+
if ( hasMissingImports ) {
|
|
82
|
+
requireTags.clear();
|
|
83
|
+
requireTags.add( fallbackGlobalRequire );
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return [
|
|
87
|
+
...Array.from( requireTags ).map( requirePath => `include ${ requirePath }` ),
|
|
88
|
+
result
|
|
89
|
+
].join( '\n' );
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Serializes XML attributes into JSON format for Pug mixin parameters.
|
|
94
|
+
* Normalizes attribute names and values according to Pug conventions.
|
|
95
|
+
*
|
|
96
|
+
* @param attributes - Object containing XML attributes
|
|
97
|
+
* @returns JSON string representation of normalized attributes
|
|
98
|
+
*/
|
|
99
|
+
function serializeMixinAttributes( attributes ) {
|
|
100
|
+
const entries = Object.fromEntries(
|
|
101
|
+
Object
|
|
102
|
+
.entries( attributes )
|
|
103
|
+
.map( ( [ key, value ] ) => {
|
|
104
|
+
const normalizedKey = normalizeMixinAttributeName( key );
|
|
105
|
+
const normalizedValue = normalizeMixinAttributeValue( value );
|
|
106
|
+
|
|
107
|
+
return [ normalizedKey, normalizedValue ];
|
|
108
|
+
} )
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
return JSON.stringify( entries );
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Normalizes XML attribute values to appropriate JavaScript types.
|
|
116
|
+
* Converts string representations of booleans to actual boolean values.
|
|
117
|
+
*
|
|
118
|
+
* @param value - The XML attribute value to normalize
|
|
119
|
+
* @returns Normalized value (boolean for 'true'/'false', string otherwise)
|
|
120
|
+
*/
|
|
121
|
+
function normalizeMixinAttributeValue( value ) {
|
|
122
|
+
if ( value === 'true' || value === '' ) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if ( value === 'false' ) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return value;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Normalizes attribute names from kebab-case to camelCase.
|
|
135
|
+
* e.g., data-foo-bar -> dataFooBar
|
|
136
|
+
*
|
|
137
|
+
* @param name - The kebab-case attribute name
|
|
138
|
+
* @returns The camelCase attribute name
|
|
139
|
+
*/
|
|
140
|
+
function normalizeMixinAttributeName( name ) {
|
|
141
|
+
return name.replace( /-([a-z])/g, g => g[ 1 ].toUpperCase() );
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
module.exports = transformXMLTreeToPug;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
const crypto = require( 'crypto' );
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Generates a random ID with a single segment. If a prefix is provided, it will be prepended to the ID.
|
|
12
|
+
*
|
|
13
|
+
* The `gen-` prefix is always used to easier extract the generated IDs from the output.
|
|
14
|
+
*
|
|
15
|
+
* @param [prefix] Optional prefix to add to the ID
|
|
16
|
+
* @param [maskable=true] Whether the ID should be replaceable by regenerateRandomIds.
|
|
17
|
+
* @return The generated ID with optional prefix
|
|
18
|
+
*/
|
|
19
|
+
function randomId( prefix, maskable = true ) {
|
|
20
|
+
const shortId = crypto.randomBytes( 3 ).toString( 'hex' ).substring( 0, 5 );
|
|
21
|
+
|
|
22
|
+
let id = prefix ? `${ prefix }-${ shortId }` : shortId;
|
|
23
|
+
|
|
24
|
+
if ( maskable ) {
|
|
25
|
+
id = `gen-${ id }`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return id;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Regenerates random IDs in a string.
|
|
33
|
+
*
|
|
34
|
+
* It finds all occurrences of IDs generated by `randomId()` and replaces them with new random IDs.
|
|
35
|
+
* If an ID is repeated in the input string, it will be replaced with the same new ID.
|
|
36
|
+
* It preserves the prefix of the original ID.
|
|
37
|
+
*
|
|
38
|
+
* @param str The string to process.
|
|
39
|
+
* @returns The string with regenerated IDs.
|
|
40
|
+
*/
|
|
41
|
+
function regenerateRandomIds( str ) {
|
|
42
|
+
const idCache = new Map();
|
|
43
|
+
const idRegex = /(gen-(?:[a-zA-Z0-9]+-)*[a-f0-9]{5})/g;
|
|
44
|
+
|
|
45
|
+
return str.replace( idRegex, oldId => {
|
|
46
|
+
if ( idCache.has( oldId ) ) {
|
|
47
|
+
return idCache.get( oldId );
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Everything after 'gen-'.
|
|
51
|
+
const idContent = oldId.substring( 4 );
|
|
52
|
+
const parts = idContent.split( '-' );
|
|
53
|
+
|
|
54
|
+
// The ID has 1 segment at the end. If there are more parts, it means a prefix is present.
|
|
55
|
+
const prefix = parts.length > 1 ? parts.slice( 0, -1 ).join( '-' ) : undefined;
|
|
56
|
+
const newId = randomId( prefix );
|
|
57
|
+
|
|
58
|
+
idCache.set( oldId, newId );
|
|
59
|
+
|
|
60
|
+
return newId;
|
|
61
|
+
} );
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
module.exports = {
|
|
65
|
+
randomId,
|
|
66
|
+
regenerateRandomIds
|
|
67
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Removes indentation from content preserving the relative indentation within the content.
|
|
10
|
+
* @param content The content to remove indentation from
|
|
11
|
+
* @returns Content with common indentation removed
|
|
12
|
+
*/
|
|
13
|
+
module.exports = function removeIndentation( content ) {
|
|
14
|
+
// Remove unwanted indentation.
|
|
15
|
+
const lines = content.split( /\n/ );
|
|
16
|
+
|
|
17
|
+
// Skip empty lines when detecting indentation level
|
|
18
|
+
let indentationLine = 1;
|
|
19
|
+
while ( indentationLine < lines.length && !lines[ indentationLine ].trim() ) {
|
|
20
|
+
indentationLine++;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Get the indentation of the first non-empty line, or empty string if no valid lines
|
|
24
|
+
const indentation = indentationLine < lines.length ? lines[ indentationLine ].match( /^\s*/ )[ 0 ] : '';
|
|
25
|
+
|
|
26
|
+
if ( !indentation ) {
|
|
27
|
+
return content.trim();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let pattern;
|
|
31
|
+
|
|
32
|
+
// When using spaces as indentation, some editors may mix them with tabs.
|
|
33
|
+
// In such case, let's try to remove tabs as well. 4 spaces are treat as a single tab character.
|
|
34
|
+
if ( indentation[ 0 ] === ' ' ) {
|
|
35
|
+
pattern = new RegExp( `^${ indentation }|${ '\\t'.repeat( Math.ceil( indentation.length / 4 ) ) }` );
|
|
36
|
+
} else {
|
|
37
|
+
pattern = new RegExp( `^${ indentation }` );
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Process each line to remove common indentation
|
|
41
|
+
content = lines.map( line => line.replace( pattern, '' ) ).join( '\n' );
|
|
42
|
+
|
|
43
|
+
// Remove first linebreak and last linebreak.
|
|
44
|
+
content = content.replace( /^\n/, '' );
|
|
45
|
+
content = content.replace( /\n$/, '' );
|
|
46
|
+
|
|
47
|
+
return content;
|
|
48
|
+
};
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
const cheerio = require( 'cheerio' );
|
|
9
|
+
const fs = require( 'fs' );
|
|
10
|
+
const path = require( 'path' );
|
|
11
|
+
|
|
12
|
+
const HexoManager = require( '../../src/hexo-manager' );
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Cache for parsed SVG elements.
|
|
16
|
+
*/
|
|
17
|
+
const SVG_CACHE = new Map();
|
|
18
|
+
|
|
19
|
+
module.exports = function spritesheetSvg( str, isDocument = true ) {
|
|
20
|
+
const $ = cheerio.load( str, null, isDocument );
|
|
21
|
+
const elements = $( '[data-spritesheet-svg]' );
|
|
22
|
+
|
|
23
|
+
// Skip if there are no elements with data-spritesheet-svg
|
|
24
|
+
if ( elements.length === 0 ) {
|
|
25
|
+
return str;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Collect all unique SVG files to include in the spritesheet
|
|
29
|
+
const svgFiles = new Map();
|
|
30
|
+
|
|
31
|
+
// Helper function to extract SVG file information
|
|
32
|
+
function collectSvgFileInfo( element ) {
|
|
33
|
+
const svgPath = element.attr( 'data-spritesheet-svg' );
|
|
34
|
+
const iconId = element.attr( 'data-spritesheet-id' );
|
|
35
|
+
|
|
36
|
+
if ( !svgFiles.has( iconId ) ) {
|
|
37
|
+
svgFiles.set( iconId, svgPath );
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Process normal SVG elements
|
|
42
|
+
elements.each( function() {
|
|
43
|
+
const $element = $( this );
|
|
44
|
+
|
|
45
|
+
collectSvgFileInfo( $element );
|
|
46
|
+
} );
|
|
47
|
+
|
|
48
|
+
// Process and remove preload elements
|
|
49
|
+
const preloadElements = $( '[data-spritesheet-preload="true"]' );
|
|
50
|
+
preloadElements.each( function() {
|
|
51
|
+
const $element = $( this );
|
|
52
|
+
|
|
53
|
+
collectSvgFileInfo( $element );
|
|
54
|
+
$element.remove();
|
|
55
|
+
} );
|
|
56
|
+
|
|
57
|
+
if ( svgFiles.size === 0 ) {
|
|
58
|
+
return str;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Create spritesheet and get viewBox data
|
|
62
|
+
const { spritesheetElement, iconViewBoxes } = createSpritesheet( $, svgFiles );
|
|
63
|
+
|
|
64
|
+
// Add spritesheet to the beginning of the body
|
|
65
|
+
if ( $( 'body' ).length ) {
|
|
66
|
+
$( 'body' ).prepend( spritesheetElement );
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Set viewBox for original SVG elements
|
|
70
|
+
elements.each( function() {
|
|
71
|
+
const element = $( this );
|
|
72
|
+
const iconId = element.attr( 'data-spritesheet-id' );
|
|
73
|
+
const viewBox = iconViewBoxes.get( iconId );
|
|
74
|
+
|
|
75
|
+
if ( viewBox && this.tagName.toLowerCase() === 'svg' ) {
|
|
76
|
+
element.attr( 'viewBox', viewBox );
|
|
77
|
+
}
|
|
78
|
+
} );
|
|
79
|
+
|
|
80
|
+
$( '[data-spritesheet-svg]' ).removeAttr( 'data-spritesheet-svg' );
|
|
81
|
+
$( '[data-spritesheet-id]' ).removeAttr( 'data-spritesheet-id' );
|
|
82
|
+
|
|
83
|
+
return $.html();
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Creates an SVG spritesheet from the provided SVG files.
|
|
88
|
+
* Returns an object containing the spritesheet element and a map of icon IDs to their viewBox strings.
|
|
89
|
+
*/
|
|
90
|
+
function createSpritesheet( $, svgFiles ) {
|
|
91
|
+
const symbols = [];
|
|
92
|
+
const iconViewBoxes = new Map();
|
|
93
|
+
|
|
94
|
+
for ( const [ iconId, svgPath ] of svgFiles.entries() ) {
|
|
95
|
+
const absolutePath = path.join( HexoManager.hexo.theme_dir, svgPath );
|
|
96
|
+
|
|
97
|
+
if ( !fs.existsSync( absolutePath ) ) {
|
|
98
|
+
console.warn( `SVG file not found: ${ absolutePath }` );
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Check if we have the SVG in cache
|
|
103
|
+
if ( !SVG_CACHE.has( absolutePath ) ) {
|
|
104
|
+
try {
|
|
105
|
+
const svgContent = fs.readFileSync( absolutePath, 'utf8' );
|
|
106
|
+
const $svg = cheerio.load( svgContent, { xmlMode: true } )( 'svg' );
|
|
107
|
+
SVG_CACHE.set( absolutePath, $svg );
|
|
108
|
+
} catch ( error ) {
|
|
109
|
+
console.error( `Error reading SVG file: ${ absolutePath }`, error );
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const $svg = SVG_CACHE.get( absolutePath ).clone();
|
|
115
|
+
|
|
116
|
+
// Create symbol element from SVG
|
|
117
|
+
const $symbol = $( '<symbol></symbol>' );
|
|
118
|
+
$symbol.attr( 'id', iconId );
|
|
119
|
+
|
|
120
|
+
// Copy viewBox and other relevant attributes
|
|
121
|
+
let viewBoxValue;
|
|
122
|
+
if ( $svg.attr( 'viewBox' ) ) {
|
|
123
|
+
viewBoxValue = $svg.attr( 'viewBox' );
|
|
124
|
+
} else if ( $svg.attr( 'width' ) && $svg.attr( 'height' ) ) {
|
|
125
|
+
viewBoxValue = `0 0 ${ $svg.attr( 'width' ) } ${ $svg.attr( 'height' ) }`;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if ( viewBoxValue ) {
|
|
129
|
+
$symbol.attr( 'viewBox', viewBoxValue );
|
|
130
|
+
iconViewBoxes.set( iconId, viewBoxValue );
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Copy all child elements from SVG to symbol
|
|
134
|
+
$svg.children().each( function() {
|
|
135
|
+
const $child = $( this );
|
|
136
|
+
// Skip title elements as they'll be provided by the consuming SVG
|
|
137
|
+
if ( $child[ 0 ].tagName.toLowerCase() !== 'title' ) {
|
|
138
|
+
$symbol.append( $child.clone() );
|
|
139
|
+
}
|
|
140
|
+
} );
|
|
141
|
+
|
|
142
|
+
symbols.push(
|
|
143
|
+
resetFillColor( $, $symbol )
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Create the spritesheet container
|
|
148
|
+
const $spritesheet = $( '<svg></svg>' );
|
|
149
|
+
$spritesheet.attr( {
|
|
150
|
+
'class': 'svg-spritesheet',
|
|
151
|
+
'xmlns': 'http://www.w3.org/2000/svg',
|
|
152
|
+
'style': 'display: none;',
|
|
153
|
+
'aria-hidden': 'true'
|
|
154
|
+
} );
|
|
155
|
+
|
|
156
|
+
// Add all symbols to the spritesheet
|
|
157
|
+
symbols.forEach( $symbol => {
|
|
158
|
+
$spritesheet.append( $symbol );
|
|
159
|
+
} );
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
spritesheetElement: $spritesheet,
|
|
163
|
+
iconViewBoxes
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Resets the fill color of an SVG element to 'currentColor'.
|
|
169
|
+
* This is useful for ensuring that the SVG inherits the text color from its parent.
|
|
170
|
+
*/
|
|
171
|
+
function resetFillColor( $, $svg ) {
|
|
172
|
+
// Replace all fill attributes with the specified color.
|
|
173
|
+
$svg.find( '[fill]' ).each( function() {
|
|
174
|
+
$( this ).attr( 'fill', 'currentColor' );
|
|
175
|
+
} );
|
|
176
|
+
|
|
177
|
+
// Also check the root SVG for fill attribute.
|
|
178
|
+
if ( $svg.attr( 'fill' ) ) {
|
|
179
|
+
$svg.attr( 'fill', 'currentColor' );
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return $svg;
|
|
183
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
const cheerio = require( 'cheerio' );
|
|
9
|
+
|
|
10
|
+
module.exports = function toc( data, options = {} ) {
|
|
11
|
+
const $ = cheerio.load( data, null, false );
|
|
12
|
+
|
|
13
|
+
let usedHeadings = [ 'h2', 'h3', 'h4', 'h5', 'h6' ];
|
|
14
|
+
|
|
15
|
+
if ( options.tocLimit >= 0 ) {
|
|
16
|
+
usedHeadings = usedHeadings.slice( 0, options.tocLimit );
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
usedHeadings = usedHeadings.join( ',' );
|
|
20
|
+
|
|
21
|
+
const headings = $( usedHeadings )
|
|
22
|
+
.filter( function() {
|
|
23
|
+
return !$( this ).parents( '.live-snippet, .collapsing-list__item' ).length;
|
|
24
|
+
} );
|
|
25
|
+
const className = options.class || 'secondary-navigation';
|
|
26
|
+
|
|
27
|
+
if ( !headings.length ) {
|
|
28
|
+
return '';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const $r = cheerio.load( `<nav class=${ className }><h3>Table of contents</h3></nav>`, null, false ); // result object
|
|
32
|
+
const tocLastLevels = [ $r( 'nav' ), 0, 0, 0, 0, 0, 0 ];
|
|
33
|
+
|
|
34
|
+
headings.each( function() {
|
|
35
|
+
const hLevel = Number( this.name[ 1 ] );
|
|
36
|
+
const id = $r( this ).attr( 'id' );
|
|
37
|
+
const text = $r( this ).find( '.headerlink' ).remove().end().text().trim()
|
|
38
|
+
// Replace the chevrons with their HTML escape characters to avoid rendering HTML in ToC.
|
|
39
|
+
.replace( /</g, '<' )
|
|
40
|
+
.replace( />/g, '>' );
|
|
41
|
+
|
|
42
|
+
const newItem = `<li><a class="a11y-focusable" href="#${ id }" title="${ text }">${ text }</a></li>`;
|
|
43
|
+
|
|
44
|
+
if ( tocLastLevels[ hLevel ] ) {
|
|
45
|
+
// If there already is a parent node for current heading level, append the new toc item there.
|
|
46
|
+
tocLastLevels[ hLevel ].append( newItem );
|
|
47
|
+
} else {
|
|
48
|
+
// If there's no parent node for current heading level, create it and append.
|
|
49
|
+
if ( $r( 'li' ).length ) {
|
|
50
|
+
$r( 'li' ).last().append( `<ol>${ newItem }</ol>` );
|
|
51
|
+
} else {
|
|
52
|
+
$r( 'nav' ).append( `<ol>${ newItem }</ol>` );
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Assign new created <ol> element to the helper array.
|
|
56
|
+
tocLastLevels[ hLevel ] = $r( 'ol' ).last();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// After adding new toc item, lower heading levels in helper array must be cleared.
|
|
60
|
+
// If e.g. level 2 <ol> was added, then level 3 nd lower <ol>s are no longer needed because they belong to upper toc nodes.
|
|
61
|
+
clearLowerLevels( tocLastLevels, hLevel );
|
|
62
|
+
} );
|
|
63
|
+
|
|
64
|
+
return $r.html();
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
function clearLowerLevels( levels, current ) {
|
|
68
|
+
for ( let i = current + 1; i < levels.length; i++ ) {
|
|
69
|
+
levels[ i ] = 0;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
const ParserCursor = require( './parser-cursor' );
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Transforms Github style admonitions in markdown to a rendered callouts.
|
|
12
|
+
*
|
|
13
|
+
* For example:
|
|
14
|
+
*
|
|
15
|
+
* > [!IMPORTANT]
|
|
16
|
+
* > This is an important message.
|
|
17
|
+
* > It should be highlighted.
|
|
18
|
+
*
|
|
19
|
+
* @param mapperFn - A function that takes an admonition object and returns a string.
|
|
20
|
+
* @param str - The string to transform.
|
|
21
|
+
* @returns The transformed string with admonitions replaced by the result of the mapper function.
|
|
22
|
+
*/
|
|
23
|
+
function transformMarkdownAdmonitions( mapperFn, str ) {
|
|
24
|
+
const cursor = new ParserCursor( str );
|
|
25
|
+
let acc = '';
|
|
26
|
+
|
|
27
|
+
for ( ; cursor.index < cursor.text.length; ) {
|
|
28
|
+
const ch = cursor.text[ cursor.index ];
|
|
29
|
+
|
|
30
|
+
if ( ch === '>' ) {
|
|
31
|
+
const maybeAdmonition = cursor.try( eatAdmonition );
|
|
32
|
+
|
|
33
|
+
if ( maybeAdmonition ) {
|
|
34
|
+
acc += mapperFn( maybeAdmonition );
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
acc += ch;
|
|
40
|
+
cursor.index++;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return acc;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Fast check if the string contains an admonition block.
|
|
48
|
+
*/
|
|
49
|
+
function fastCheckIfContainsAdmonition( str ) {
|
|
50
|
+
return str.includes( '> [!' ) && str.includes( ']' );
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Eats an admonition block if it matches the expected pattern.
|
|
55
|
+
*
|
|
56
|
+
* @param cursor - The cursor to use for parsing.
|
|
57
|
+
* @returns An object representing the admonition type and content, or undefined (if not matched)
|
|
58
|
+
*/
|
|
59
|
+
function eatAdmonition( cursor ) {
|
|
60
|
+
if ( !cursor.eatTerminals( '> [!' ) ) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const type = cursor.eatUntilTerminal( ']' ).trim();
|
|
65
|
+
|
|
66
|
+
cursor.eatAllNextTerminals( ' \t\n ' );
|
|
67
|
+
|
|
68
|
+
const content = cursor.accumulateEaters( eatAdmonitionLine );
|
|
69
|
+
|
|
70
|
+
// Let's revert cursor back to the ending newline if it was consumed.
|
|
71
|
+
if ( content.length > 0 && cursor.text[ cursor.index - 1 ] === '\n' ) {
|
|
72
|
+
cursor.index--;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
type,
|
|
77
|
+
content
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Eats a line of an admonition block.
|
|
83
|
+
*
|
|
84
|
+
* @param cursor - The cursor to use for parsing.
|
|
85
|
+
* @returns The content of the admonition line, or undefined if not matched.
|
|
86
|
+
*/
|
|
87
|
+
function eatAdmonitionLine( cursor ) {
|
|
88
|
+
cursor.eatIndent();
|
|
89
|
+
|
|
90
|
+
if ( !cursor.eatTerminal( '>' ) ) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return cursor.eatUntilEOL().trim();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
exports.transformMarkdownAdmonitions = transformMarkdownAdmonitions;
|
|
98
|
+
exports.fastCheckIfContainsAdmonition = fastCheckIfContainsAdmonition;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Returns a new array with unique elements based on a specified property.
|
|
10
|
+
* When duplicates are found, the last occurrence is preferred.
|
|
11
|
+
*
|
|
12
|
+
* @param array - The array to process
|
|
13
|
+
* @param key - The property name to check for uniqueness or a function that extracts the value
|
|
14
|
+
* @returns A new array with unique elements
|
|
15
|
+
*/
|
|
16
|
+
module.exports = function uniqByLast( key, array ) {
|
|
17
|
+
const seen = new Map();
|
|
18
|
+
|
|
19
|
+
// Process from right to left to keep last occurrences
|
|
20
|
+
return array
|
|
21
|
+
.slice()
|
|
22
|
+
.reverse()
|
|
23
|
+
.filter( item => {
|
|
24
|
+
const value = typeof key === 'function' ? key( item ) : item[ key ];
|
|
25
|
+
if ( seen.has( value ) ) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
seen.set( value, true );
|
|
29
|
+
return true;
|
|
30
|
+
} )
|
|
31
|
+
.reverse();
|
|
32
|
+
};
|