├── .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 |
--------------------------------------------------------------------------------