├── .gitignore ├── README.md ├── dest └── js │ ├── app.js │ ├── app_only.js │ ├── highlight.pack.js │ ├── html2enml.js │ ├── html2enml_only.js │ └── require.js ├── gulpfile.js ├── package.json ├── src └── js │ ├── app.js │ ├── html2enml.js │ └── lib │ ├── css.min.js │ ├── html2canvas.js │ ├── jquery-3.1.0.min.js │ └── styles │ ├── agate.css │ ├── androidstudio.css │ ├── arduino-light.css │ ├── arta.css │ ├── ascetic.css │ ├── atelier-cave-dark.css │ ├── atelier-cave-light.css │ ├── atelier-dune-dark.css │ ├── atelier-dune-light.css │ ├── atelier-estuary-dark.css │ ├── atelier-estuary-light.css │ ├── atelier-forest-dark.css │ ├── atelier-forest-light.css │ ├── atelier-heath-dark.css │ ├── atelier-heath-light.css │ ├── atelier-lakeside-dark.css │ ├── atelier-lakeside-light.css │ ├── atelier-plateau-dark.css │ ├── atelier-plateau-light.css │ ├── atelier-savanna-dark.css │ ├── atelier-savanna-light.css │ ├── atelier-seaside-dark.css │ ├── atelier-seaside-light.css │ ├── atelier-sulphurpool-dark.css │ ├── atelier-sulphurpool-light.css │ ├── brown-paper.css │ ├── brown-papersq.png │ ├── codepen-embed.css │ ├── color-brewer.css │ ├── dark.css │ ├── darkula.css │ ├── default.css │ ├── docco.css │ ├── dracula.css │ ├── far.css │ ├── foundation.css │ ├── github-gist.css │ ├── github.css │ ├── googlecode.css │ ├── grayscale.css │ ├── gruvbox-dark.css │ ├── gruvbox-light.css │ ├── hopscotch.css │ ├── hybrid.css │ ├── idea.css │ ├── ir-black.css │ ├── kimbie.dark.css │ ├── kimbie.light.css │ ├── magula.css │ ├── mono-blue.css │ ├── monokai-sublime.css │ ├── monokai.css │ ├── obsidian.css │ ├── ocean.css │ ├── paraiso-dark.css │ ├── paraiso-light.css │ ├── pojoaque.css │ ├── pojoaque.jpg │ ├── purebasic.css │ ├── qtcreator_dark.css │ ├── qtcreator_light.css │ ├── railscasts.css │ ├── rainbow.css │ ├── school-book.css │ ├── school-book.png │ ├── solarized-dark.css │ ├── solarized-light.css │ ├── sunburst.css │ ├── tomorrow-night-blue.css │ ├── tomorrow-night-bright.css │ ├── tomorrow-night-eighties.css │ ├── tomorrow-night.css │ ├── tomorrow.css │ ├── vs.css │ ├── xcode.css │ ├── xt256.css │ └── zenburn.css └── test ├── alltest.html ├── asset ├── echarts.common.min.js ├── font-awesome │ ├── HELP-US-OUT.txt │ ├── css │ │ ├── font-awesome.css │ │ └── font-awesome.min.css │ └── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 ├── jquery_plantuml │ ├── encode64.js │ ├── example.html │ ├── jquery.js │ ├── jquery_plantuml.js │ └── rawdeflate.js ├── mermaid.css ├── mermaid.min.js └── style.css └── svg.svg /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | 3 | *.pyc 4 | node_modules/ 5 | /tests/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 使用方法 2 | 引入 `dest/js/html2enml.js` 3 | 4 | ```HTML 5 | 6 | ``` 7 | 8 | 然后实例化 html2enml类,并按照顺序调用成员方法。 9 | 10 | ```javascript 11 | var h2e=new html2enml(); 12 | // 调用成员方法 13 | h2e.xxx 14 | ``` 15 | 16 | ## 一些需要二次处理的地方 17 | ### 1. 根节点还需处理 18 | 但由于浏览器环境所限,最终只能做到如下的格式: 19 | 20 | ```HTML 21 | 22 | 23 | ... 24 | 25 | 26 | ``` 27 | 需要你去除最外层的``和``,取出``中的内容,并按照ENML 的规范在头部加上如下声明: 28 | 29 | ```HTML 30 | 31 | 32 | ``` 33 | 具体可参考: 34 | [印象笔记开发者文档-创建笔记](https://dev.yinxiang.com/doc/articles/creating_notes.php) 35 | [印象笔记开发者文档-ENML 规范](https://dev.yinxiang.com/doc/articles/enml.php) 36 | 37 | ### 2. `
`和`
`需做闭合处理 38 | 39 | 因为在浏览器环境中,无法做到闭合`
`和`
`节点。所以需要进行二次处理,这里给出我写的 Python 的处理方式: 40 | 41 | ```python 42 | # 正则匹配出 html 中的 tag 标签,在它">"前加入"/"闭合它。 43 | def addClose(tag, html): 44 | # '(
)|(
)' 45 | # '(
)|(
)' 46 | re_str = '(<%s>)|(<%s .*?[^/]>)' % (tag, tag) 47 | br_re = re.compile(re_str) 48 | lists = br_re.findall(html) 49 | 50 | for li in lists: 51 | for part in li: 52 | if part: 53 | html = html.replace(part, part[:-1] + '/>') 54 | 55 | return html 56 | ``` 57 | 58 | 创建笔记代码如下 59 | 60 | ```python 61 | def makeNote(authToken, noteStore, noteTitle, noteBody, parentNotebook=None): 62 | # 闭合 br 和 hr 标签 63 | noteBody = addClose('br', noteBody) 64 | noteBody = addClose('hr', noteBody) 65 | 66 | # 为补充头部声明 67 | nBody = "" 68 | nBody += "" 69 | nBody = '%s%s' % (nBody, noteBody) 70 | 71 | # 创建 Note 对象 72 | ourNote = Note() 73 | ourNote.title = noteTitle # 设置标题 74 | ourNote.content = nBody # 设置内容 75 | 76 | # 设置所属笔记本 77 | if parentNotebook and hasattr(parentNotebook, 'guid'): 78 | ourNote.notebookGuid = parentNotebook.guid 79 | 80 | try: 81 | # 创建笔记 82 | note = noteStore.createNote(authToken, ourNote) 83 | except EDAMUserException, edue: 84 | print "EDAMUserException:", edue 85 | return None 86 | except EDAMNotFoundException, ednfe: 87 | print "EDAMNotFoundException: Invalid parent notebook GUID" 88 | return None 89 | return note 90 | ``` 91 | 92 | # 转换过程 93 | 1. transCssByAllStyle() 94 | 95 | 将页面中所有` 97 | 98 | 99 | 111 | 112 | 113 | 114 |

