├── .github ├── dependabot.yml └── workflows │ └── publish.yml ├── .gitignore ├── LICENSE ├── README.md ├── build ├── webpack.config.base.js ├── webpack.config.build.js └── webpack.config.dev.js ├── docs ├── .nojekyll ├── README.md ├── _sidebar.md ├── build.html ├── dev.html ├── index.html ├── kityminder.build.html └── more │ ├── kityminder.md │ ├── markmap-json-mup.md │ ├── markmap-lib.md │ ├── markmap.md │ └── not-mindmap.md ├── package-lock.json ├── package.json └── src └── docsify-mindmap.js /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "daily" 12 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish 2 | on: 3 | push: 4 | branches: 5 | - master 6 | tags: 7 | - '*' 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | permissions: 13 | contents: read 14 | id-token: write 15 | steps: 16 | - uses: actions/checkout@v4 17 | - uses: actions/setup-node@v4 18 | with: 19 | node-version: '20.x' 20 | registry-url: 'https://registry.npmjs.org' 21 | - run: npm i 22 | - run: npm run build 23 | # https://docs.npmjs.com/generating-provenance-statements#example-github-actions-workflow 24 | - run: npm ci 25 | - run: npm publish --provenance --access public 26 | env: 27 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /dist/ 2 | /node_modules/ 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 ~ present 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # docsify-mindmap 2 | 3 | Mind map plugin for [docsify](https://github.com/docsifyjs/docsify). 4 | 5 | ## Usage 6 | 7 | ```html 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 32 | 33 | 34 | 35 | 36 | ``` 37 | 38 | ````md 39 | # Plain text 40 | 41 | ```mindmap 42 | root 43 | topic1 44 | subtopic 45 | topic2 46 | subtopic 47 | ``` 48 | ```` 49 | 50 | ````md 51 | # JSON tree format 52 | 53 | ```mindmap json-tree 54 | { 55 | "name": "root", 56 | "children": [ 57 | { 58 | "name": "topic1", 59 | "children": [{ "name": "subtopic" }] 60 | }, 61 | { 62 | "name": "topic2", 63 | "children": [{ "name": "subtopic" }] 64 | } 65 | ] 66 | } 67 | ``` 68 | ```` 69 | 70 | > See [demo](http://up9cloud.github.io/docsify-mindmap) for more format 71 | 72 | ## Dev memo 73 | 74 | ```bash 75 | npm i 76 | npm run dev 77 | ``` 78 | 79 | ## TODO 80 | 81 | - [ ] Stop d3 resizing 82 | - [ ] To find another light weight mindmap render engine 83 | - [ ] Support markmap-lib 84 | -------------------------------------------------------------------------------- /build/webpack.config.base.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | entry: './src/docsify-mindmap.js', 3 | externals: [{ 4 | // d3: 'd3', 5 | markmap: 'markmap', 6 | // kityminder: 'kityminder-core' 7 | }] 8 | } 9 | -------------------------------------------------------------------------------- /build/webpack.config.build.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | const { merge } = require('webpack-merge') 4 | 5 | const webpackBaseConfig = require('./webpack.config.base.js') 6 | 7 | const env = process.env.NODE_ENV || 'production' 8 | const webpackConfig = merge(webpackBaseConfig, { 9 | mode: env, 10 | output: { 11 | path: path.resolve(__dirname, '..', 'dist'), 12 | filename: 'docsify-mindmap.min.js' 13 | } 14 | }) 15 | 16 | module.exports = webpackConfig 17 | -------------------------------------------------------------------------------- /build/webpack.config.dev.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const webpack = require('webpack') 3 | const { merge } = require('webpack-merge') 4 | const HtmlWebpackPlugin = require('html-webpack-plugin') 5 | const webpackBaseConfig = require('./webpack.config.base.js') 6 | 7 | const env = process.env.NODE_ENV || 'development' 8 | 9 | const webpackConfig = merge(webpackBaseConfig, { 10 | mode: env, 11 | target: 'web', 12 | devServer: { 13 | static: { 14 | directory: path.join(__dirname, '..'), 15 | }, 16 | open: true, 17 | port: 8080, 18 | hot: true 19 | }, 20 | plugins: [ 21 | new webpack.HotModuleReplacementPlugin(), 22 | new HtmlWebpackPlugin({ 23 | template: path.join(process.cwd(), 'docs', 'dev.html'), 24 | inject: true, 25 | hash: true 26 | }) 27 | ], 28 | devtool: 'inline-source-map' 29 | }) 30 | 31 | module.exports = webpackConfig 32 | -------------------------------------------------------------------------------- /docs/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/up9cloud/docsify-mindmap/a7028f5bb8eaa27046a4216a4805a8a079f8237a/docs/.nojekyll -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Test 2 | 3 | ## txtmap 4 | 5 | > Default is `txtmap` 6 | 7 | https://github.com/dundalek/markmap/blob/master/examples/data/example.txtmap 8 | 9 | ````md 10 | ```mindmap 11 | some 12 | example 13 | content 14 | for 15 | you 16 | to 17 | see 18 | the 19 | file 20 | structure 21 | ``` 22 | ```` 23 | 24 | ```mindmap txtmap 25 | some 26 | example 27 | content 28 | for 29 | you 30 | to 31 | see 32 | the 33 | file 34 | structure 35 | ``` 36 | -------------------------------------------------------------------------------- /docs/_sidebar.md: -------------------------------------------------------------------------------- 1 | - Render Engines by 2 | - [Default](/README.md) 3 | - [markmap json](/more/markmap.md) 4 | - [markmap json-mup](/more/markmap-json-mup.md) 5 | - [kityminder](/more/kityminder.md) 6 | - [markmap-lib md](/more/markmap-lib.md) 7 | - [Test](/more/not-mindmap.md) -------------------------------------------------------------------------------- /docs/build.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /docs/dev.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 19 | 20 |
21 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /docs/kityminder.build.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | KityMinder Example 6 | 7 | 8 | 24 | 25 | 26 | 27 | 28 | 29 | 52 | 53 | 54 | 62 | 63 | -------------------------------------------------------------------------------- /docs/more/kityminder.md: -------------------------------------------------------------------------------- 1 | # Test 2 | 3 | ## mindmap kityminder 4 | 5 | https://github.com/fex-team/kityminder-core/blob/dev/example.html 6 | 7 | > Alias: json-kityminder 8 | 9 | ```html 10 | 11 | 12 | 13 | 14 | ``` 15 | 16 | ````md 17 | ```mindmap kityminder 18 | { 19 | "root": { 20 | "data": { 21 | "text": "百度产品", 22 | "image": "https://www.baidu.com/img/bd_logo1.png?where=super", 23 | "imageSize": { "width": 270, "height": 129 } 24 | }, 25 | "children": [ 26 | { "data": { "text": "新闻" } }, 27 | { "data": { "text": "网页", "priority": 1 } }, 28 | { "data": { "text": "贴吧", "priority": 2 } }, 29 | { "data": { "text": "知道", "priority": 2 } }, 30 | { "data": { "text": "音乐", "priority": 3 } }, 31 | { "data": { "text": "图片", "priority": 3 } }, 32 | { "data": { "text": "视频", "priority": 3 } }, 33 | { "data": { "text": "地图", "priority": 3 } }, 34 | { "data": { "text": "百科", "priority": 3 } }, 35 | { "data": { "text": "更多", "hyperlink": "http://www.baidu.com/more" } } 36 | ] 37 | } 38 | } 39 | ``` 40 | ```` 41 | 42 | ```mindmap kityminder 43 | { 44 | "root": { 45 | "data": { 46 | "text": "百度产品", 47 | "image": "https://www.baidu.com/img/bd_logo1.png?where=super", 48 | "imageSize": { "width": 270, "height": 129 } 49 | }, 50 | "children": [ 51 | { "data": { "text": "新闻" } }, 52 | { "data": { "text": "网页", "priority": 1 } }, 53 | { "data": { "text": "贴吧", "priority": 2 } }, 54 | { "data": { "text": "知道", "priority": 2 } }, 55 | { "data": { "text": "音乐", "priority": 3 } }, 56 | { "data": { "text": "图片", "priority": 3 } }, 57 | { "data": { "text": "视频", "priority": 3 } }, 58 | { "data": { "text": "地图", "priority": 3 } }, 59 | { "data": { "text": "百科", "priority": 3 } }, 60 | { "data": { "text": "更多", "hyperlink": "http://www.baidu.com/more" } } 61 | ] 62 | } 63 | } 64 | ``` 65 | 66 | ## mindmap json-kityminder 67 | 68 | ```mindmap json-kityminder 69 | { 70 | "root": { 71 | "data": { 72 | "text": "百度产品", 73 | "image": "https://www.baidu.com/img/bd_logo1.png?where=super", 74 | "imageSize": { "width": 270, "height": 129 } 75 | }, 76 | "children": [ 77 | { "data": { "text": "新闻" } }, 78 | { "data": { "text": "网页", "priority": 1 } }, 79 | { "data": { "text": "贴吧", "priority": 2 } }, 80 | { "data": { "text": "知道", "priority": 2 } }, 81 | { "data": { "text": "音乐", "priority": 3 } }, 82 | { "data": { "text": "图片", "priority": 3 } }, 83 | { "data": { "text": "视频", "priority": 3 } }, 84 | { "data": { "text": "地图", "priority": 3 } }, 85 | { "data": { "text": "百科", "priority": 3 } }, 86 | { "data": { "text": "更多", "hyperlink": "http://www.baidu.com/more" } } 87 | ] 88 | } 89 | } 90 | ``` 91 | -------------------------------------------------------------------------------- /docs/more/markmap-json-mup.md: -------------------------------------------------------------------------------- 1 | # Test 2 | 3 | ## mindmap json-mup 4 | 5 | https://github.com/dundalek/markmap/blob/master/examples/data/MindMapping.mup 6 | 7 | ````md 8 | ```mindmap json-mup 9 | { ... } 10 | ``` 11 | ```` 12 | 13 | ```mindmap json-mup 14 | { 15 | "title": "MindMapping", 16 | "id": 1, 17 | "formatVersion": 2, 18 | "ideas": { 19 | "11": { 20 | "title": "Software", 21 | "id": 8, 22 | "ideas": { 23 | "1": { 24 | "title": "FreeMind", 25 | "id": 9 26 | }, 27 | "2": { 28 | "title": "XMind", 29 | "id": 10 30 | }, 31 | "3": { 32 | "title": "MindMeister", 33 | "id": 11 34 | }, 35 | "4": { 36 | "title": "iMindMap", 37 | "id": 13, 38 | "ideas": { 39 | "1": { 40 | "title": "by Tony Buzan", 41 | "id": 30 42 | } 43 | } 44 | }, 45 | "5": { 46 | "title": "MindManager", 47 | "id": 14 48 | }, 49 | "2.5": { 50 | "title": "MindMup", 51 | "id": 12 52 | } 53 | } 54 | }, 55 | "21": { 56 | "title": "Misc", 57 | "id": 15, 58 | "ideas": { 59 | "1": { 60 | "title": "Visual Understanding Environment (VUE)", 61 | "id": 23, 62 | "ideas": { 63 | "1": { 64 | "title": "http://vue.tufts.edu/index.cfm", 65 | "id": 24 66 | } 67 | } 68 | }, 69 | "2": { 70 | "title": "TiddlyMap", 71 | "id": 26 72 | }, 73 | "3": { 74 | "title": "Orgmode.org", 75 | "id": 27 76 | }, 77 | "4": { 78 | "title": "https://www.moh.io/mohiomap", 79 | "id": 31, 80 | "ideas": {} 81 | } 82 | } 83 | }, 84 | "31": { 85 | "title": "Resources", 86 | "id": 2, 87 | "ideas": { 88 | "1": { 89 | "title": "http://lifehacker.com/five-best-mind-mapping-tools-476534555", 90 | "id": 18 91 | }, 92 | "2": { 93 | "title": "http://lifehacker.com/5188833/hive-five-five-best-mind-mapping-applications", 94 | "id": 19 95 | }, 96 | "3": { 97 | "title": "https://en.wikipedia.org/wiki/List_of_concept-_and_mind-mapping_software", 98 | "id": 21 99 | } 100 | }, 101 | "attr": { 102 | "position": [ 103 | 67.5, 104 | 255, 105 | 1 106 | ], 107 | "style": {} 108 | } 109 | } 110 | } 111 | } 112 | ``` 113 | -------------------------------------------------------------------------------- /docs/more/markmap-lib.md: -------------------------------------------------------------------------------- 1 | # Test 2 | 3 | `https://markmap.js.org/repl` 4 | 5 | ## md 6 | 7 | ````md 8 | ```mindmap md 9 | ... 10 | ``` 11 | ```` 12 | 13 | ```mindmap md 14 | # md 15 | 16 | ## Links 17 | 18 | - [Website](https://markmap.js.org/) 19 | - [GitHub](https://github.com/gera2ld/markmap) 20 | 21 | ## Related Projects 22 | 23 | - [coc-markmap](https://github.com/gera2ld/coc-markmap) for Neovim 24 | - [markmap-vscode](https://marketplace.visualstudio.com/items?itemName=gera2ld.markmap-vscode) for VSCode 25 | - [eaf-markmap](https://github.com/emacs-eaf/eaf-markmap) for Emacs 26 | ``` -------------------------------------------------------------------------------- /docs/more/markmap.md: -------------------------------------------------------------------------------- 1 | # Test 2 | 3 | ## mindmap json-tree 4 | 5 | > Alias: json, flare, tree 6 | 7 | ````md 8 | ```mindmap json-tree 9 | { 10 | "name": "root", 11 | "children": [ 12 | { "name": "hello" }, 13 | { "name": "world" } 14 | ] 15 | } 16 | ``` 17 | ```` 18 | 19 | ```mindmap json-tree 20 | { 21 | "name": "json-tree", 22 | "children": [ 23 | { "name": "hello" }, 24 | { "name": "world" } 25 | ] 26 | } 27 | ``` 28 | 29 | ## mindmap json 30 | 31 | ````md 32 | ```mindmap json 33 | { ... } 34 | ``` 35 | ```` 36 | 37 | ```mindmap json 38 | { 39 | "name": "json", 40 | "children": [ 41 | { "name": "hello" }, 42 | { "name": "world" } 43 | ] 44 | } 45 | ``` 46 | 47 | ## mindmap flare 48 | 49 | ````md 50 | ```mindmap flare 51 | { ... } 52 | ``` 53 | ```` 54 | 55 | ```mindmap flare 56 | { 57 | "name": "flare", 58 | "children": [ 59 | { 60 | "name": "analytics", 61 | "children": [ 62 | { 63 | "name": "cluster", 64 | "children": [ 65 | {"name": "AgglomerativeCluster", "size": 3938}, 66 | {"name": "CommunityStructure", "size": 3812}, 67 | {"name": "HierarchicalCluster", "size": 6714}, 68 | {"name": "MergeEdge", "size": 743} 69 | ] 70 | }, 71 | { 72 | "name": "graph", 73 | "children": [ 74 | {"name": "BetweennessCentrality", "size": 3534}, 75 | {"name": "LinkDistance", "size": 5731}, 76 | {"name": "MaxFlowMinCut", "size": 7840}, 77 | {"name": "ShortestPaths", "size": 5914}, 78 | {"name": "SpanningTree", "size": 3416} 79 | ] 80 | }, 81 | { 82 | "name": "optimization", 83 | "children": [ 84 | {"name": "AspectRatioBanker", "size": 7074} 85 | ] 86 | } 87 | ] 88 | }, 89 | { 90 | "name": "animate", 91 | "children": [ 92 | {"name": "Easing", "size": 17010}, 93 | {"name": "FunctionSequence", "size": 5842}, 94 | { 95 | "name": "interpolate", 96 | "children": [ 97 | {"name": "ArrayInterpolator", "size": 1983}, 98 | {"name": "ColorInterpolator", "size": 2047}, 99 | {"name": "DateInterpolator", "size": 1375}, 100 | {"name": "Interpolator", "size": 8746}, 101 | {"name": "MatrixInterpolator", "size": 2202}, 102 | {"name": "NumberInterpolator", "size": 1382}, 103 | {"name": "ObjectInterpolator", "size": 1629}, 104 | {"name": "PointInterpolator", "size": 1675}, 105 | {"name": "RectangleInterpolator", "size": 2042} 106 | ] 107 | }, 108 | {"name": "ISchedulable", "size": 1041}, 109 | {"name": "Parallel", "size": 5176}, 110 | {"name": "Pause", "size": 449}, 111 | {"name": "Scheduler", "size": 5593}, 112 | {"name": "Sequence", "size": 5534}, 113 | {"name": "Transition", "size": 9201}, 114 | {"name": "Transitioner", "size": 19975}, 115 | {"name": "TransitionEvent", "size": 1116}, 116 | {"name": "Tween", "size": 6006} 117 | ] 118 | }, 119 | { 120 | "name": "data", 121 | "children": [ 122 | { 123 | "name": "converters", 124 | "children": [ 125 | {"name": "Converters", "size": 721}, 126 | {"name": "DelimitedTextConverter", "size": 4294}, 127 | {"name": "GraphMLConverter", "size": 9800}, 128 | {"name": "IDataConverter", "size": 1314}, 129 | {"name": "JSONConverter", "size": 2220} 130 | ] 131 | }, 132 | {"name": "DataField", "size": 1759}, 133 | {"name": "DataSchema", "size": 2165}, 134 | {"name": "DataSet", "size": 586}, 135 | {"name": "DataSource", "size": 3331}, 136 | {"name": "DataTable", "size": 772}, 137 | {"name": "DataUtil", "size": 3322} 138 | ] 139 | }, 140 | { 141 | "name": "display", 142 | "children": [ 143 | {"name": "DirtySprite", "size": 8833}, 144 | {"name": "LineSprite", "size": 1732}, 145 | {"name": "RectSprite", "size": 3623}, 146 | {"name": "TextSprite", "size": 10066} 147 | ] 148 | }, 149 | { 150 | "name": "flex", 151 | "children": [ 152 | {"name": "FlareVis", "size": 4116} 153 | ] 154 | }, 155 | { 156 | "name": "physics", 157 | "children": [ 158 | {"name": "DragForce", "size": 1082}, 159 | {"name": "GravityForce", "size": 1336}, 160 | {"name": "IForce", "size": 319}, 161 | {"name": "NBodyForce", "size": 10498}, 162 | {"name": "Particle", "size": 2822}, 163 | {"name": "Simulation", "size": 9983}, 164 | {"name": "Spring", "size": 2213}, 165 | {"name": "SpringForce", "size": 1681} 166 | ] 167 | }, 168 | { 169 | "name": "query", 170 | "children": [ 171 | {"name": "AggregateExpression", "size": 1616}, 172 | {"name": "And", "size": 1027}, 173 | {"name": "Arithmetic", "size": 3891}, 174 | {"name": "Average", "size": 891}, 175 | {"name": "BinaryExpression", "size": 2893}, 176 | {"name": "Comparison", "size": 5103}, 177 | {"name": "CompositeExpression", "size": 3677}, 178 | {"name": "Count", "size": 781}, 179 | {"name": "DateUtil", "size": 4141}, 180 | {"name": "Distinct", "size": 933}, 181 | {"name": "Expression", "size": 5130}, 182 | {"name": "ExpressionIterator", "size": 3617}, 183 | {"name": "Fn", "size": 3240}, 184 | {"name": "If", "size": 2732}, 185 | {"name": "IsA", "size": 2039}, 186 | {"name": "Literal", "size": 1214}, 187 | {"name": "Match", "size": 3748}, 188 | {"name": "Maximum", "size": 843}, 189 | { 190 | "name": "methods", 191 | "children": [ 192 | {"name": "add", "size": 593}, 193 | {"name": "and", "size": 330}, 194 | {"name": "average", "size": 287}, 195 | {"name": "count", "size": 277}, 196 | {"name": "distinct", "size": 292}, 197 | {"name": "div", "size": 595}, 198 | {"name": "eq", "size": 594}, 199 | {"name": "fn", "size": 460}, 200 | {"name": "gt", "size": 603}, 201 | {"name": "gte", "size": 625}, 202 | {"name": "iff", "size": 748}, 203 | {"name": "isa", "size": 461}, 204 | {"name": "lt", "size": 597}, 205 | {"name": "lte", "size": 619}, 206 | {"name": "max", "size": 283}, 207 | {"name": "min", "size": 283}, 208 | {"name": "mod", "size": 591}, 209 | {"name": "mul", "size": 603}, 210 | {"name": "neq", "size": 599}, 211 | {"name": "not", "size": 386}, 212 | {"name": "or", "size": 323}, 213 | {"name": "orderby", "size": 307}, 214 | {"name": "range", "size": 772}, 215 | {"name": "select", "size": 296}, 216 | {"name": "stddev", "size": 363}, 217 | {"name": "sub", "size": 600}, 218 | {"name": "sum", "size": 280}, 219 | {"name": "update", "size": 307}, 220 | {"name": "variance", "size": 335}, 221 | {"name": "where", "size": 299}, 222 | {"name": "xor", "size": 354}, 223 | {"name": "_", "size": 264} 224 | ] 225 | }, 226 | {"name": "Minimum", "size": 843}, 227 | {"name": "Not", "size": 1554}, 228 | {"name": "Or", "size": 970}, 229 | {"name": "Query", "size": 13896}, 230 | {"name": "Range", "size": 1594}, 231 | {"name": "StringUtil", "size": 4130}, 232 | {"name": "Sum", "size": 791}, 233 | {"name": "Variable", "size": 1124}, 234 | {"name": "Variance", "size": 1876}, 235 | {"name": "Xor", "size": 1101} 236 | ] 237 | }, 238 | { 239 | "name": "scale", 240 | "children": [ 241 | {"name": "IScaleMap", "size": 2105}, 242 | {"name": "LinearScale", "size": 1316}, 243 | {"name": "LogScale", "size": 3151}, 244 | {"name": "OrdinalScale", "size": 3770}, 245 | {"name": "QuantileScale", "size": 2435}, 246 | {"name": "QuantitativeScale", "size": 4839}, 247 | {"name": "RootScale", "size": 1756}, 248 | {"name": "Scale", "size": 4268}, 249 | {"name": "ScaleType", "size": 1821}, 250 | {"name": "TimeScale", "size": 5833} 251 | ] 252 | }, 253 | { 254 | "name": "util", 255 | "children": [ 256 | {"name": "Arrays", "size": 8258}, 257 | {"name": "Colors", "size": 10001}, 258 | {"name": "Dates", "size": 8217}, 259 | {"name": "Displays", "size": 12555}, 260 | {"name": "Filter", "size": 2324}, 261 | {"name": "Geometry", "size": 10993}, 262 | { 263 | "name": "heap", 264 | "children": [ 265 | {"name": "FibonacciHeap", "size": 9354}, 266 | {"name": "HeapNode", "size": 1233} 267 | ] 268 | }, 269 | {"name": "IEvaluable", "size": 335}, 270 | {"name": "IPredicate", "size": 383}, 271 | {"name": "IValueProxy", "size": 874}, 272 | { 273 | "name": "math", 274 | "children": [ 275 | {"name": "DenseMatrix", "size": 3165}, 276 | {"name": "IMatrix", "size": 2815}, 277 | {"name": "SparseMatrix", "size": 3366} 278 | ] 279 | }, 280 | {"name": "Maths", "size": 17705}, 281 | {"name": "Orientation", "size": 1486}, 282 | { 283 | "name": "palette", 284 | "children": [ 285 | {"name": "ColorPalette", "size": 6367}, 286 | {"name": "Palette", "size": 1229}, 287 | {"name": "ShapePalette", "size": 2059}, 288 | {"name": "SizePalette", "size": 2291} 289 | ] 290 | }, 291 | {"name": "Property", "size": 5559}, 292 | {"name": "Shapes", "size": 19118}, 293 | {"name": "Sort", "size": 6887}, 294 | {"name": "Stats", "size": 6557}, 295 | {"name": "Strings", "size": 22026} 296 | ] 297 | }, 298 | { 299 | "name": "vis", 300 | "children": [ 301 | { 302 | "name": "axis", 303 | "children": [ 304 | {"name": "Axes", "size": 1302}, 305 | {"name": "Axis", "size": 24593}, 306 | {"name": "AxisGridLine", "size": 652}, 307 | {"name": "AxisLabel", "size": 636}, 308 | {"name": "CartesianAxes", "size": 6703} 309 | ] 310 | }, 311 | { 312 | "name": "controls", 313 | "children": [ 314 | {"name": "AnchorControl", "size": 2138}, 315 | {"name": "ClickControl", "size": 3824}, 316 | {"name": "Control", "size": 1353}, 317 | {"name": "ControlList", "size": 4665}, 318 | {"name": "DragControl", "size": 2649}, 319 | {"name": "ExpandControl", "size": 2832}, 320 | {"name": "HoverControl", "size": 4896}, 321 | {"name": "IControl", "size": 763}, 322 | {"name": "PanZoomControl", "size": 5222}, 323 | {"name": "SelectionControl", "size": 7862}, 324 | {"name": "TooltipControl", "size": 8435} 325 | ] 326 | }, 327 | { 328 | "name": "data", 329 | "children": [ 330 | {"name": "Data", "size": 20544}, 331 | {"name": "DataList", "size": 19788}, 332 | {"name": "DataSprite", "size": 10349}, 333 | {"name": "EdgeSprite", "size": 3301}, 334 | {"name": "NodeSprite", "size": 19382}, 335 | { 336 | "name": "render", 337 | "children": [ 338 | {"name": "ArrowType", "size": 698}, 339 | {"name": "EdgeRenderer", "size": 5569}, 340 | {"name": "IRenderer", "size": 353}, 341 | {"name": "ShapeRenderer", "size": 2247} 342 | ] 343 | }, 344 | {"name": "ScaleBinding", "size": 11275}, 345 | {"name": "Tree", "size": 7147}, 346 | {"name": "TreeBuilder", "size": 9930} 347 | ] 348 | }, 349 | { 350 | "name": "events", 351 | "children": [ 352 | {"name": "DataEvent", "size": 2313}, 353 | {"name": "SelectionEvent", "size": 1880}, 354 | {"name": "TooltipEvent", "size": 1701}, 355 | {"name": "VisualizationEvent", "size": 1117} 356 | ] 357 | }, 358 | { 359 | "name": "legend", 360 | "children": [ 361 | {"name": "Legend", "size": 20859}, 362 | {"name": "LegendItem", "size": 4614}, 363 | {"name": "LegendRange", "size": 10530} 364 | ] 365 | }, 366 | { 367 | "name": "operator", 368 | "children": [ 369 | { 370 | "name": "distortion", 371 | "children": [ 372 | {"name": "BifocalDistortion", "size": 4461}, 373 | {"name": "Distortion", "size": 6314}, 374 | {"name": "FisheyeDistortion", "size": 3444} 375 | ] 376 | }, 377 | { 378 | "name": "encoder", 379 | "children": [ 380 | {"name": "ColorEncoder", "size": 3179}, 381 | {"name": "Encoder", "size": 4060}, 382 | {"name": "PropertyEncoder", "size": 4138}, 383 | {"name": "ShapeEncoder", "size": 1690}, 384 | {"name": "SizeEncoder", "size": 1830} 385 | ] 386 | }, 387 | { 388 | "name": "filter", 389 | "children": [ 390 | {"name": "FisheyeTreeFilter", "size": 5219}, 391 | {"name": "GraphDistanceFilter", "size": 3165}, 392 | {"name": "VisibilityFilter", "size": 3509} 393 | ] 394 | }, 395 | {"name": "IOperator", "size": 1286}, 396 | { 397 | "name": "label", 398 | "children": [ 399 | {"name": "Labeler", "size": 9956}, 400 | {"name": "RadialLabeler", "size": 3899}, 401 | {"name": "StackedAreaLabeler", "size": 3202} 402 | ] 403 | }, 404 | { 405 | "name": "layout", 406 | "children": [ 407 | {"name": "AxisLayout", "size": 6725}, 408 | {"name": "BundledEdgeRouter", "size": 3727}, 409 | {"name": "CircleLayout", "size": 9317}, 410 | {"name": "CirclePackingLayout", "size": 12003}, 411 | {"name": "DendrogramLayout", "size": 4853}, 412 | {"name": "ForceDirectedLayout", "size": 8411}, 413 | {"name": "IcicleTreeLayout", "size": 4864}, 414 | {"name": "IndentedTreeLayout", "size": 3174}, 415 | {"name": "Layout", "size": 7881}, 416 | {"name": "NodeLinkTreeLayout", "size": 12870}, 417 | {"name": "PieLayout", "size": 2728}, 418 | {"name": "RadialTreeLayout", "size": 12348}, 419 | {"name": "RandomLayout", "size": 870}, 420 | {"name": "StackedAreaLayout", "size": 9121}, 421 | {"name": "TreeMapLayout", "size": 9191} 422 | ] 423 | }, 424 | {"name": "Operator", "size": 2490}, 425 | {"name": "OperatorList", "size": 5248}, 426 | {"name": "OperatorSequence", "size": 4190}, 427 | {"name": "OperatorSwitch", "size": 2581}, 428 | {"name": "SortOperator", "size": 2023} 429 | ] 430 | }, 431 | {"name": "Visualization", "size": 16540} 432 | ] 433 | } 434 | ] 435 | } 436 | ``` 437 | 438 | ## mindmap tree 439 | 440 | ````md 441 | ```mindmap tree 442 | { ... } 443 | ``` 444 | ```` 445 | 446 | ```mindmap tree 447 | { 448 | "depth": 1, 449 | "line": 1, 450 | "name": "A General Theory of Reactivity", 451 | "children": [ 452 | { 453 | "depth": 2, 454 | "line": 45, 455 | "name": "Concepts", 456 | "children": [ 457 | { 458 | "depth": 3, 459 | "line": 101, 460 | "name": "Singular and temporal" 461 | }, 462 | { 463 | "depth": 3, 464 | "line": 151, 465 | "name": "Plural and temporal" 466 | } 467 | ] 468 | }, 469 | { 470 | "depth": 2, 471 | "line": 237, 472 | "name": "Primitives", 473 | "children": [ 474 | { 475 | "depth": 3, 476 | "line": 244, 477 | "name": "Iterators" 478 | }, 479 | { 480 | "depth": 3, 481 | "line": 363, 482 | "name": "Generator Functions" 483 | }, 484 | { 485 | "depth": 3, 486 | "line": 475, 487 | "name": "Generators" 488 | }, 489 | { 490 | "depth": 3, 491 | "line": 505, 492 | "name": "Asynchronous Values" 493 | }, 494 | { 495 | "depth": 3, 496 | "line": 653, 497 | "name": "Asynchronous Functions" 498 | }, 499 | { 500 | "depth": 3, 501 | "line": 748, 502 | "name": "Promise Queues" 503 | }, 504 | { 505 | "depth": 3, 506 | "line": 851, 507 | "name": "Semaphores" 508 | }, 509 | { 510 | "depth": 3, 511 | "line": 897, 512 | "name": "Promise Buffers", 513 | "children": [ 514 | { 515 | "depth": 4, 516 | "line": 959, 517 | "name": " means “write”." 518 | }, 519 | { 520 | "depth": 4, 521 | "line": 960, 522 | "name": " means “close”." 523 | }, 524 | { 525 | "depth": 4, 526 | "line": 961, 527 | "name": " means “terminate prematurely with an error”." 528 | }, 529 | { 530 | "depth": 4, 531 | "line": 962, 532 | "name": " means “read”." 533 | }, 534 | { 535 | "depth": 4, 536 | "line": 963, 537 | "name": " means “abort or cancel with an error”." 538 | }, 539 | { 540 | "depth": 4, 541 | "line": 964, 542 | "name": " means “abort or cancel prematurely but without an error”." 543 | } 544 | ] 545 | }, 546 | { 547 | "depth": 3, 548 | "line": 1013, 549 | "name": "Promise Iterators", 550 | "children": [ 551 | { 552 | "depth": 4, 553 | "line": 1056, 554 | "name": "map" 555 | }, 556 | { 557 | "depth": 4, 558 | "line": 1076, 559 | "name": "forEach" 560 | }, 561 | { 562 | "depth": 4, 563 | "line": 1119, 564 | "name": "reduce" 565 | }, 566 | { 567 | "depth": 4, 568 | "line": 1135, 569 | "name": "pipe" 570 | }, 571 | { 572 | "depth": 4, 573 | "line": 1151, 574 | "name": "buffer" 575 | }, 576 | { 577 | "depth": 4, 578 | "line": 1159, 579 | "name": "read" 580 | }, 581 | { 582 | "depth": 4, 583 | "line": 1169, 584 | "name": "Remote iterators" 585 | } 586 | ] 587 | }, 588 | { 589 | "depth": 3, 590 | "line": 1194, 591 | "name": "Promise Generators" 592 | }, 593 | { 594 | "depth": 3, 595 | "line": 1232, 596 | "name": "Asynchronous Generator Functions" 597 | }, 598 | { 599 | "depth": 3, 600 | "line": 1413, 601 | "name": "Observables", 602 | "children": [ 603 | { 604 | "depth": 4, 605 | "line": 1484, 606 | "name": "TODO make sure this is a summary of the topics in the end:" 607 | } 608 | ] 609 | }, 610 | { 611 | "depth": 3, 612 | "line": 1490, 613 | "name": "Observables and Signals" 614 | }, 615 | { 616 | "depth": 3, 617 | "line": 1561, 618 | "name": "Behaviors" 619 | } 620 | ] 621 | }, 622 | { 623 | "depth": 2, 624 | "line": 1579, 625 | "name": "Cases", 626 | "children": [ 627 | { 628 | "depth": 3, 629 | "line": 1581, 630 | "name": "Progress and estimated time to completion" 631 | } 632 | ] 633 | }, 634 | { 635 | "depth": 2, 636 | "line": 1635, 637 | "name": "Summary" 638 | }, 639 | { 640 | "depth": 2, 641 | "line": 1665, 642 | "name": "Further Work" 643 | }, 644 | { 645 | "depth": 2, 646 | "line": 1745, 647 | "name": "Acknowledgements" 648 | } 649 | ] 650 | } 651 | ``` 652 | -------------------------------------------------------------------------------- /docs/more/not-mindmap.md: -------------------------------------------------------------------------------- 1 | # Test 2 | 3 | ## Not mindmap 4 | 5 | ````md 6 | ```txt 7 | a b c 8 | ``` 9 | ```` 10 | 11 | ```txt 12 | a b c 13 | ``` 14 | 15 | ## Unknown mindmap 16 | 17 | ````md 18 | ```mindmap whatever 19 | a b c 20 | ``` 21 | ```` 22 | 23 | ```mindmap whatever 24 | a b c 25 | ``` 26 | 27 | ## indentation 28 | 29 | ````md 30 | - bla 31 | ```mindmap 32 | a 33 | b 34 | ``` 35 | ```` 36 | 37 | - bla 38 | ```mindmap 39 | a 40 | b 41 | ``` 42 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docsify-mindmap", 3 | "version": "0.1.2", 4 | "description": "Mind map plugin for docsify", 5 | "main": "src/docsify-mindmap.js", 6 | "directories": { 7 | "test": "test" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git@github.com:up9cloud/docsify-mindmap.git" 12 | }, 13 | "scripts": { 14 | "dev": "webpack-dev-server --config build/webpack.config.dev.js", 15 | "build": "webpack --config build/webpack.config.build.js", 16 | "test": "echo \"Error: no test specified\" && exit 0" 17 | }, 18 | "keywords": [ 19 | "docsify", 20 | "mindmap", 21 | "plugin", 22 | "markmap", 23 | "kityminder" 24 | ], 25 | "author": "up9cloud (https://github.com/up9cloud)", 26 | "license": "MIT", 27 | "files": [ 28 | "dist/docsify-mindmap.min.js", 29 | "README.md" 30 | ], 31 | "devDependencies": { 32 | "kityminder-core": "^1.4.50", 33 | "markmap": "^0.6.1", 34 | "markmap-lib": "^0.17.0", 35 | "markmap-render": "^0.17.0", 36 | "html-webpack-plugin": "^5.5.0", 37 | "webpack": "^5.74.0", 38 | "webpack-cli": "^4.9.2", 39 | "webpack-dev-server": "^4.7.4", 40 | "webpack-merge": "^5.8.0" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/docsify-mindmap.js: -------------------------------------------------------------------------------- 1 | import markmap from 'markmap' 2 | import parseTxt from 'markmap/lib/parse.txtmap.js' 3 | import transform from 'markmap/lib/transform.headings.js' 4 | import transformMindmup from 'markmap/lib/transform.mindmup.js' 5 | 6 | // import 'kityminder-core/dist/kityminder.core.js' 7 | 8 | // import { Transformer } from 'markmap-lib' 9 | // import { fillTemplate } from 'markmap-render'; 10 | // const transformer = new Transformer() 11 | 12 | const id = 'mindmap' 13 | function parseContent(rawContent, dataType) { 14 | let data, engine 15 | switch (dataType) { 16 | // https://github.com/dundalek/markmap/blob/master/examples/browser/example.txtmap.js 17 | case 'txt': 18 | case 'txtmap': 19 | data = transform(parseTxt(rawContent)) 20 | engine = 'markmap' 21 | break 22 | case 'json': 23 | case 'flare': 24 | case 'json-flare': 25 | case 'tree': 26 | case 'json-tree': 27 | try { 28 | data = JSON.parse(rawContent) 29 | engine = 'markmap' 30 | } catch (e) {} 31 | break 32 | case 'mup': 33 | case 'json-mup': 34 | try { 35 | data = transformMindmup(JSON.parse(rawContent)) 36 | engine = 'markmap' 37 | } catch (e) {} 38 | break 39 | // TODO: 40 | case 'kityminder': 41 | case 'json-kityminder': 42 | data = rawContent 43 | engine = 'kityminder' 44 | break 45 | // case 'md': { 46 | // try { 47 | // const { root, features } = transformer.transform(markdown) 48 | // data = root 49 | // console.log(root, features) 50 | // engine = 'markmap-lib' 51 | // } catch (e) {} 52 | // } 53 | } 54 | return { data, engine } 55 | } 56 | function countTree (tree, { height = 0, depth = 0 } = {}) { 57 | depth++ 58 | if (tree.hasOwnProperty('children') && tree.children && tree.children.length > 0) { 59 | let maxDepth = depth 60 | for (const node of tree.children) { 61 | let o = countTree(node, { height: 0, depth }) 62 | height += o.height 63 | if (o.depth > maxDepth) { 64 | maxDepth = o.depth 65 | } 66 | } 67 | depth = maxDepth 68 | } else { 69 | height++ 70 | } 71 | return { height, depth } 72 | } 73 | function install (hook, { config = {} } = {}) { 74 | if (!config[id]) { 75 | config[id] = {} 76 | } 77 | if (!config[id].markmap) { 78 | config[id].markmap = {} 79 | } 80 | // Backward compatible 81 | for (const k of [ 82 | 'preset', 83 | 'linkShape' 84 | ]) { 85 | if (config[id][k]) { 86 | config[id].markmap[k] = config[id][k] 87 | } 88 | } 89 | if (!config.markdown) { 90 | config.markdown = {} 91 | } 92 | if (!config.markdown.renderer) { 93 | config.markdown.renderer = {} 94 | } 95 | let renderJobs = [] 96 | const conflict =config.markdown.renderer.code 97 | config.markdown.renderer.code = function(code, lang) { 98 | const ll = lang.split(' ') 99 | const mainLang = ll[0] 100 | if (mainLang === id) { 101 | const dataType = ll[1] || 'txtmap' 102 | const { data, engine } = parseContent(code, dataType) 103 | switch (engine) { 104 | case 'markmap': { 105 | const randomId = `${id}-${engine}-${Math.random().toString().substring(2)}` 106 | const o = countTree(data) 107 | let html = '' 108 | if (o.height > 3) { // default d3 block height is 150, should be fine with 3 items 109 | const multi = 1 + Math.round(o.height / 6) 110 | let height = multi * 150 111 | if (multi > o.depth) { 112 | height = o.depth * 150 113 | } 114 | html = `` 115 | } else { 116 | html = `` 117 | } 118 | renderJobs.push(function () { 119 | markmap(`svg#${randomId}`, data, config[id].markmap) 120 | }) 121 | return html 122 | } 123 | case 'kityminder': { 124 | const randomId = `${id}-${engine}-${Math.random().toString().substring(2)}` 125 | renderJobs.push(function () { 126 | // new kityminder.Minder({ // eslint-disable-line no-new 127 | // renderTo: `div#${randomId}` 128 | // }) 129 | var km = new kityminder.Minder() 130 | km.setup(`#${randomId}`) 131 | }) 132 | return `` 133 | // return `
` 134 | } 135 | // case 'markmap-lib': { 136 | // const html = fillTemplate(data) 137 | // return html 138 | // } 139 | } 140 | } 141 | if (conflict) { 142 | return conflict.apply(this, arguments) 143 | } 144 | return this.origin.code.apply(this, arguments); 145 | } 146 | hook.beforeEach(function (markdown) { 147 | renderJobs = [] 148 | return markdown; 149 | }) 150 | hook.doneEach(function () { 151 | for (const job of renderJobs) { 152 | job() 153 | } 154 | }) 155 | } 156 | if (!window.$docsify) { 157 | window.$docsify = {} 158 | } 159 | window.$docsify.plugins = [].concat(install, window.$docsify.plugins) 160 | --------------------------------------------------------------------------------