Markdown 语法和 MWeb 写作使用说明

115 | 116 |

Markdown 的设计哲学

117 | 118 |
119 |

Markdown 的目標是實現「易讀易寫」。
120 | 不過最需要強調的便是它的可讀性。一份使用 Markdown 格式撰寫的文件應該可以直接以純文字發佈,並且看起來不會像是由許多標籤或是格式指令所構成。
121 | Markdown 的語法有個主要的目的:用來作為一種網路內容的寫作用語言。

122 |
123 | 124 | 125 | 126 |

本文约定

127 | 128 |

如果有写 效果如下:, 在 MWeb 编辑状态下只有用 CMD + 4CMD + R 预览才可以看效果。

129 | 130 |

标题

131 | 132 |

Markdown 语法:

133 | 134 |
# 第一级标题 `<h1>`
135 | ## 第二级标题 `<h2>`
136 | ###### 第六级标题 `<h6>`
137 | 
138 | 139 |

效果如下:

140 | 141 |

第一级标题 <h1>

142 | 143 |

第二级标题 <h2>

144 | 145 |
第六级标题 <h6>
146 | 147 |

强调

148 | 149 |

Markdown 语法:

150 | 151 |
*这些文字会生成`<em>`*
152 | _这些文字会生成`<u>`_
153 | 
154 | **这些文字会生成`<strong>`**
155 | __这些文字会生成`<strong>`__
156 | 
157 | 158 |

在 MWeb 中的快捷键为: CMD + UCMD + ICMD + B
159 | 效果如下:

160 | 161 |

这些文字会生成<em>
162 | 这些文字会生成<u>

163 | 164 |

这些文字会生成<strong>
165 | 这些文字会生成<strong>

166 | 167 |

换行

168 | 169 |

四个及以上空格加回车。
170 | 如果不想打这么多空格,只要回车就为换行,请勾选:Preferences - Themes - Translate newlines to <br> tags

171 | 172 |

列表

173 | 174 |

无序列表

175 | 176 |

Markdown 语法:

177 | 178 |
* 项目一 无序列表 `* + 空格键`
179 | * 项目二
180 | * 项目二的子项目一 无序列表 `TAB + * + 空格键`
181 | * 项目二的子项目二
182 | 
183 | 184 |

在 MWeb 中的快捷键为: Option + U
185 | 效果如下:

186 | 187 | 193 | 194 |

有序列表

195 | 196 |

Markdown 语法:

197 | 198 |
1. 项目一 有序列表 `数字 + . + 空格键`
199 | 2. 项目二
200 | 3. 项目三
201 | 1. 项目三的子项目一 有序列表 `TAB + 数字 + . + 空格键`
202 | 2. 项目三的子项目二
203 | 
204 | 205 |

效果如下:

206 | 207 |
    208 |
  1. 项目一 有序列表 数字 + . + 空格键
  2. 209 |
  3. 项目二
  4. 210 |
  5. 项目三
  6. 211 |
  7. 项目三的子项目一 有序列表 TAB + 数字 + . + 空格键
  8. 212 |
  9. 项目三的子项目二
  10. 213 |
214 | 215 |

任务列表(Task lists)

216 | 217 |

Markdown 语法:

218 | 219 |
- [ ] 任务一 未做任务 `- + 空格 + [ ]`
220 | - [x] 任务二 已做任务 `- + 空格 + [x]`
221 | 
222 | 223 |

效果如下:

224 | 225 | 231 | 232 |

图片

233 | 234 |

Markdown 语法:

235 | 236 |
![GitHub set up](http://zh.mweb.im/asset/img/set-up-git.gif)
237 | 格式: ![Alt Text](url)
238 | 
239 | 240 |

Control + Shift + I 可插入Markdown语法。
241 | 如果是 MWeb 的文档库中的文档,还可以用拖放图片、CMD + V 粘贴、CMD + Option + I 导入这三种方式来增加图片。
242 | 效果如下:

243 | 244 |

GitHub set up

245 | 246 |

MWeb 引入的特别的语法来设置图片宽度,方法是在图片描述后加 -w + 图片宽度 即可,比如说要设置上面的图片的宽度为 140,语法如下:

247 | 248 |

GitHub set up

249 | 250 |

251 | 252 |

链接

253 | 254 |

Markdown 语法:

255 | 256 |
email <example@example.com>
257 | [GitHub](http://github.com)
258 | 自动生成连接  <http://www.github.com/>
259 | 
260 | 261 |

Control + Shift + L 可插入Markdown语法。
262 | 如果是 MWeb 的文档库中的文档,拖放或CMD + Option + I 导入非图片时,会生成连接。
263 | 效果如下:

264 | 265 |

Email 连接: example@example.com
266 | 连接标题Github网站
267 | 自动生成连接像: http://www.github.com/ 这样

268 | 269 |

区块引用

270 | 271 |

Markdown 语法:

272 | 273 |
某某说:
274 | > 第一行引用
275 | > 第二行费用文字
276 | 
277 | 278 |

CMD + Shift + B 可插入Markdown语法。
279 | 效果如下:

280 | 281 |

某某说:

282 | 283 |
284 |

第一行引用
285 | 第二行费用文字

286 |
287 | 288 |

行内代码

289 | 290 |

Markdown 语法:

291 | 292 |
像这样即可:`<addr>` `code`
293 | 
294 | 295 |

CMD + K 可插入Markdown语法。
296 | 效果如下:

297 | 298 |

像这样即可:<addr> code

299 | 300 |

多行或者一段代码

301 | 302 |

Markdown 语法:

303 | 304 |
```js
305 | function fancyAlert(arg) {
306 |     if(arg) {
307 |     $.facebox({div:'#foo'})
308 |     }
309 | 
310 | }
311 | ```
312 | 
313 | 314 |

CMD + Shift + K 可插入Markdown语法。
315 | 效果如下:

316 | 317 |
function fancyAlert(arg) {
318 |     if(arg) {
319 |     $.facebox({div:'#foo'})
320 |     }
321 | 
322 | }
323 | 
324 | 325 |

顺序图或流程图

326 | 327 |

Markdown 语法:

328 | 329 |
```sequence
330 | 张三->李四: 嘿,小四儿, 写博客了没?
331 | Note right of 李四: 李四愣了一下,说:
332 | 李四-->张三: 忙得吐血,哪有时间写。
333 | ```
334 | 
335 | ```flow
336 | st=>start: 开始
337 | e=>end: 结束
338 | op=>operation: 我的操作
339 | cond=>condition: 确认?
340 | 
341 | st->op->cond
342 | cond(yes)->e
343 | cond(no)->op
344 | ```
345 | 
346 | 347 |

效果如下( Preferences - Themes - Enable sequence & flow chart 才会看到效果 ):

348 | 349 |
张三->李四: 嘿,小四儿, 写博客了没?
350 | Note right of 李四: 李四愣了一下,说:
351 | 李四-->张三: 忙得吐血,哪有时间写。
352 | 
353 | 354 |
st=>start: 页面加载
355 | 
356 | op1=>operation: hightlight.js处理<code>
357 | op2=>operation: 解析css并填入HTML的 style中
358 | 
359 | cond=>condition: 是否生成ENML
360 | op3=>operation: 修改id属性为name等等的转换操作
361 | op5=>end: 除去style、script标签,生成 ENML
362 | op4=>end: 除去style、script标签,生成
363 | 纯html
364 | 
365 | st->op1->op2->cond
366 | cond(yes)->op3
367 | cond(no)->op4
368 | op3->op5
369 | 
370 | 371 |

更多请参考:http://bramp.github.io/js-sequence-diagrams/, http://adrai.github.io/flowchart.js/

372 | 373 |

表格

374 | 375 |

Markdown 语法:

376 | 377 |
第一格表头 | 第二格表头
378 | --------- | -------------
379 | 内容单元格 第一列第一格 | 内容单元格第二列第一格
380 | 内容单元格 第一列第二格 多加文字 | 内容单元格第二列第二格
381 | 
382 | 383 |

效果如下:

384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 |
第一格表头第二格表头
内容单元格 第一列第一格内容单元格第二列第一格
内容单元格 第一列第二格 多加文字内容单元格第二列第二格
404 | 405 |

删除线

406 | 407 |

Markdown 语法:

408 | 409 |

加删除线像这样用: 删除这些

410 | 411 |

效果如下:

412 | 413 |

加删除线像这样用: 删除这些

414 | 415 |

分隔线

416 | 417 |

以下三种方式都可以生成分隔线:

418 | 419 |
***
420 | 
421 | *****
422 | 
423 | - - -
424 | 
425 | 426 |

效果如下:

427 | 428 |
429 | 430 |
431 | 432 |
433 | 434 |

MathJax

435 | 436 |

Markdown 语法:

437 | 438 |
块级公式:
439 | $$  x = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} $$
440 | 
441 | \\[ \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} =
442 | 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}}
443 | {1+\frac{e^{-8\pi}} {1+\ldots} } } } \\]
444 | 
445 | 行内公式: $\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N$
446 | 
447 | 448 |

效果如下(Preferences - Themes - Enable MathJax 才会看到效果):

449 | 450 |

块级公式:

451 | \[ x = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} \]

452 | 453 |

\[ \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} =
454 | 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}}
455 | {1+\frac{e^{-8\pi}} {1+\ldots} } } } \]

456 | 457 |

行内公式: \(\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N\)

458 | 459 |

脚注(Footnote)

460 | 461 |

Markdown 语法:

462 | 463 |
这是一个脚注:[^sample_footnote]
464 | 
465 | 466 |

效果如下:

467 | 468 |

这是一个脚注:1

469 | 470 |

注释和阅读更多

471 | 472 | 473 | 474 | 475 | 476 |

Actions->Insert Read More Comment 或者 Command + .
477 | 阅读更多的功能只用在生成网站或博客时,插入时注意要后空一行。

478 | 479 |

TOC

480 | 481 |

Markdown 语法:

482 | 483 |
[TOC]
484 | 
485 | 486 |

效果如下:

487 | 488 | 626 | 627 | 628 |

测试 Markdown 文档

629 | 630 |

Mermaid 样例

631 | 632 |

样例一

633 | 634 |
graph TB
635 |          subgraph one
636 |          a1-->a2
637 |          end
638 |          subgraph two
639 |          b1-->b2
640 |          end
641 |          subgraph three
642 |          c1-->c2
643 |          end
644 |          c1-->a2
645 | 
646 | 647 |

样例二

648 | 649 |
graph TD
650 |     B["fa:fa-twitter for peace"]
651 |     B-->C[fa:fa-ban forbidden]
652 |     B-->D(fa:fa-spinner);
653 |     B-->E(A fa:fa-camera-retro perhaps?);
654 | 
655 | 656 |

PlantUML 样例

657 | 658 |

样例一

659 | 660 |
actor Bob #red
661 | ' The only difference between actor
662 | 'and participant is the drawing
663 | participant Alice
664 | participant "I have a really\nlong name" as L #99FF99
665 | /' You can also declare:
666 |    participant L as "I have a really\nlong name"  #99FF99
667 |   '/
668 | 
669 | Alice->Bob: Authentication Request
670 | Bob->Alice: Authentication Response
671 | Bob->L: Log transaction
672 | 
673 | 674 |

样例二

675 | 676 |
Alice -> "Bob()" : Hello
677 | "Bob()" -> "This is very\nlong" as Long
678 | ' You can also declare:
679 | ' "Bob()" -> Long as "This is very\nlong"
680 | Long --> "Bob()" : ok
681 | 
682 | 683 |

ECharts 样例

684 | 685 |

样例一

686 | 687 |
option = {
688 |     animation:false,
689 |     title : {
690 |         text: '某站点用户访问来源',
691 |         subtext: '纯属虚构',
692 |         x:'center'
693 |     },
694 |     tooltip : {
695 |         trigger: 'item',
696 |         formatter: "{a} <br/>{b} : {c} ({d}%)"
697 |     },
698 |     legend: {
699 |         orient: 'vertical',
700 |         left: 'left',
701 |         data: ['直接访问','邮件营销','联盟广告','视频广告','搜索引擎']
702 |     },
703 |     series : [
704 |         {
705 |             name: '访问来源',
706 |             type: 'pie',
707 |             radius : '55%',
708 |             center: ['50%', '60%'],
709 |             data:[
710 |                 {value:335, name:'直接访问'},
711 |                 {value:310, name:'邮件营销'},
712 |                 {value:234, name:'联盟广告'},
713 |                 {value:135, name:'视频广告'},
714 |                 {value:1548, name:'搜索引擎'}
715 |             ],
716 |             itemStyle: {
717 |                 emphasis: {
718 |                     shadowBlur: 10,
719 |                     shadowOffsetX: 0,
720 |                     shadowColor: 'rgba(0, 0, 0, 0.5)'
721 |                 }
722 |             }
723 |         }
724 |     ]
725 | };
726 | 
727 | 728 |

样例二

729 | 730 |
option = {
731 |     animation:false,
732 |     tooltip : {
733 |         trigger: 'axis',
734 |         axisPointer : {            // 坐标轴指示器,坐标轴触发有效
735 |             type : 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
736 |         }
737 |     },
738 |     legend: {
739 |         data:['直接访问','邮件营销','联盟广告','视频广告','搜索引擎','百度','谷歌','必应','其他']
740 |     },
741 |     grid: {
742 |         left: '3%',
743 |         right: '4%',
744 |         bottom: '3%',
745 |         containLabel: true
746 |     },
747 |     xAxis : [
748 |         {
749 |             type : 'category',
750 |             data : ['周一','周二','周三','周四','周五','周六','周日']
751 |         }
752 |     ],
753 |     yAxis : [
754 |         {
755 |             type : 'value'
756 |         }
757 |     ],
758 |     series : [
759 |         {
760 |             name:'直接访问',
761 |             type:'bar',
762 |             data:[320, 332, 301, 334, 390, 330, 320]
763 |         },
764 |         {
765 |             name:'邮件营销',
766 |             type:'bar',
767 |             stack: '广告',
768 |             data:[120, 132, 101, 134, 90, 230, 210]
769 |         },
770 |         {
771 |             name:'联盟广告',
772 |             type:'bar',
773 |             stack: '广告',
774 |             data:[220, 182, 191, 234, 290, 330, 310]
775 |         },
776 |         {
777 |             name:'视频广告',
778 |             type:'bar',
779 |             stack: '广告',
780 |             data:[150, 232, 201, 154, 190, 330, 410]
781 |         },
782 |         {
783 |             name:'搜索引擎',
784 |             type:'bar',
785 |             data:[862, 1018, 964, 1026, 1679, 1600, 1570],
786 |             markLine : {
787 |                 lineStyle: {
788 |                     normal: {
789 |                         type: 'dashed'
790 |                     }
791 |                 },
792 |                 data : [
793 |                     [{type : 'min'}, {type : 'max'}]
794 |                 ]
795 |             }
796 |         },
797 |         {
798 |             name:'百度',
799 |             type:'bar',
800 |             barWidth : 5,
801 |             stack: '搜索引擎',
802 |             data:[620, 732, 701, 734, 1090, 1130, 1120]
803 |         },
804 |         {
805 |             name:'谷歌',
806 |             type:'bar',
807 |             stack: '搜索引擎',
808 |             data:[120, 132, 101, 134, 290, 230, 220]
809 |         },
810 |         {
811 |             name:'必应',
812 |             type:'bar',
813 |             stack: '搜索引擎',
814 |             data:[60, 72, 71, 74, 190, 130, 110]
815 |         },
816 |         {
817 |             name:'其他',
818 |             type:'bar',
819 |             stack: '搜索引擎',
820 |             data:[62, 82, 91, 84, 109, 110, 120]
821 |         }
822 |     ]
823 | };
824 | 
825 | 826 |
827 |
828 |
    829 | 830 |
  1. 831 |

    这里是脚注信息 

    832 |
  2. 833 | 834 |
835 |
836 | 837 |
838 | 839 | 840 | 841 | -------------------------------------------------------------------------------- /test/asset/echarts.common.min.js: -------------------------------------------------------------------------------- 1 | document.write("");document.write(""); -------------------------------------------------------------------------------- /test/asset/font-awesome/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /test/asset/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cyhhao/html2enml/36a114bf456cbdec53ea96b9bbfbb3e5f324b2f6/test/asset/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /test/asset/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cyhhao/html2enml/36a114bf456cbdec53ea96b9bbfbb3e5f324b2f6/test/asset/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /test/asset/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cyhhao/html2enml/36a114bf456cbdec53ea96b9bbfbb3e5f324b2f6/test/asset/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /test/asset/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cyhhao/html2enml/36a114bf456cbdec53ea96b9bbfbb3e5f324b2f6/test/asset/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /test/asset/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cyhhao/html2enml/36a114bf456cbdec53ea96b9bbfbb3e5f324b2f6/test/asset/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /test/asset/jquery_plantuml/encode64.js: -------------------------------------------------------------------------------- 1 | 2 | function encode64(data) { 3 | r = ""; 4 | for (i=0; i> 2; 18 | c2 = ((b1 & 0x3) << 4) | (b2 >> 4); 19 | c3 = ((b2 & 0xF) << 2) | (b3 >> 6); 20 | c4 = b3 & 0x3F; 21 | r = ""; 22 | r += encode6bit(c1 & 0x3F); 23 | r += encode6bit(c2 & 0x3F); 24 | r += encode6bit(c3 & 0x3F); 25 | r += encode6bit(c4 & 0x3F); 26 | return r; 27 | } 28 | 29 | function encode6bit(b) { 30 | if (b < 10) { 31 | return String.fromCharCode(48 + b); 32 | } 33 | b -= 10; 34 | if (b < 26) { 35 | return String.fromCharCode(65 + b); 36 | } 37 | b -= 26; 38 | if (b < 26) { 39 | return String.fromCharCode(97 + b); 40 | } 41 | b -= 26; 42 | if (b == 0) { 43 | return '-'; 44 | } 45 | if (b == 1) { 46 | return '_'; 47 | } 48 | return '?'; 49 | } -------------------------------------------------------------------------------- /test/asset/jquery_plantuml/example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |

Example

10 |
11 | 15 |
16 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /test/asset/jquery_plantuml/jquery_plantuml.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function(){ 2 | plantuml_runonce(); 3 | }); 4 | 5 | 6 | 7 | function encode64(data) { 8 | r = ""; 9 | for (i=0; i> 2; 23 | c2 = ((b1 & 0x3) << 4) | (b2 >> 4); 24 | c3 = ((b2 & 0xF) << 2) | (b3 >> 6); 25 | c4 = b3 & 0x3F; 26 | r = ""; 27 | r += encode6bit(c1 & 0x3F); 28 | r += encode6bit(c2 & 0x3F); 29 | r += encode6bit(c3 & 0x3F); 30 | r += encode6bit(c4 & 0x3F); 31 | return r; 32 | } 33 | 34 | function encode6bit(b) { 35 | if (b < 10) { 36 | return String.fromCharCode(48 + b); 37 | } 38 | b -= 10; 39 | if (b < 26) { 40 | return String.fromCharCode(65 + b); 41 | } 42 | b -= 26; 43 | if (b < 26) { 44 | return String.fromCharCode(97 + b); 45 | } 46 | b -= 26; 47 | if (b == 0) { 48 | return '-'; 49 | } 50 | if (b == 1) { 51 | return '_'; 52 | } 53 | return '?'; 54 | } 55 | 56 | var deflater = window.SharedWorker && new SharedWorker('rawdeflate.js'); 57 | if (deflater) { 58 | deflater.port.addEventListener('message', done_deflating, false); 59 | deflater.port.start(); 60 | } else if (window.Worker) { 61 | deflater = new Worker('rawdeflate.js'); 62 | deflater.onmessage = done_deflating; 63 | } 64 | 65 | function done_deflating(e) { 66 | var done = 0; 67 | $("img").each(function () { 68 | if (done==1) return; 69 | var u1 = $(this).attr("src"); 70 | if (u1!=null) return; 71 | var u2 = $(this).attr("uml"); 72 | if (u2=="") return; 73 | $(this).attr("src", "http://www.plantuml.com/plantuml/img/"+encode64(e.data)); 74 | $(this).attr("uml", ""); 75 | done = 1; 76 | }); 77 | plantuml_runonce(); 78 | } 79 | 80 | function plantuml_runonce() { 81 | var done = 0; 82 | $("img").each(function () { 83 | if (done==1) return; 84 | var u1 = $(this).attr("src"); 85 | if (u1!=null) return; 86 | var u2 = $(this).attr("uml"); 87 | if (u2=="") return; 88 | var s = unescape(encodeURIComponent(u2)); 89 | if (deflater) { 90 | if (deflater.port && deflater.port.postMessage) { 91 | deflater.port.postMessage(s); 92 | } else { 93 | deflater.postMessage(s); 94 | } 95 | } else { 96 | setTimeout(function() { 97 | done_deflating({ data: deflate(s) }); 98 | }, 100); 99 | } 100 | done = 1; 101 | }); 102 | } 103 | -------------------------------------------------------------------------------- /test/asset/mermaid.css: -------------------------------------------------------------------------------- 1 | /* Flowchart variables */ 2 | /* Sequence Diagram variables */ 3 | /* Gantt chart variables */ 4 | .mermaid .label { 5 | font-family: 'trebuchet ms', verdana, arial; 6 | color: #333; 7 | } 8 | .node rect, 9 | .node circle, 10 | .node ellipse, 11 | .node polygon { 12 | fill: #cde498; 13 | stroke: #13540c; 14 | stroke-width: 1px; 15 | } 16 | .edgePath .path { 17 | stroke: green; 18 | stroke-width: 1.5px; 19 | } 20 | .edgeLabel { 21 | background-color: #e8e8e8; 22 | } 23 | .cluster rect { 24 | fill: #cdffb2 !important; 25 | rx: 4 !important; 26 | stroke: #6eaa49 !important; 27 | stroke-width: 1px !important; 28 | } 29 | .cluster text { 30 | fill: #333; 31 | } 32 | .actor { 33 | stroke: #13540c; 34 | fill: #cde498; 35 | } 36 | text.actor { 37 | fill: black; 38 | stroke: none; 39 | } 40 | .actor-line { 41 | stroke: grey; 42 | } 43 | .messageLine0 { 44 | stroke-width: 1.5; 45 | stroke-dasharray: "2 2"; 46 | marker-end: "url(#arrowhead)"; 47 | stroke: #333; 48 | } 49 | .messageLine1 { 50 | stroke-width: 1.5; 51 | stroke-dasharray: "2 2"; 52 | stroke: #333; 53 | } 54 | #arrowhead { 55 | fill: #333; 56 | } 57 | #crosshead path { 58 | fill: #333 !important; 59 | stroke: #333 !important; 60 | } 61 | .messageText { 62 | fill: #333; 63 | stroke: none; 64 | } 65 | .labelBox { 66 | stroke: #326932; 67 | fill: #cde498; 68 | } 69 | .labelText { 70 | fill: black; 71 | stroke: none; 72 | } 73 | .loopText { 74 | fill: black; 75 | stroke: none; 76 | } 77 | .loopLine { 78 | stroke-width: 2; 79 | stroke-dasharray: "2 2"; 80 | marker-end: "url(#arrowhead)"; 81 | stroke: #326932; 82 | } 83 | .note { 84 | stroke: #6eaa49; 85 | fill: #fff5ad; 86 | } 87 | .noteText { 88 | fill: black; 89 | stroke: none; 90 | font-family: 'trebuchet ms', verdana, arial; 91 | font-size: 14px; 92 | } 93 | /** Section styling */ 94 | .section { 95 | stroke: none; 96 | opacity: 0.2; 97 | } 98 | .section0 { 99 | fill: #6eaa49; 100 | } 101 | .section2 { 102 | fill: #6eaa49; 103 | } 104 | .section1, 105 | .section3 { 106 | fill: white; 107 | opacity: 0.2; 108 | } 109 | .sectionTitle0 { 110 | fill: #333; 111 | } 112 | .sectionTitle1 { 113 | fill: #333; 114 | } 115 | .sectionTitle2 { 116 | fill: #333; 117 | } 118 | .sectionTitle3 { 119 | fill: #333; 120 | } 121 | .sectionTitle { 122 | text-anchor: start; 123 | font-size: 11px; 124 | text-height: 14px; 125 | } 126 | /* Grid and axis */ 127 | .grid .tick { 128 | stroke: lightgrey; 129 | opacity: 0.3; 130 | shape-rendering: crispEdges; 131 | } 132 | .grid path { 133 | stroke-width: 0; 134 | } 135 | /* Today line */ 136 | .today { 137 | fill: none; 138 | stroke: red; 139 | stroke-width: 2px; 140 | } 141 | /* Task styling */ 142 | /* Default task */ 143 | .task { 144 | stroke-width: 2; 145 | } 146 | .taskText { 147 | text-anchor: middle; 148 | font-size: 11px; 149 | } 150 | .taskTextOutsideRight { 151 | fill: black; 152 | text-anchor: start; 153 | font-size: 11px; 154 | } 155 | .taskTextOutsideLeft { 156 | fill: black; 157 | text-anchor: end; 158 | font-size: 11px; 159 | } 160 | /* Specific task settings for the sections*/ 161 | .taskText0, 162 | .taskText1, 163 | .taskText2, 164 | .taskText3 { 165 | fill: white; 166 | } 167 | .task0, 168 | .task1, 169 | .task2, 170 | .task3 { 171 | fill: #487e3a; 172 | stroke: #13540c; 173 | } 174 | .taskTextOutside0, 175 | .taskTextOutside2 { 176 | fill: black; 177 | } 178 | .taskTextOutside1, 179 | .taskTextOutside3 { 180 | fill: black; 181 | } 182 | /* Active task */ 183 | .active0, 184 | .active1, 185 | .active2, 186 | .active3 { 187 | fill: #cde498; 188 | stroke: #13540c; 189 | } 190 | .activeText0, 191 | .activeText1, 192 | .activeText2, 193 | .activeText3 { 194 | fill: black !important; 195 | } 196 | /* Completed task */ 197 | .done0, 198 | .done1, 199 | .done2, 200 | .done3 { 201 | stroke: grey; 202 | fill: lightgrey; 203 | stroke-width: 2; 204 | } 205 | .doneText0, 206 | .doneText1, 207 | .doneText2, 208 | .doneText3 { 209 | fill: black !important; 210 | } 211 | /* Tasks on the critical line */ 212 | .crit0, 213 | .crit1, 214 | .crit2, 215 | .crit3 { 216 | stroke: #ff8888; 217 | fill: red; 218 | stroke-width: 2; 219 | } 220 | .activeCrit0, 221 | .activeCrit1, 222 | .activeCrit2, 223 | .activeCrit3 { 224 | stroke: #ff8888; 225 | fill: #cde498; 226 | stroke-width: 2; 227 | } 228 | .doneCrit0, 229 | .doneCrit1, 230 | .doneCrit2, 231 | .doneCrit3 { 232 | stroke: #ff8888; 233 | fill: lightgrey; 234 | stroke-width: 2; 235 | cursor: pointer; 236 | shape-rendering: crispEdges; 237 | } 238 | .doneCritText0, 239 | .doneCritText1, 240 | .doneCritText2, 241 | .doneCritText3 { 242 | fill: black !important; 243 | } 244 | .activeCritText0, 245 | .activeCritText1, 246 | .activeCritText2, 247 | .activeCritText3 { 248 | fill: black !important; 249 | } 250 | .titleText { 251 | text-anchor: middle; 252 | font-size: 18px; 253 | fill: black; 254 | } 255 | /* 256 | 257 | 258 | */ 259 | g.classGroup text { 260 | fill: #13540c; 261 | stroke: none; 262 | font-family: 'trebuchet ms', verdana, arial; 263 | font-size: 14px; 264 | } 265 | g.classGroup rect { 266 | fill: #cde498; 267 | stroke: #13540c; 268 | } 269 | g.classGroup line { 270 | stroke: #13540c; 271 | stroke-width: 1; 272 | } 273 | svg .classLabel .box { 274 | stroke: none; 275 | stroke-width: 0; 276 | fill: #cde498; 277 | opacity: 0.5; 278 | } 279 | svg .classLabel .label { 280 | fill: #13540c; 281 | } 282 | .relation { 283 | stroke: #13540c; 284 | stroke-width: 1; 285 | fill: none; 286 | } 287 | .composition { 288 | fill: #13540c; 289 | stroke: #13540c; 290 | stroke-width: 1; 291 | } 292 | #compositionStart { 293 | fill: #13540c; 294 | stroke: #13540c; 295 | stroke-width: 1; 296 | } 297 | #compositionEnd { 298 | fill: #13540c; 299 | stroke: #13540c; 300 | stroke-width: 1; 301 | } 302 | .aggregation { 303 | fill: #cde498; 304 | stroke: #13540c; 305 | stroke-width: 1; 306 | } 307 | #aggregationStart { 308 | fill: #cde498; 309 | stroke: #13540c; 310 | stroke-width: 1; 311 | } 312 | #aggregationEnd { 313 | fill: #cde498; 314 | stroke: #13540c; 315 | stroke-width: 1; 316 | } 317 | #dependencyStart { 318 | fill: #13540c; 319 | stroke: #13540c; 320 | stroke-width: 1; 321 | } 322 | #dependencyEnd { 323 | fill: #13540c; 324 | stroke: #13540c; 325 | stroke-width: 1; 326 | } 327 | #extensionStart { 328 | fill: #13540c; 329 | stroke: #13540c; 330 | stroke-width: 1; 331 | } 332 | #extensionEnd { 333 | fill: #13540c; 334 | stroke: #13540c; 335 | stroke-width: 1; 336 | } 337 | .node text { 338 | font-family: 'trebuchet ms', verdana, arial; 339 | font-size: 14px; 340 | } 341 | div.mermaidTooltip { 342 | position: absolute; 343 | text-align: center; 344 | max-width: 200px; 345 | padding: 2px; 346 | font-family: 'trebuchet ms', verdana, arial; 347 | font-size: 12px; 348 | background: #cdffb2; 349 | border: 1px solid #6eaa49; 350 | border-radius: 2px; 351 | pointer-events: none; 352 | z-index: 100; 353 | } -------------------------------------------------------------------------------- /test/asset/style.css: -------------------------------------------------------------------------------- 1 | html,body{ font-family: "SF UI Display", ".PingFang SC","PingFang SC", "Neue Haas Grotesk Text Pro", "Arial Nova", "Segoe UI", "Microsoft YaHei", "Microsoft JhengHei", "Helvetica Neue", "Source Han Sans SC", "Noto Sans CJK SC", "Source Han Sans CN", "Noto Sans SC", "Source Han Sans TC", "Noto Sans CJK TC", "Hiragino Sans GB", sans-serif; 2 | font-size: 16px; 3 | color:#222 4 | -webkit-text-size-adjust:none; min-width: 200px; 5 | max-width: 760px; 6 | margin: 0 auto; padding: 1rem; 7 | line-height: 1.5rem; 8 | 9 | } 10 | h1,h2,h3,h4,h5,h6{font-family: "PT Sans","SF UI Display", ".PingFang SC","PingFang SC", "Neue Haas Grotesk Text Pro", "Arial Nova", "Segoe UI", "Microsoft YaHei", "Microsoft JhengHei", "Helvetica Neue", "Source Han Sans SC", "Noto Sans CJK SC", "Source Han Sans CN", "Noto Sans SC", "Source Han Sans TC", "Noto Sans CJK TC", "Hiragino Sans GB", sans-serif; 11 | text-rendering:optimizelegibility;margin-bottom:1em;font-weight:bold; line-height: 1.8rem; 12 | 13 | } 14 | h1,h2{position:relative;padding-top:1rem;padding-bottom:0.2rem;margin-bottom:1rem;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x;} 15 | h2{padding-top:0.8rem;padding-bottom:0.2rem;} 16 | h1{ font-size: 1.6rem;} 17 | h2{ font-size: 1.4rem;} 18 | h3{ font-size: 1.2rem;} 19 | h4{ font-size: 1.1rem;} 20 | h5{ font-size: 1.0rem;} 21 | h6{ font-size: 0.9rem;} 22 | 23 | table{border-collapse:collapse;border-spacing:0; 24 | margin-top: 0.8rem; 25 | margin-bottom: 1.4rem; 26 | } 27 | tr{ background-color: #fff; 28 | border-top: 1px solid #ccc;} 29 | th,td{padding: 5px 14px; 30 | border: 1px solid #ddd;} 31 | 32 | blockquote{font-style:italic;font-size:1.1em;line-height:1.5em;padding-left:1em; border-left:4px solid #D5D5D5; margin-left: 0; 33 | margin-right: 0; 34 | margin-bottom: 1.5rem; } 35 | 36 | a{color:#1863a1} 37 | 38 | pre,code,p code,li code{font-family:Menlo,Monaco,"Andale Mono","lucida console","Courier New",monospace} 39 | 40 | pre{-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;border:1px solid #e7dec3;line-height:1.45em;font-size:0.9rem;margin-bottom:2.1em;padding:.8em 1em;color:#586e75;overflow:auto; background-color:#fdf6e3;} 41 | 42 | p code,li code{display:inline-block;white-space:no-wrap;background:#fff;font-size:0.9rem;line-height:1.5em;color:#555;border:1px solid #ddd;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;padding:0 .3em;margin:-1px 4px;} 43 | p pre code,li pre code{font-size:1em !important;background:none;border:none} 44 | 45 | img{max-width:100%;-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-moz-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:#fff 0.5em solid} 46 | 47 | 48 | hr { 49 | height: 0; 50 | margin: 15px 0; 51 | overflow: hidden; 52 | background: transparent; 53 | border: 0; 54 | border-bottom: 1px solid #ddd; 55 | } 56 | 57 | 58 | /* 59 | 60 | Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull 61 | 62 | */ 63 | 64 | .hljs { 65 | display: block; 66 | overflow-x: auto; 67 | padding: 0.5em; 68 | background: #fdf6e3; 69 | color: #657b83; 70 | -webkit-text-size-adjust: none; 71 | } 72 | 73 | .hljs-comment, 74 | .diff .hljs-header, 75 | .hljs-doctype, 76 | .hljs-pi, 77 | .lisp .hljs-string { 78 | color: #93a1a1; 79 | } 80 | 81 | /* Solarized Green */ 82 | .hljs-keyword, 83 | .hljs-winutils, 84 | .method, 85 | .hljs-addition, 86 | .css .hljs-tag, 87 | .hljs-request, 88 | .hljs-status, 89 | .nginx .hljs-title { 90 | color: #859900; 91 | } 92 | 93 | /* Solarized Cyan */ 94 | .hljs-number, 95 | .hljs-command, 96 | .hljs-string, 97 | .hljs-tag .hljs-value, 98 | .hljs-rule .hljs-value, 99 | .hljs-doctag, 100 | .tex .hljs-formula, 101 | .hljs-regexp, 102 | .hljs-hexcolor, 103 | .hljs-link_url { 104 | color: #2aa198; 105 | } 106 | 107 | /* Solarized Blue */ 108 | .hljs-title, 109 | .hljs-localvars, 110 | .hljs-chunk, 111 | .hljs-decorator, 112 | .hljs-built_in, 113 | .hljs-identifier, 114 | .vhdl .hljs-literal, 115 | .hljs-id, 116 | .css .hljs-function, 117 | .hljs-name { 118 | color: #268bd2; 119 | } 120 | 121 | /* Solarized Yellow */ 122 | .hljs-attribute, 123 | .hljs-variable, 124 | .lisp .hljs-body, 125 | .smalltalk .hljs-number, 126 | .hljs-constant, 127 | .hljs-class .hljs-title, 128 | .hljs-parent, 129 | .hljs-type, 130 | .hljs-link_reference { 131 | color: #b58900; 132 | } 133 | 134 | /* Solarized Orange */ 135 | .hljs-preprocessor, 136 | .hljs-preprocessor .hljs-keyword, 137 | .hljs-pragma, 138 | .hljs-shebang, 139 | .hljs-symbol, 140 | .hljs-symbol .hljs-string, 141 | .diff .hljs-change, 142 | .hljs-special, 143 | .hljs-attr_selector, 144 | .hljs-subst, 145 | .hljs-cdata, 146 | .css .hljs-pseudo, 147 | .hljs-header { 148 | color: #cb4b16; 149 | } 150 | 151 | /* Solarized Red */ 152 | .hljs-deletion, 153 | .hljs-important { 154 | color: #dc322f; 155 | } 156 | 157 | /* Solarized Violet */ 158 | .hljs-link_label { 159 | color: #6c71c4; 160 | } 161 | 162 | .tex .hljs-formula { 163 | background: #eee8d5; 164 | } 165 | 166 | -------------------------------------------------------------------------------- /test/svg.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 |
three
two
one
c1
c2
b1
b2
a1
a2
--------------------------------------------------------------------------------