asciidoctor 2.0.7 → 2.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +169 -7
- data/LICENSE +2 -1
- data/README-de.adoc +5 -15
- data/README-fr.adoc +4 -14
- data/README-jp.adoc +234 -186
- data/README-zh_CN.adoc +7 -17
- data/README.adoc +18 -18
- data/asciidoctor.gemspec +4 -4
- data/data/locale/attributes-ar.adoc +4 -3
- data/data/locale/attributes-bg.adoc +4 -3
- data/data/locale/attributes-ca.adoc +6 -5
- data/data/locale/attributes-cs.adoc +4 -3
- data/data/locale/attributes-da.adoc +6 -5
- data/data/locale/attributes-de.adoc +4 -4
- data/data/locale/attributes-en.adoc +4 -4
- data/data/locale/attributes-es.adoc +6 -5
- data/data/locale/attributes-fa.adoc +4 -3
- data/data/locale/attributes-fi.adoc +4 -3
- data/data/locale/attributes-fr.adoc +6 -5
- data/data/locale/attributes-hu.adoc +4 -3
- data/data/locale/attributes-id.adoc +4 -3
- data/data/locale/attributes-it.adoc +4 -3
- data/data/locale/attributes-ja.adoc +4 -3
- data/data/locale/{attributes-kr.adoc → attributes-ko.adoc} +4 -3
- data/data/locale/attributes-nb.adoc +4 -3
- data/data/locale/attributes-nl.adoc +4 -3
- data/data/locale/attributes-nn.adoc +4 -3
- data/data/locale/attributes-pl.adoc +8 -7
- data/data/locale/attributes-pt.adoc +6 -5
- data/data/locale/attributes-pt_BR.adoc +6 -5
- data/data/locale/attributes-ro.adoc +4 -3
- data/data/locale/attributes-ru.adoc +6 -5
- data/data/locale/attributes-sr.adoc +4 -4
- data/data/locale/attributes-sr_Latn.adoc +4 -4
- data/data/locale/attributes-sv.adoc +4 -4
- data/data/locale/attributes-tr.adoc +4 -3
- data/data/locale/attributes-uk.adoc +6 -5
- data/data/locale/attributes-zh_CN.adoc +4 -3
- data/data/locale/attributes-zh_TW.adoc +4 -3
- data/data/stylesheets/asciidoctor-default.css +33 -30
- data/lib/asciidoctor.rb +89 -791
- data/lib/asciidoctor/abstract_block.rb +19 -11
- data/lib/asciidoctor/abstract_node.rb +21 -15
- data/lib/asciidoctor/attribute_list.rb +59 -67
- data/lib/asciidoctor/cli/invoker.rb +2 -0
- data/lib/asciidoctor/cli/options.rb +3 -3
- data/lib/asciidoctor/convert.rb +167 -162
- data/lib/asciidoctor/converter.rb +14 -13
- data/lib/asciidoctor/converter/docbook5.rb +10 -26
- data/lib/asciidoctor/converter/html5.rb +62 -43
- data/lib/asciidoctor/converter/manpage.rb +13 -12
- data/lib/asciidoctor/converter/template.rb +6 -3
- data/lib/asciidoctor/document.rb +25 -41
- data/lib/asciidoctor/extensions.rb +3 -3
- data/lib/asciidoctor/helpers.rb +38 -39
- data/lib/asciidoctor/inline.rb +1 -1
- data/lib/asciidoctor/load.rb +101 -101
- data/lib/asciidoctor/parser.rb +30 -25
- data/lib/asciidoctor/path_resolver.rb +35 -25
- data/lib/asciidoctor/reader.rb +14 -7
- data/lib/asciidoctor/rx.rb +722 -0
- data/lib/asciidoctor/substitutors.rb +61 -39
- data/lib/asciidoctor/syntax_highlighter.rb +22 -8
- data/lib/asciidoctor/syntax_highlighter/coderay.rb +1 -1
- data/lib/asciidoctor/syntax_highlighter/highlightjs.rb +12 -4
- data/lib/asciidoctor/syntax_highlighter/prettify.rb +7 -4
- data/lib/asciidoctor/syntax_highlighter/pygments.rb +2 -3
- data/lib/asciidoctor/syntax_highlighter/rouge.rb +15 -7
- data/lib/asciidoctor/table.rb +52 -23
- data/lib/asciidoctor/version.rb +1 -1
- data/man/asciidoctor.1 +6 -6
- data/man/asciidoctor.adoc +4 -3
- metadata +10 -9
@@ -1,10 +1,9 @@
|
|
1
1
|
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
|
2
|
-
/* Uncomment @import statement
|
2
|
+
/* Uncomment @import statement to use as custom stylesheet */
|
3
3
|
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
|
4
4
|
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
|
5
|
-
audio,
|
5
|
+
audio,video{display:inline-block}
|
6
6
|
audio:not([controls]){display:none;height:0}
|
7
|
-
script{display:none!important}
|
8
7
|
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
|
9
8
|
a{background:none}
|
10
9
|
a:focus{outline:thin dotted}
|
@@ -38,7 +37,7 @@ textarea{overflow:auto;vertical-align:top}
|
|
38
37
|
table{border-collapse:collapse;border-spacing:0}
|
39
38
|
*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
|
40
39
|
html,body{font-size:100%}
|
41
|
-
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
|
40
|
+
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
|
42
41
|
a:hover{cursor:pointer}
|
43
42
|
img,object,embed{max-width:100%;height:auto}
|
44
43
|
object,embed{height:100%}
|
@@ -53,10 +52,8 @@ img{-ms-interpolation-mode:bicubic}
|
|
53
52
|
img,object,svg{display:inline-block;vertical-align:middle}
|
54
53
|
textarea{height:auto;min-height:50px}
|
55
54
|
select{width:100%}
|
56
|
-
.center{margin-left:auto;margin-right:auto}
|
57
|
-
.stretch{width:100%}
|
58
55
|
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
|
59
|
-
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0
|
56
|
+
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
|
60
57
|
a{color:#2156a5;text-decoration:underline;line-height:inherit}
|
61
58
|
a:hover,a:focus{color:#1d4b8f}
|
62
59
|
a img{border:0}
|
@@ -96,19 +93,22 @@ h1{font-size:2.75em}
|
|
96
93
|
h2{font-size:2.3125em}
|
97
94
|
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
|
98
95
|
h4{font-size:1.4375em}}
|
99
|
-
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
|
96
|
+
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede;word-wrap:normal}
|
100
97
|
table thead,table tfoot{background:#f7f8f7}
|
101
98
|
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
|
102
99
|
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
|
103
100
|
table tr.even,table tr.alt{background:#f8f8f7}
|
104
|
-
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{
|
101
|
+
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
|
105
102
|
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
|
106
103
|
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
|
104
|
+
.center{margin-left:auto;margin-right:auto}
|
105
|
+
.stretch{width:100%}
|
107
106
|
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
|
108
107
|
.clearfix::after,.float-group::after{clear:both}
|
109
|
-
:not(pre)
|
110
|
-
:not(pre)
|
111
|
-
:not(pre)
|
108
|
+
:not(pre).nobreak{word-wrap:normal}
|
109
|
+
:not(pre).nowrap{white-space:nowrap}
|
110
|
+
:not(pre).pre-wrap{white-space:pre-wrap}
|
111
|
+
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
|
112
112
|
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
|
113
113
|
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
|
114
114
|
pre>code{display:block}
|
@@ -173,7 +173,7 @@ body.toc2.toc-right{padding-left:0;padding-right:20em}}
|
|
173
173
|
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
|
174
174
|
#content #toc>:first-child{margin-top:0}
|
175
175
|
#content #toc>:last-child{margin-bottom:0}
|
176
|
-
#footer{max-width:
|
176
|
+
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
|
177
177
|
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
|
178
178
|
#content{margin-bottom:.625em}
|
179
179
|
.sect1{padding-bottom:.625em}
|
@@ -196,7 +196,7 @@ table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font
|
|
196
196
|
.admonitionblock>table td.icon{text-align:center;width:80px}
|
197
197
|
.admonitionblock>table td.icon img{max-width:none}
|
198
198
|
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
|
199
|
-
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)}
|
199
|
+
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
|
200
200
|
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
|
201
201
|
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
|
202
202
|
.exampleblock>.content>:first-child{margin-top:0}
|
@@ -206,11 +206,11 @@ table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font
|
|
206
206
|
.sidebarblock>:last-child{margin-bottom:0}
|
207
207
|
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
|
208
208
|
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
|
209
|
-
.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;
|
209
|
+
.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
|
210
210
|
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
|
211
211
|
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
|
212
|
+
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
|
212
213
|
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
|
213
|
-
.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
|
214
214
|
.listingblock>.content{position:relative}
|
215
215
|
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
|
216
216
|
.listingblock:hover code[data-lang]::before{display:block}
|
@@ -231,7 +231,7 @@ table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;pad
|
|
231
231
|
pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
|
232
232
|
pre.pygments .lineno::before{content:"";margin-right:-.125em}
|
233
233
|
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
|
234
|
-
.quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
|
234
|
+
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
|
235
235
|
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
|
236
236
|
.quoteblock blockquote{margin:0;padding:0;border:0}
|
237
237
|
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
|
@@ -248,23 +248,24 @@ pre.pygments .lineno::before{content:"";margin-right:-.125em}
|
|
248
248
|
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
|
249
249
|
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
|
250
250
|
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
|
251
|
-
.quoteblock.excerpt,.quoteblock .quoteblock{
|
251
|
+
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
|
252
|
+
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
|
252
253
|
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
|
253
254
|
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
|
254
|
-
table.tableblock{max-width:100%;border-collapse:separate}
|
255
255
|
p.tableblock:last-child{margin-bottom:0}
|
256
|
-
td.tableblock>.content{margin-bottom
|
256
|
+
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
|
257
|
+
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
|
257
258
|
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
|
258
|
-
table.grid-all
|
259
|
-
table.grid-
|
260
|
-
table.grid-
|
261
|
-
table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
|
262
|
-
table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
|
263
|
-
table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
|
264
|
-
table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
|
259
|
+
table.grid-all>*>tr>*{border-width:1px}
|
260
|
+
table.grid-cols>*>tr>*{border-width:0 1px}
|
261
|
+
table.grid-rows>*>tr>*{border-width:1px 0}
|
265
262
|
table.frame-all{border-width:1px}
|
263
|
+
table.frame-ends{border-width:1px 0}
|
266
264
|
table.frame-sides{border-width:0 1px}
|
267
|
-
table.frame-
|
265
|
+
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
|
266
|
+
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
|
267
|
+
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
|
268
|
+
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
|
268
269
|
table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
|
269
270
|
th.halign-left,td.halign-left{text-align:left}
|
270
271
|
th.halign-right,td.halign-right{text-align:right}
|
@@ -273,7 +274,7 @@ th.valign-top,td.valign-top{vertical-align:top}
|
|
273
274
|
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
|
274
275
|
th.valign-middle,td.valign-middle{vertical-align:middle}
|
275
276
|
table thead th,table tfoot th{font-weight:bold}
|
276
|
-
tbody tr th{
|
277
|
+
tbody tr th{background:#f7f8f7}
|
277
278
|
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
|
278
279
|
p.tableblock>code:only-child{background:none;padding:0}
|
279
280
|
p.tableblock{font-size:1em}
|
@@ -302,6 +303,7 @@ ol.lowergreek{list-style-type:lower-greek}
|
|
302
303
|
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
|
303
304
|
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
|
304
305
|
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
|
306
|
+
td.hdlist2{word-wrap:anywhere}
|
305
307
|
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
|
306
308
|
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
|
307
309
|
.colist td:not([class]):first-child img{max-width:none}
|
@@ -374,7 +376,7 @@ a span.icon>.fa{cursor:inherit}
|
|
374
376
|
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
|
375
377
|
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
|
376
378
|
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
|
377
|
-
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:
|
379
|
+
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:50%;border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
|
378
380
|
.conum[data-value] *{color:#fff!important}
|
379
381
|
.conum[data-value]+b{display:none}
|
380
382
|
.conum[data-value]::after{content:attr(data-value)}
|
@@ -401,6 +403,7 @@ thead{display:table-header-group}
|
|
401
403
|
svg{max-width:100%}
|
402
404
|
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
|
403
405
|
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
|
406
|
+
#header,#content,#footnotes,#footer{max-width:none}
|
404
407
|
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
|
405
408
|
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
|
406
409
|
body.book #header{text-align:center}
|
data/lib/asciidoctor.rb
CHANGED
@@ -148,7 +148,7 @@ module Asciidoctor
|
|
148
148
|
# Compliance value: 'drop-line'
|
149
149
|
define :attribute_missing, 'skip'
|
150
150
|
|
151
|
-
# AsciiDoc drops lines that contain an attribute
|
151
|
+
# AsciiDoc drops lines that contain an attribute unassignment.
|
152
152
|
# This behavior may need to be tuned depending on the circumstances.
|
153
153
|
# Compliance value: 'drop-line'
|
154
154
|
define :attribute_undefined, 'drop-line'
|
@@ -230,7 +230,7 @@ module Asciidoctor
|
|
230
230
|
|
231
231
|
# Pointers to the preferred version for a given backend.
|
232
232
|
BACKEND_ALIASES = {
|
233
|
-
'html'
|
233
|
+
'html' => 'html5',
|
234
234
|
'docbook' => 'docbook5'
|
235
235
|
}
|
236
236
|
|
@@ -270,14 +270,14 @@ module Asciidoctor
|
|
270
270
|
|
271
271
|
ADMONITION_STYLES = ['NOTE', 'TIP', 'IMPORTANT', 'WARNING', 'CAUTION'].to_set
|
272
272
|
|
273
|
-
ADMONITION_STYLE_HEADS =
|
273
|
+
ADMONITION_STYLE_HEADS = ::Set.new.tap {|accum| ADMONITION_STYLES.each {|s| accum << s.chr } }
|
274
274
|
|
275
275
|
PARAGRAPH_STYLES = ['comment', 'example', 'literal', 'listing', 'normal', 'open', 'pass', 'quote', 'sidebar', 'source', 'verse', 'abstract', 'partintro'].to_set
|
276
276
|
|
277
277
|
VERBATIM_STYLES = ['literal', 'listing', 'source', 'verse'].to_set
|
278
278
|
|
279
279
|
DELIMITED_BLOCKS = {
|
280
|
-
'--'
|
280
|
+
'--' => [:open, ['comment', 'example', 'literal', 'listing', 'pass', 'quote', 'sidebar', 'source', 'verse', 'admonition', 'abstract', 'partintro'].to_set],
|
281
281
|
'----' => [:listing, ['literal', 'source'].to_set],
|
282
282
|
'....' => [:literal, ['listing', 'source'].to_set],
|
283
283
|
'====' => [:example, ['admonition'].to_set],
|
@@ -289,24 +289,24 @@ module Asciidoctor
|
|
289
289
|
':===' => [:table, ::Set.new],
|
290
290
|
'!===' => [:table, ::Set.new],
|
291
291
|
'////' => [:comment, ::Set.new],
|
292
|
-
'```'
|
292
|
+
'```' => [:fenced_code, ::Set.new]
|
293
293
|
}
|
294
294
|
|
295
295
|
DELIMITED_BLOCK_HEADS = {}.tap {|accum| DELIMITED_BLOCKS.each_key {|k| accum[k.slice 0, 2] = true } }
|
296
296
|
DELIMITED_BLOCK_TAILS = {}.tap {|accum| DELIMITED_BLOCKS.each_key {|k| accum[k] = k[k.length - 1] if k.length == 4 } }
|
297
297
|
|
298
298
|
# NOTE the 'figure' key as a string is historical and used by image blocks
|
299
|
-
|
299
|
+
CAPTION_ATTRIBUTE_NAMES = { example: 'example-caption', 'figure' => 'figure-caption', listing: 'listing-caption', table: 'table-caption' }
|
300
300
|
|
301
301
|
LAYOUT_BREAK_CHARS = {
|
302
302
|
'\'' => :thematic_break,
|
303
|
-
'<'
|
303
|
+
'<' => :page_break
|
304
304
|
}
|
305
305
|
|
306
306
|
MARKDOWN_THEMATIC_BREAK_CHARS = {
|
307
|
-
'-'
|
308
|
-
'*'
|
309
|
-
'_'
|
307
|
+
'-' => :thematic_break,
|
308
|
+
'*' => :thematic_break,
|
309
|
+
'_' => :thematic_break
|
310
310
|
}
|
311
311
|
|
312
312
|
HYBRID_LAYOUT_BREAK_CHARS = LAYOUT_BREAK_CHARS.merge MARKDOWN_THEMATIC_BREAK_CHARS
|
@@ -319,8 +319,8 @@ module Asciidoctor
|
|
319
319
|
ORDERED_LIST_STYLES = [:arabic, :loweralpha, :lowerroman, :upperalpha, :upperroman] #, :lowergreek]
|
320
320
|
|
321
321
|
ORDERED_LIST_KEYWORDS = {
|
322
|
-
#'arabic'
|
323
|
-
#'decimal'
|
322
|
+
#'arabic' => '1',
|
323
|
+
#'decimal' => '1',
|
324
324
|
'loweralpha' => 'a',
|
325
325
|
'lowerroman' => 'i',
|
326
326
|
#'lowergreek' => 'a',
|
@@ -357,789 +357,86 @@ module Asciidoctor
|
|
357
357
|
|
358
358
|
FONT_AWESOME_VERSION = '4.7.0'
|
359
359
|
|
360
|
-
HIGHLIGHT_JS_VERSION = '9.
|
361
|
-
|
362
|
-
MATHJAX_VERSION = '2.7.
|
360
|
+
HIGHLIGHT_JS_VERSION = '9.18.3'
|
361
|
+
|
362
|
+
MATHJAX_VERSION = '2.7.9'
|
363
|
+
|
364
|
+
DEFAULT_ATTRIBUTES = {
|
365
|
+
'appendix-caption' => 'Appendix',
|
366
|
+
'appendix-refsig' => 'Appendix',
|
367
|
+
'caution-caption' => 'Caution',
|
368
|
+
'chapter-refsig' => 'Chapter',
|
369
|
+
#'encoding' => 'UTF-8',
|
370
|
+
'example-caption' => 'Example',
|
371
|
+
'figure-caption' => 'Figure',
|
372
|
+
'important-caption' => 'Important',
|
373
|
+
'last-update-label' => 'Last updated',
|
374
|
+
#'listing-caption' => 'Listing',
|
375
|
+
'note-caption' => 'Note',
|
376
|
+
'part-refsig' => 'Part',
|
377
|
+
#'preface-title' => 'Preface',
|
378
|
+
'prewrap' => '',
|
379
|
+
'sectids' => '',
|
380
|
+
'section-refsig' => 'Section',
|
381
|
+
'table-caption' => 'Table',
|
382
|
+
'tip-caption' => 'Tip',
|
383
|
+
'toc-placement' => 'auto',
|
384
|
+
'toc-title' => 'Table of Contents',
|
385
|
+
'untitled-label' => 'Untitled',
|
386
|
+
'version-label' => 'Version',
|
387
|
+
'warning-caption' => 'Warning',
|
388
|
+
}
|
363
389
|
|
364
|
-
# attributes which be changed
|
365
|
-
# header) because it has semantic meaning; ex. sectnums
|
390
|
+
# attributes which be changed throughout the flow of the document (e.g., sectnums)
|
366
391
|
FLEXIBLE_ATTRIBUTES = ['sectnums']
|
367
392
|
|
368
|
-
# A collection of regular expressions used by the parser.
|
369
|
-
#
|
370
|
-
# NOTE The following pattern, which appears frequently, captures the
|
371
|
-
# contents between square brackets, ignoring escaped closing brackets
|
372
|
-
# (closing brackets prefixed with a backslash '\' character)
|
373
|
-
#
|
374
|
-
# Pattern: \[(|#{CC_ALL}*?[^\\])\]
|
375
|
-
# Matches: [enclosed text] and [enclosed [text\]], not [enclosed text \\] or [\\] (as these require a trailing space)
|
376
|
-
#
|
377
|
-
# NOTE \w only matches ASCII word characters, whereas [[:word:]] or \p{Word} matches any character in the Unicode word category.
|
378
|
-
#(pseudo)module Rx
|
379
|
-
|
380
|
-
## Regular expression character classes (to ensure regexp compatibility between Ruby and JavaScript)
|
381
|
-
## CC stands for "character class", CG stands for "character class group"
|
382
|
-
|
383
|
-
unless RUBY_ENGINE == 'opal'
|
384
|
-
# CC_ALL is any character, including newlines (must be accompanied by multiline regexp flag)
|
385
|
-
CC_ALL = '.'
|
386
|
-
# CC_ANY is any character except newlines
|
387
|
-
CC_ANY = '.'
|
388
|
-
CC_EOL = '$'
|
389
|
-
CC_ALPHA = CG_ALPHA = '\p{Alpha}'
|
390
|
-
CC_ALNUM = CG_ALNUM = '\p{Alnum}'
|
391
|
-
CG_BLANK = '\p{Blank}'
|
392
|
-
CC_WORD = CG_WORD = '\p{Word}'
|
393
|
-
end
|
394
|
-
|
395
|
-
## Document header
|
396
|
-
|
397
|
-
# Matches the author info line immediately following the document title.
|
398
|
-
#
|
399
|
-
# Examples
|
400
|
-
#
|
401
|
-
# Doc Writer <doc@example.com>
|
402
|
-
# Mary_Sue Brontë
|
403
|
-
#
|
404
|
-
AuthorInfoLineRx = /^(#{CG_WORD}[#{CC_WORD}\-'.]*)(?: +(#{CG_WORD}[#{CC_WORD}\-'.]*))?(?: +(#{CG_WORD}[#{CC_WORD}\-'.]*))?(?: +<([^>]+)>)?$/
|
405
|
-
|
406
|
-
# Matches the delimiter that separates multiple authors.
|
407
|
-
#
|
408
|
-
# Examples
|
409
|
-
#
|
410
|
-
# Doc Writer; Junior Writer
|
411
|
-
#
|
412
|
-
AuthorDelimiterRx = /;(?: |$)/
|
413
|
-
|
414
|
-
# Matches the revision info line, which appears immediately following
|
415
|
-
# the author info line beneath the document title.
|
416
|
-
#
|
417
|
-
# Examples
|
418
|
-
#
|
419
|
-
# v1.0
|
420
|
-
# 2013-01-01
|
421
|
-
# v1.0, 2013-01-01: Ring in the new year release
|
422
|
-
# 1.0, Jan 01, 2013
|
423
|
-
#
|
424
|
-
RevisionInfoLineRx = /^(?:[^\d{]*(#{CC_ANY}*?),)? *(?!:)(#{CC_ANY}*?)(?: *(?!^),?: *(#{CC_ANY}*))?$/
|
425
|
-
|
426
|
-
# Matches the title and volnum in the manpage doctype.
|
427
|
-
#
|
428
|
-
# Examples
|
429
|
-
#
|
430
|
-
# = asciidoctor(1)
|
431
|
-
# = asciidoctor ( 1 )
|
432
|
-
#
|
433
|
-
ManpageTitleVolnumRx = /^(#{CC_ANY}+?) *\( *(#{CC_ANY}+?) *\)$/
|
434
|
-
|
435
|
-
# Matches the name and purpose in the manpage doctype.
|
436
|
-
#
|
437
|
-
# Examples
|
438
|
-
#
|
439
|
-
# asciidoctor - converts AsciiDoc source files to HTML, DocBook and other formats
|
440
|
-
#
|
441
|
-
ManpageNamePurposeRx = /^(#{CC_ANY}+?) +- +(#{CC_ANY}+)$/
|
442
|
-
|
443
|
-
## Preprocessor directives
|
444
|
-
|
445
|
-
# Matches a conditional preprocessor directive (e.g., ifdef, ifndef, ifeval and endif).
|
446
|
-
#
|
447
|
-
# Examples
|
448
|
-
#
|
449
|
-
# ifdef::basebackend-html[]
|
450
|
-
# ifndef::theme[]
|
451
|
-
# ifeval::["{asciidoctor-version}" >= "0.1.0"]
|
452
|
-
# ifdef::asciidoctor[Asciidoctor!]
|
453
|
-
# endif::theme[]
|
454
|
-
# endif::basebackend-html[]
|
455
|
-
# endif::[]
|
456
|
-
#
|
457
|
-
ConditionalDirectiveRx = /^(\\)?(ifdef|ifndef|ifeval|endif)::(\S*?(?:([,+])\S*?)?)\[(#{CC_ANY}+)?\]$/
|
458
|
-
|
459
|
-
# Matches a restricted (read as safe) eval expression.
|
460
|
-
#
|
461
|
-
# Examples
|
462
|
-
#
|
463
|
-
# "{asciidoctor-version}" >= "0.1.0"
|
464
|
-
#
|
465
|
-
EvalExpressionRx = /^(#{CC_ANY}+?) *([=!><]=|[><]) *(#{CC_ANY}+)$/
|
466
|
-
|
467
|
-
# Matches an include preprocessor directive.
|
468
|
-
#
|
469
|
-
# Examples
|
470
|
-
#
|
471
|
-
# include::chapter1.ad[]
|
472
|
-
# include::example.txt[lines=1;2;5..10]
|
473
|
-
#
|
474
|
-
IncludeDirectiveRx = /^(\\)?include::([^\[][^\[]*)\[(#{CC_ANY}+)?\]$/
|
475
|
-
|
476
|
-
# Matches a trailing tag directive in an include file.
|
477
|
-
#
|
478
|
-
# Examples
|
479
|
-
#
|
480
|
-
# // tag::try-catch[]
|
481
|
-
# try {
|
482
|
-
# someMethod();
|
483
|
-
# catch (Exception e) {
|
484
|
-
# log(e);
|
485
|
-
# }
|
486
|
-
# // end::try-catch[]
|
487
|
-
# NOTE m flag is required for Asciidoctor.js
|
488
|
-
TagDirectiveRx = /\b(?:tag|(e)nd)::(\S+?)\[\](?=$|[ \r])/m
|
489
|
-
|
490
|
-
## Attribute entries and references
|
491
|
-
|
492
|
-
# Matches a document attribute entry.
|
493
|
-
#
|
494
|
-
# Examples
|
495
|
-
#
|
496
|
-
# :foo: bar
|
497
|
-
# :First Name: Dan
|
498
|
-
# :sectnums!:
|
499
|
-
# :!toc:
|
500
|
-
# :long-entry: Attribute value lines ending in ' \' \
|
501
|
-
# are joined together as a single value, \
|
502
|
-
# collapsing the line breaks and indentation to \
|
503
|
-
# a single space.
|
504
|
-
#
|
505
|
-
AttributeEntryRx = /^:(!?#{CG_WORD}[^:]*):(?:[ \t]+(#{CC_ANY}*))?$/
|
506
|
-
|
507
|
-
# Matches invalid characters in an attribute name.
|
508
|
-
InvalidAttributeNameCharsRx = /[^-#{CC_WORD}]/
|
509
|
-
|
510
|
-
# Matches a pass inline macro that surrounds the value of an attribute
|
511
|
-
# entry once it has been parsed.
|
512
|
-
#
|
513
|
-
# Examples
|
514
|
-
#
|
515
|
-
# pass:[text]
|
516
|
-
# pass:a[{a} {b} {c}]
|
517
|
-
#
|
518
|
-
if RUBY_ENGINE == 'opal'
|
519
|
-
# NOTE In JavaScript, ^ and $ match the boundaries of the string when the m flag is not set
|
520
|
-
AttributeEntryPassMacroRx = /^pass:([a-z]+(?:,[a-z-]+)*)?\[(#{CC_ALL}*)\]$/
|
521
|
-
else
|
522
|
-
AttributeEntryPassMacroRx = /\Apass:([a-z]+(?:,[a-z-]+)*)?\[(.*)\]\Z/m
|
523
|
-
end
|
524
|
-
|
525
|
-
# Matches an inline attribute reference.
|
526
|
-
#
|
527
|
-
# Examples
|
528
|
-
#
|
529
|
-
# {foobar} or {app_name} or {product-version}
|
530
|
-
# {counter:sequence-name:1}
|
531
|
-
# {set:foo:bar}
|
532
|
-
# {set:name!}
|
533
|
-
#
|
534
|
-
AttributeReferenceRx = /(\\)?\{(#{CG_WORD}[-#{CC_WORD}]*|(set|counter2?):#{CC_ANY}+?)(\\)?\}/
|
535
|
-
|
536
|
-
## Paragraphs and delimited blocks
|
537
|
-
|
538
|
-
# Matches an anchor (i.e., id + optional reference text) on a line above a block.
|
539
|
-
#
|
540
|
-
# Examples
|
541
|
-
#
|
542
|
-
# [[idname]]
|
543
|
-
# [[idname,Reference Text]]
|
544
|
-
#
|
545
|
-
BlockAnchorRx = /^\[\[(?:|([#{CC_ALPHA}_:][#{CC_WORD}:.-]*)(?:, *(#{CC_ANY}+))?)\]\]$/
|
546
|
-
|
547
|
-
# Matches an attribute list above a block element.
|
548
|
-
#
|
549
|
-
# Examples
|
550
|
-
#
|
551
|
-
# # strictly positional
|
552
|
-
# [quote, Adam Smith, Wealth of Nations]
|
553
|
-
#
|
554
|
-
# # name/value pairs
|
555
|
-
# [NOTE, caption="Good to know"]
|
556
|
-
#
|
557
|
-
# # as attribute reference
|
558
|
-
# [{lead}]
|
559
|
-
#
|
560
|
-
BlockAttributeListRx = /^\[(|[#{CC_WORD}.#%{,"']#{CC_ANY}*)\]$/
|
561
|
-
|
562
|
-
# A combined pattern that matches either a block anchor or a block attribute list.
|
563
|
-
#
|
564
|
-
# TODO this one gets hit a lot, should be optimized as much as possible
|
565
|
-
BlockAttributeLineRx = /^\[(?:|[#{CC_WORD}.#%{,"']#{CC_ANY}*|\[(?:|[#{CC_ALPHA}_:][#{CC_WORD}:.-]*(?:, *#{CC_ANY}+)?)\])\]$/
|
566
|
-
|
567
|
-
# Matches a title above a block.
|
568
|
-
#
|
569
|
-
# Examples
|
570
|
-
#
|
571
|
-
# .Title goes here
|
572
|
-
#
|
573
|
-
BlockTitleRx = /^\.(\.?[^ \t.]#{CC_ANY}*)$/
|
574
|
-
|
575
|
-
# Matches an admonition label at the start of a paragraph.
|
576
|
-
#
|
577
|
-
# Examples
|
578
|
-
#
|
579
|
-
# NOTE: Just a little note.
|
580
|
-
# TIP: Don't forget!
|
581
|
-
#
|
582
|
-
AdmonitionParagraphRx = /^(#{ADMONITION_STYLES.to_a.join '|'}):[ \t]+/
|
583
|
-
|
584
|
-
# Matches a literal paragraph, which is a line of text preceded by at least one space.
|
585
|
-
#
|
586
|
-
# Examples
|
587
|
-
#
|
588
|
-
# <SPACE>Foo
|
589
|
-
# <TAB>Foo
|
590
|
-
LiteralParagraphRx = /^([ \t]+#{CC_ANY}*)$/
|
591
|
-
|
592
|
-
# Matches a comment block.
|
593
|
-
#
|
594
|
-
# Examples
|
595
|
-
#
|
596
|
-
# ////
|
597
|
-
# This is a block comment.
|
598
|
-
# It can span one or more lines.
|
599
|
-
# ////
|
600
|
-
#CommentBlockRx = %r(^/{4,}$)
|
601
|
-
|
602
|
-
# Matches a comment line.
|
603
|
-
#
|
604
|
-
# Examples
|
605
|
-
#
|
606
|
-
# // note to author
|
607
|
-
#
|
608
|
-
#CommentLineRx = %r(^//(?=[^/]|$))
|
609
|
-
|
610
|
-
## Section titles
|
611
|
-
|
612
|
-
# Matches an Atx (single-line) section title.
|
613
|
-
#
|
614
|
-
# Examples
|
615
|
-
#
|
616
|
-
# == Foo
|
617
|
-
# // ^ a level 1 (h2) section title
|
618
|
-
#
|
619
|
-
# == Foo ==
|
620
|
-
# // ^ also a level 1 (h2) section title
|
621
|
-
#
|
622
|
-
AtxSectionTitleRx = /^(=={0,5})[ \t]+(#{CC_ANY}+?)(?:[ \t]+\1)?$/
|
623
|
-
|
624
|
-
# Matches an extended Atx section title that includes support for the Markdown variant.
|
625
|
-
ExtAtxSectionTitleRx = /^(=={0,5}|#\#{0,5})[ \t]+(#{CC_ANY}+?)(?:[ \t]+\1)?$/
|
626
|
-
|
627
|
-
# Matches the title only (first line) of an Setext (two-line) section title.
|
628
|
-
# The title cannot begin with a dot and must have at least one alphanumeric character.
|
629
|
-
SetextSectionTitleRx = /^((?!\.)#{CC_ANY}*?#{CG_ALNUM}#{CC_ANY}*)$/
|
630
|
-
|
631
|
-
# Matches an anchor (i.e., id + optional reference text) inside a section title.
|
632
|
-
#
|
633
|
-
# Examples
|
634
|
-
#
|
635
|
-
# Section Title [[idname]]
|
636
|
-
# Section Title [[idname,Reference Text]]
|
637
|
-
#
|
638
|
-
InlineSectionAnchorRx = / (\\)?\[\[([#{CC_ALPHA}_:][#{CC_WORD}:.-]*)(?:, *(#{CC_ANY}+))?\]\]$/
|
639
|
-
|
640
|
-
# Matches invalid ID characters in a section title.
|
641
|
-
#
|
642
|
-
# NOTE uppercase chars not included since expression is only run on a lowercase string
|
643
|
-
InvalidSectionIdCharsRx = /<[^>]+>|&(?:[a-z][a-z]+\d{0,2}|#\d\d\d{0,4}|#x[\da-f][\da-f][\da-f]{0,3});|[^ #{CC_WORD}\-.]+?/
|
644
|
-
|
645
|
-
# Matches an explicit section level style like sect1
|
646
|
-
#
|
647
|
-
SectionLevelStyleRx = /^sect\d$/
|
648
|
-
|
649
|
-
## Lists
|
650
|
-
|
651
|
-
# Detects the start of any list item.
|
652
|
-
#
|
653
|
-
# NOTE we only have to check as far as the blank character because we know it means non-whitespace follows.
|
654
|
-
# IMPORTANT if this regexp does not agree with the regexp for each list type, the parser will hang.
|
655
|
-
AnyListRx = %r(^(?:[ \t]*(?:-|\*\**|\.\.*|\u2022|\d+\.|[a-zA-Z]\.|[IVXivx]+\))[ \t]|(?!//[^/])[ \t]*[^ \t]#{CC_ANY}*?(?::::{0,2}|;;)(?:$|[ \t])|<?\d+>[ \t]))
|
656
|
-
|
657
|
-
# Matches an unordered list item (one level for hyphens, up to 5 levels for asterisks).
|
658
|
-
#
|
659
|
-
# Examples
|
660
|
-
#
|
661
|
-
# * Foo
|
662
|
-
# - Foo
|
663
|
-
#
|
664
|
-
# NOTE we know trailing (.*) will match at least one character because we strip trailing spaces
|
665
|
-
UnorderedListRx = /^[ \t]*(-|\*\**|\u2022)[ \t]+(#{CC_ANY}*)$/
|
666
|
-
|
667
|
-
# Matches an ordered list item (explicit numbering or up to 5 consecutive dots).
|
668
|
-
#
|
669
|
-
# Examples
|
670
|
-
#
|
671
|
-
# . Foo
|
672
|
-
# .. Foo
|
673
|
-
# 1. Foo (arabic, default)
|
674
|
-
# a. Foo (loweralpha)
|
675
|
-
# A. Foo (upperalpha)
|
676
|
-
# i. Foo (lowerroman)
|
677
|
-
# I. Foo (upperroman)
|
678
|
-
#
|
679
|
-
# NOTE leading space match is not always necessary, but is used for list reader
|
680
|
-
# NOTE we know trailing (.*) will match at least one character because we strip trailing spaces
|
681
|
-
OrderedListRx = /^[ \t]*(\.\.*|\d+\.|[a-zA-Z]\.|[IVXivx]+\))[ \t]+(#{CC_ANY}*)$/
|
682
|
-
|
683
|
-
# Matches the ordinals for each type of ordered list.
|
684
|
-
OrderedListMarkerRxMap = {
|
685
|
-
arabic: /\d+\./,
|
686
|
-
loweralpha: /[a-z]\./,
|
687
|
-
lowerroman: /[ivx]+\)/,
|
688
|
-
upperalpha: /[A-Z]\./,
|
689
|
-
upperroman: /[IVX]+\)/,
|
690
|
-
#lowergreek: /[a-z]\]/,
|
691
|
-
}
|
692
|
-
|
693
|
-
# Matches a description list entry.
|
694
|
-
#
|
695
|
-
# Examples
|
696
|
-
#
|
697
|
-
# foo::
|
698
|
-
# bar:::
|
699
|
-
# baz::::
|
700
|
-
# blah;;
|
701
|
-
#
|
702
|
-
# # the term may be followed by a description on the same line...
|
703
|
-
#
|
704
|
-
# foo:: The metasyntactic variable that commonly accompanies 'bar' (see also, <<bar>>).
|
705
|
-
#
|
706
|
-
# # ...or on a separate line, which may optionally be indented
|
707
|
-
#
|
708
|
-
# foo::
|
709
|
-
# The metasyntactic variable that commonly accompanies 'bar' (see also, <<bar>>).
|
710
|
-
#
|
711
|
-
# # attribute references may be used in both the term and the description
|
712
|
-
#
|
713
|
-
# {foo-term}:: {foo-desc}
|
714
|
-
#
|
715
|
-
# NOTE we know trailing (.*) will match at least one character because we strip trailing spaces
|
716
|
-
# NOTE must skip line comment when looking for next list item inside list
|
717
|
-
DescriptionListRx = %r(^(?!//[^/])[ \t]*([^ \t]#{CC_ANY}*?)(:::{0,2}|;;)(?:$|[ \t]+(#{CC_ANY}*)$))
|
718
|
-
|
719
|
-
# Matches a sibling description list item (excluding the delimiter specified by the key).
|
720
|
-
# NOTE must skip line comment when looking for sibling list item
|
721
|
-
DescriptionListSiblingRx = {
|
722
|
-
'::' => %r(^(?!//[^/])[ \t]*([^ \t]#{CC_ANY}*?[^:]|[^ \t:])(::)(?:$|[ \t]+(#{CC_ANY}*)$)),
|
723
|
-
':::' => %r(^(?!//[^/])[ \t]*([^ \t]#{CC_ANY}*?[^:]|[^ \t:])(:::)(?:$|[ \t]+(#{CC_ANY}*)$)),
|
724
|
-
'::::' => %r(^(?!//[^/])[ \t]*([^ \t]#{CC_ANY}*?[^:]|[^ \t:])(::::)(?:$|[ \t]+(#{CC_ANY}*)$)),
|
725
|
-
';;' => %r(^(?!//[^/])[ \t]*([^ \t]#{CC_ANY}*?)(;;)(?:$|[ \t]+(#{CC_ANY}*)$))
|
726
|
-
}
|
727
|
-
|
728
|
-
# Matches a callout list item.
|
729
|
-
#
|
730
|
-
# Examples
|
731
|
-
#
|
732
|
-
# <1> Explanation
|
733
|
-
#
|
734
|
-
# or
|
735
|
-
#
|
736
|
-
# <.> Explanation with automatic number
|
737
|
-
#
|
738
|
-
# NOTE we know trailing (.*) will match at least one character because we strip trailing spaces
|
739
|
-
CalloutListRx = /^<(\d+|\.)>[ \t]+(#{CC_ANY}*)$/
|
740
|
-
|
741
|
-
# Matches a callout reference inside literal text.
|
742
|
-
#
|
743
|
-
# Examples
|
744
|
-
# <1> (optionally prefixed by //, #, -- or ;; line comment chars)
|
745
|
-
# <1> <2> (multiple callouts on one line)
|
746
|
-
# <!--1--> (for XML-based languages)
|
747
|
-
# <.> (auto-numbered)
|
748
|
-
#
|
749
|
-
# NOTE extract regexps are applied line-by-line, so we can use $ as end-of-line char
|
750
|
-
CalloutExtractRx = %r(((?://|#|--|;;) ?)?(\\)?<!?(|--)(\d+|\.)\3>(?=(?: ?\\?<!?\3(?:\d+|\.)\3>)*$))
|
751
|
-
CalloutExtractRxt = '(\\\\)?<()(\\d+|\\.)>(?=(?: ?\\\\?<(?:\\d+|\\.)>)*$)'
|
752
|
-
CalloutExtractRxMap = ::Hash.new {|h, k| h[k] = /(#{k.empty? ? '' : "#{::Regexp.escape k} ?"})?#{CalloutExtractRxt}/ }
|
753
|
-
# NOTE special characters have not been replaced when scanning
|
754
|
-
CalloutScanRx = /\\?<!?(|--)(\d+|\.)\1>(?=(?: ?\\?<!?\1(?:\d+|\.)\1>)*#{CC_EOL})/
|
755
|
-
# NOTE special characters have already been replaced when converting to an SGML format
|
756
|
-
CalloutSourceRx = %r(((?://|#|--|;;) ?)?(\\)?<!?(|--)(\d+|\.)\3>(?=(?: ?\\?<!?\3(?:\d+|\.)\3>)*#{CC_EOL}))
|
757
|
-
CalloutSourceRxt = "(\\\\)?<()(\\d+|\\.)>(?=(?: ?\\\\?<(?:\\d+|\\.)>)*#{CC_EOL})"
|
758
|
-
CalloutSourceRxMap = ::Hash.new {|h, k| h[k] = /(#{k.empty? ? '' : "#{::Regexp.escape k} ?"})?#{CalloutSourceRxt}/ }
|
759
|
-
|
760
|
-
# A Hash of regexps for lists used for dynamic access.
|
761
|
-
ListRxMap = {
|
762
|
-
ulist: UnorderedListRx,
|
763
|
-
olist: OrderedListRx,
|
764
|
-
dlist: DescriptionListRx,
|
765
|
-
colist: CalloutListRx,
|
766
|
-
}
|
767
|
-
|
768
|
-
## Tables
|
769
|
-
|
770
|
-
# Parses the column spec (i.e., colspec) for a table.
|
771
|
-
#
|
772
|
-
# Examples
|
773
|
-
#
|
774
|
-
# 1*h,2*,^3e
|
775
|
-
#
|
776
|
-
ColumnSpecRx = /^(?:(\d+)\*)?([<^>](?:\.[<^>]?)?|(?:[<^>]?\.)?[<^>])?(\d+%?|~)?([a-z])?$/
|
777
|
-
|
778
|
-
# Parses the start and end of a cell spec (i.e., cellspec) for a table.
|
779
|
-
#
|
780
|
-
# Examples
|
781
|
-
#
|
782
|
-
# 2.3+<.>m
|
783
|
-
#
|
784
|
-
# FIXME use step-wise scan (or treetop) rather than this mega-regexp
|
785
|
-
CellSpecStartRx = /^[ \t]*(?:(\d+(?:\.\d*)?|(?:\d*\.)?\d+)([*+]))?([<^>](?:\.[<^>]?)?|(?:[<^>]?\.)?[<^>])?([a-z])?$/
|
786
|
-
CellSpecEndRx = /[ \t]+(?:(\d+(?:\.\d*)?|(?:\d*\.)?\d+)([*+]))?([<^>](?:\.[<^>]?)?|(?:[<^>]?\.)?[<^>])?([a-z])?$/
|
787
|
-
|
788
|
-
# Block macros
|
789
|
-
|
790
|
-
# Matches the custom block macro pattern.
|
791
|
-
#
|
792
|
-
# Examples
|
793
|
-
#
|
794
|
-
# gist::123456[]
|
795
|
-
#
|
796
|
-
#--
|
797
|
-
# NOTE we've relaxed the match for target to accomodate the short format (e.g., name::[attrlist])
|
798
|
-
CustomBlockMacroRx = /^(#{CG_WORD}[-#{CC_WORD}]*)::(|\S|\S#{CC_ANY}*?\S)\[(#{CC_ANY}+)?\]$/
|
799
|
-
|
800
|
-
# Matches an image, video or audio block macro.
|
801
|
-
#
|
802
|
-
# Examples
|
803
|
-
#
|
804
|
-
# image::filename.png[Caption]
|
805
|
-
# video::http://youtube.com/12345[Cats vs Dogs]
|
806
|
-
#
|
807
|
-
BlockMediaMacroRx = /^(image|video|audio)::(\S|\S#{CC_ANY}*?\S)\[(#{CC_ANY}+)?\]$/
|
808
|
-
|
809
|
-
# Matches the TOC block macro.
|
810
|
-
#
|
811
|
-
# Examples
|
812
|
-
#
|
813
|
-
# toc::[]
|
814
|
-
# toc::[levels=2]
|
815
|
-
#
|
816
|
-
BlockTocMacroRx = /^toc::\[(#{CC_ANY}+)?\]$/
|
817
|
-
|
818
|
-
## Inline macros
|
819
|
-
|
820
|
-
# Matches an anchor (i.e., id + optional reference text) in the flow of text.
|
821
|
-
#
|
822
|
-
# Examples
|
823
|
-
#
|
824
|
-
# [[idname]]
|
825
|
-
# [[idname,Reference Text]]
|
826
|
-
# anchor:idname[]
|
827
|
-
# anchor:idname[Reference Text]
|
828
|
-
#
|
829
|
-
InlineAnchorRx = /(\\)?(?:\[\[([#{CC_ALPHA}_:][#{CC_WORD}:.-]*)(?:, *(#{CC_ANY}+?))?\]\]|anchor:([#{CC_ALPHA}_:][#{CC_WORD}:.-]*)\[(?:\]|(#{CC_ANY}*?[^\\])\]))/
|
830
|
-
|
831
|
-
# Scans for a non-escaped anchor (i.e., id + optional reference text) in the flow of text.
|
832
|
-
InlineAnchorScanRx = /(?:^|[^\\\[])\[\[([#{CC_ALPHA}_:][#{CC_WORD}:.-]*)(?:, *(#{CC_ANY}+?))?\]\]|(?:^|[^\\])anchor:([#{CC_ALPHA}_:][#{CC_WORD}:.-]*)\[(?:\]|(#{CC_ANY}*?[^\\])\])/
|
833
|
-
|
834
|
-
# Scans for a leading, non-escaped anchor (i.e., id + optional reference text).
|
835
|
-
LeadingInlineAnchorRx = /^\[\[([#{CC_ALPHA}_:][#{CC_WORD}:.-]*)(?:, *(#{CC_ANY}+?))?\]\]/
|
836
|
-
|
837
|
-
# Matches a bibliography anchor at the start of the list item text (in a bibliography list).
|
838
|
-
#
|
839
|
-
# Examples
|
840
|
-
#
|
841
|
-
# [[[Fowler_1997]]] Fowler M. ...
|
842
|
-
#
|
843
|
-
InlineBiblioAnchorRx = /^\[\[\[([#{CC_ALPHA}_:][#{CC_WORD}:.-]*)(?:, *(#{CC_ANY}+?))?\]\]\]/
|
844
|
-
|
845
|
-
# Matches an inline e-mail address.
|
846
|
-
#
|
847
|
-
# doc.writer@example.com
|
848
|
-
#
|
849
|
-
InlineEmailRx = %r(([\\>:/])?#{CG_WORD}(?:&|[#{CC_WORD}.%+-])*@#{CG_ALNUM}[#{CC_ALNUM}_.-]*\.[a-zA-Z]{2,5}\b)
|
850
|
-
|
851
|
-
# Matches an inline footnote macro, which is allowed to span multiple lines.
|
852
|
-
#
|
853
|
-
# Examples
|
854
|
-
# footnote:[text] (not referenceable)
|
855
|
-
# footnote:id[text] (referenceable)
|
856
|
-
# footnote:id[] (reference)
|
857
|
-
# footnoteref:[id,text] (legacy)
|
858
|
-
# footnoteref:[id] (legacy)
|
859
|
-
#
|
860
|
-
InlineFootnoteMacroRx = /\\?footnote(?:(ref):|:([\w-]+)?)\[(?:|(#{CC_ALL}*?[^\\]))\]/m
|
861
|
-
|
862
|
-
# Matches an image or icon inline macro.
|
863
|
-
#
|
864
|
-
# Examples
|
865
|
-
#
|
866
|
-
# image:filename.png[Alt Text]
|
867
|
-
# image:http://example.com/images/filename.png[Alt Text]
|
868
|
-
# image:filename.png[More [Alt\] Text] (alt text becomes "More [Alt] Text")
|
869
|
-
# icon:github[large]
|
870
|
-
#
|
871
|
-
# NOTE be as non-greedy as possible by not allowing newline or left square bracket in target
|
872
|
-
InlineImageMacroRx = /\\?i(?:mage|con):([^:\s\[](?:[^\n\[]*[^\s\[])?)\[(|#{CC_ALL}*?[^\\])\]/m
|
873
|
-
|
874
|
-
# Matches an indexterm inline macro, which may span multiple lines.
|
875
|
-
#
|
876
|
-
# Examples
|
877
|
-
#
|
878
|
-
# indexterm:[Tigers,Big cats]
|
879
|
-
# (((Tigers,Big cats)))
|
880
|
-
# indexterm2:[Tigers]
|
881
|
-
# ((Tigers))
|
882
|
-
#
|
883
|
-
InlineIndextermMacroRx = /\\?(?:(indexterm2?):\[(#{CC_ALL}*?[^\\])\]|\(\((#{CC_ALL}+?)\)\)(?!\)))/m
|
884
|
-
|
885
|
-
# Matches either the kbd or btn inline macro.
|
886
|
-
#
|
887
|
-
# Examples
|
888
|
-
#
|
889
|
-
# kbd:[F3]
|
890
|
-
# kbd:[Ctrl+Shift+T]
|
891
|
-
# kbd:[Ctrl+\]]
|
892
|
-
# kbd:[Ctrl,T]
|
893
|
-
# btn:[Save]
|
894
|
-
#
|
895
|
-
InlineKbdBtnMacroRx = /(\\)?(kbd|btn):\[(#{CC_ALL}*?[^\\])\]/m
|
896
|
-
|
897
|
-
# Matches an implicit link and some of the link inline macro.
|
898
|
-
#
|
899
|
-
# Examples
|
900
|
-
#
|
901
|
-
# https://github.com
|
902
|
-
# https://github.com[GitHub]
|
903
|
-
# <https://github.com>
|
904
|
-
# link:https://github.com[]
|
905
|
-
#
|
906
|
-
# FIXME revisit! the main issue is we need different rules for implicit vs explicit
|
907
|
-
InlineLinkRx = %r((^|link:|#{CG_BLANK}|<|[>\(\)\[\];])(\\?(?:https?|file|ftp|irc)://[^\s\[\]<]*([^\s.,\[\]<]))(?:\[(|#{CC_ALL}*?[^\\])\])?)m
|
908
|
-
|
909
|
-
# Match a link or e-mail inline macro.
|
910
|
-
#
|
911
|
-
# Examples
|
912
|
-
#
|
913
|
-
# link:path[label]
|
914
|
-
# mailto:doc.writer@example.com[]
|
915
|
-
#
|
916
|
-
# NOTE be as non-greedy as possible by not allowing space or left square bracket in target
|
917
|
-
InlineLinkMacroRx = /\\?(?:link|(mailto)):(|[^:\s\[][^\s\[]*)\[(|#{CC_ALL}*?[^\\])\]/m
|
918
|
-
|
919
|
-
# Matches the name of a macro.
|
920
|
-
#
|
921
|
-
MacroNameRx = /^#{CG_WORD}[-#{CC_WORD}]*$/
|
922
|
-
|
923
|
-
# Matches a stem (and alternatives, asciimath and latexmath) inline macro, which may span multiple lines.
|
924
|
-
#
|
925
|
-
# Examples
|
926
|
-
#
|
927
|
-
# stem:[x != 0]
|
928
|
-
# asciimath:[x != 0]
|
929
|
-
# latexmath:[\sqrt{4} = 2]
|
930
|
-
#
|
931
|
-
InlineStemMacroRx = /\\?(stem|(?:latex|ascii)math):([a-z]+(?:,[a-z-]+)*)?\[(#{CC_ALL}*?[^\\])\]/m
|
932
|
-
|
933
|
-
# Matches a menu inline macro.
|
934
|
-
#
|
935
|
-
# Examples
|
936
|
-
#
|
937
|
-
# menu:File[Save As...]
|
938
|
-
# menu:View[Page Style > No Style]
|
939
|
-
# menu:View[Page Style, No Style]
|
940
|
-
#
|
941
|
-
InlineMenuMacroRx = /\\?menu:(#{CG_WORD}|[#{CC_WORD}&][^\n\[]*[^\s\[])\[ *(#{CC_ALL}*?[^\\])?\]/m
|
942
|
-
|
943
|
-
# Matches an implicit menu inline macro.
|
944
|
-
#
|
945
|
-
# Examples
|
946
|
-
#
|
947
|
-
# "File > New..."
|
948
|
-
#
|
949
|
-
InlineMenuRx = /\\?"([#{CC_WORD}&][^"]*?[ \n]+>[ \n]+[^"]*)"/
|
950
|
-
|
951
|
-
# Matches an inline passthrough, which may span multiple lines.
|
952
|
-
#
|
953
|
-
# Examples
|
954
|
-
#
|
955
|
-
# +text+
|
956
|
-
# `text` (compat)
|
957
|
-
#
|
958
|
-
# NOTE we always capture the attributes so we know when to use compatible (i.e., legacy) behavior
|
959
|
-
InlinePassRx = {
|
960
|
-
false => ['+', '`', /(^|[^#{CC_WORD};:])(?:\[([^\]]+)\])?(\\?(\+|`)(\S|\S#{CC_ALL}*?\S)\4)(?!#{CG_WORD})/m],
|
961
|
-
true => ['`', nil, /(^|[^`#{CC_WORD}])(?:\[([^\]]+)\])?(\\?(`)([^`\s]|[^`\s]#{CC_ALL}*?\S)\4)(?![`#{CC_WORD}])/m]
|
962
|
-
}
|
963
|
-
|
964
|
-
# Matches an inline plus passthrough spanning multiple lines, but only when it occurs directly
|
965
|
-
# inside constrained monospaced formatting in non-compat mode.
|
966
|
-
#
|
967
|
-
# Examples
|
968
|
-
#
|
969
|
-
# +text+
|
970
|
-
#
|
971
|
-
SinglePlusInlinePassRx = /^(\\)?\+(\S|\S#{CC_ALL}*?\S)\+$/m
|
972
|
-
|
973
|
-
# Matches several variants of the passthrough inline macro, which may span multiple lines.
|
974
|
-
#
|
975
|
-
# Examples
|
976
|
-
#
|
977
|
-
# +++text+++
|
978
|
-
# $$text$$
|
979
|
-
# pass:quotes[text]
|
980
|
-
#
|
981
|
-
# NOTE we have to support an empty pass:[] for compatibility with AsciiDoc Python
|
982
|
-
InlinePassMacroRx = /(?:(?:(\\?)\[([^\]]+)\])?(\\{0,2})(\+\+\+?|\$\$)(#{CC_ALL}*?)\4|(\\?)pass:([a-z]+(?:,[a-z-]+)*)?\[(|#{CC_ALL}*?[^\\])\])/m
|
983
|
-
|
984
|
-
# Matches an xref (i.e., cross-reference) inline macro, which may span multiple lines.
|
985
|
-
#
|
986
|
-
# Examples
|
987
|
-
#
|
988
|
-
# <<id,reftext>>
|
989
|
-
# xref:id[reftext]
|
990
|
-
#
|
991
|
-
# NOTE special characters have already been escaped, hence the entity references
|
992
|
-
# NOTE { is included in start characters to support target that begins with attribute reference in title content
|
993
|
-
InlineXrefMacroRx = %r(\\?(?:<<([#{CC_WORD}#/.:{]#{CC_ALL}*?)>>|xref:([#{CC_WORD}#/.:{]#{CC_ALL}*?)\[(?:\]|(#{CC_ALL}*?[^\\])\])))m
|
994
|
-
|
995
|
-
## Layout
|
996
|
-
|
997
|
-
# Matches a trailing + preceded by at least one space character,
|
998
|
-
# which forces a hard line break (<br> tag in HTML output).
|
999
|
-
#
|
1000
|
-
# NOTE AsciiDoc Python allows + to be preceded by TAB; Asciidoctor does not
|
1001
|
-
#
|
1002
|
-
# Examples
|
1003
|
-
#
|
1004
|
-
# Humpty Dumpty sat on a wall, +
|
1005
|
-
# Humpty Dumpty had a great fall.
|
1006
|
-
#
|
1007
|
-
if RUBY_ENGINE == 'opal'
|
1008
|
-
# NOTE In JavaScript, ^ and $ only match the start and end of line if the multiline flag is present
|
1009
|
-
HardLineBreakRx = /^(#{CC_ANY}*) \+$/m
|
1010
|
-
else
|
1011
|
-
# NOTE In Ruby, ^ and $ always match start and end of line
|
1012
|
-
HardLineBreakRx = /^(.*) \+$/
|
1013
|
-
end
|
1014
|
-
|
1015
|
-
# Matches a Markdown horizontal rule.
|
1016
|
-
#
|
1017
|
-
# Examples
|
1018
|
-
#
|
1019
|
-
# --- or - - -
|
1020
|
-
# *** or * * *
|
1021
|
-
# ___ or _ _ _
|
1022
|
-
#
|
1023
|
-
MarkdownThematicBreakRx = /^ {0,3}([-*_])( *)\1\2\1$/
|
1024
|
-
|
1025
|
-
# Matches an AsciiDoc or Markdown horizontal rule or AsciiDoc page break.
|
1026
|
-
#
|
1027
|
-
# Examples
|
1028
|
-
#
|
1029
|
-
# ''' (horizontal rule)
|
1030
|
-
# <<< (page break)
|
1031
|
-
# --- or - - - (horizontal rule, Markdown)
|
1032
|
-
# *** or * * * (horizontal rule, Markdown)
|
1033
|
-
# ___ or _ _ _ (horizontal rule, Markdown)
|
1034
|
-
#
|
1035
|
-
ExtLayoutBreakRx = /^(?:'{3,}|<{3,}|([-*_])( *)\1\2\1)$/
|
1036
|
-
|
1037
|
-
## General
|
1038
|
-
|
1039
|
-
# Matches consecutive blank lines.
|
1040
|
-
#
|
1041
|
-
# Examples
|
1042
|
-
#
|
1043
|
-
# one
|
1044
|
-
#
|
1045
|
-
# two
|
1046
|
-
#
|
1047
|
-
BlankLineRx = /\n{2,}/
|
1048
|
-
|
1049
|
-
# Matches a comma or semi-colon delimiter.
|
1050
|
-
#
|
1051
|
-
# Examples
|
1052
|
-
#
|
1053
|
-
# one,two
|
1054
|
-
# three;four
|
1055
|
-
#
|
1056
|
-
#DataDelimiterRx = /[,;]/
|
1057
|
-
|
1058
|
-
# Matches whitespace (space, tab, newline) escaped by a backslash.
|
1059
|
-
#
|
1060
|
-
# Examples
|
1061
|
-
#
|
1062
|
-
# three\ blind\ mice
|
1063
|
-
#
|
1064
|
-
EscapedSpaceRx = /\\([ \t\n])/
|
1065
|
-
|
1066
|
-
# Detects if text is a possible candidate for the replacements substitution.
|
1067
|
-
#
|
1068
|
-
ReplaceableTextRx = /[&']|--|\.\.\.|\([CRT]M?\)/
|
1069
|
-
|
1070
|
-
# Matches a whitespace delimiter, a sequence of spaces, tabs, and/or newlines.
|
1071
|
-
# Matches the parsing rules of %w strings in Ruby.
|
1072
|
-
#
|
1073
|
-
# Examples
|
1074
|
-
#
|
1075
|
-
# one two three four
|
1076
|
-
# five six
|
1077
|
-
#
|
1078
|
-
# TODO change to /(?<!\\)[ \t\n]+/ once lookbehind assertions are implemented in all modern browsers
|
1079
|
-
SpaceDelimiterRx = /([^\\])[ \t\n]+/
|
1080
|
-
|
1081
|
-
# Matches a + or - modifier in a subs list
|
1082
|
-
#
|
1083
|
-
SubModifierSniffRx = /[+-]/
|
1084
|
-
|
1085
|
-
# Matches one or more consecutive digits at the end of a line.
|
1086
|
-
#
|
1087
|
-
# Examples
|
1088
|
-
#
|
1089
|
-
# docbook5
|
1090
|
-
# html5
|
1091
|
-
#
|
1092
|
-
TrailingDigitsRx = /\d+$/
|
1093
|
-
|
1094
|
-
# Detects strings that resemble URIs.
|
1095
|
-
#
|
1096
|
-
# Examples
|
1097
|
-
# http://domain
|
1098
|
-
# https://domain
|
1099
|
-
# file:///path
|
1100
|
-
# data:info
|
1101
|
-
#
|
1102
|
-
# not c:/sample.adoc or c:\sample.adoc
|
1103
|
-
#
|
1104
|
-
UriSniffRx = %r(^#{CG_ALPHA}[#{CC_ALNUM}.+-]+:/{0,2})
|
1105
|
-
|
1106
|
-
# Detects XML tags
|
1107
|
-
XmlSanitizeRx = /<[^>]+>/
|
1108
|
-
#end
|
1109
|
-
|
1110
393
|
INTRINSIC_ATTRIBUTES = {
|
1111
|
-
'startsb'
|
1112
|
-
'endsb'
|
1113
|
-
'vbar'
|
1114
|
-
'caret'
|
1115
|
-
'asterisk'
|
1116
|
-
'tilde'
|
1117
|
-
'plus'
|
1118
|
-
'backslash'
|
1119
|
-
'backtick'
|
1120
|
-
'blank'
|
1121
|
-
'empty'
|
1122
|
-
'sp'
|
394
|
+
'startsb' => '[',
|
395
|
+
'endsb' => ']',
|
396
|
+
'vbar' => '|',
|
397
|
+
'caret' => '^',
|
398
|
+
'asterisk' => '*',
|
399
|
+
'tilde' => '~',
|
400
|
+
'plus' => '+',
|
401
|
+
'backslash' => '\\',
|
402
|
+
'backtick' => '`',
|
403
|
+
'blank' => '',
|
404
|
+
'empty' => '',
|
405
|
+
'sp' => ' ',
|
1123
406
|
'two-colons' => '::',
|
1124
407
|
'two-semicolons' => ';;',
|
1125
|
-
'nbsp'
|
1126
|
-
'deg'
|
1127
|
-
'zwsp'
|
1128
|
-
'quot'
|
1129
|
-
'apos'
|
1130
|
-
'lsquo'
|
1131
|
-
'rsquo'
|
1132
|
-
'ldquo'
|
1133
|
-
'rdquo'
|
1134
|
-
'wj'
|
1135
|
-
'brvbar'
|
1136
|
-
'pp'
|
1137
|
-
'cpp'
|
1138
|
-
'amp'
|
1139
|
-
'lt'
|
1140
|
-
'gt'
|
408
|
+
'nbsp' => ' ',
|
409
|
+
'deg' => '°',
|
410
|
+
'zwsp' => '​',
|
411
|
+
'quot' => '"',
|
412
|
+
'apos' => ''',
|
413
|
+
'lsquo' => '‘',
|
414
|
+
'rsquo' => '’',
|
415
|
+
'ldquo' => '“',
|
416
|
+
'rdquo' => '”',
|
417
|
+
'wj' => '⁠',
|
418
|
+
'brvbar' => '¦',
|
419
|
+
'pp' => '++',
|
420
|
+
'cpp' => 'C++',
|
421
|
+
'amp' => '&',
|
422
|
+
'lt' => '<',
|
423
|
+
'gt' => '>'
|
1141
424
|
}
|
1142
425
|
|
426
|
+
# Regular expression character classes (to ensure regexp compatibility between Ruby and JavaScript)
|
427
|
+
# CC stands for "character class", CG stands for "character class group"
|
428
|
+
unless RUBY_ENGINE == 'opal'
|
429
|
+
# CC_ALL is any character, including newlines (must be accompanied by multiline regexp flag)
|
430
|
+
CC_ALL = '.'
|
431
|
+
# CC_ANY is any character except newlines
|
432
|
+
CC_ANY = '.'
|
433
|
+
CC_EOL = '$'
|
434
|
+
CC_ALPHA = CG_ALPHA = '\p{Alpha}'
|
435
|
+
CC_ALNUM = CG_ALNUM = '\p{Alnum}'
|
436
|
+
CG_BLANK = '\p{Blank}'
|
437
|
+
CC_WORD = CG_WORD = '\p{Word}'
|
438
|
+
end
|
439
|
+
|
1143
440
|
QUOTE_SUBS = {}.tap do |accum|
|
1144
441
|
# unconstrained quotes:: can appear anywhere
|
1145
442
|
# constrained quotes:: must be bordered by non-word characters
|
@@ -1198,8 +495,8 @@ module Asciidoctor
|
|
1198
495
|
# (TM)
|
1199
496
|
[/\\?\(TM\)/, '™', :none],
|
1200
497
|
# foo -- bar (where either space character can be a newline)
|
1201
|
-
# NOTE this necessarily drops the newline if
|
1202
|
-
[/(
|
498
|
+
# NOTE this necessarily drops the newline if replacement appears at end of line
|
499
|
+
[/(?: |\n|^|\\)--(?: |\n|$)/, ' — ', :none],
|
1203
500
|
# foo--bar
|
1204
501
|
[/(#{CG_WORD})\\?--(?=#{CG_WORD})/, '—​', :leading],
|
1205
502
|
# ellipsis
|
@@ -1240,8 +537,8 @@ module Asciidoctor
|
|
1240
537
|
end unless RUBY_ENGINE == 'opal'
|
1241
538
|
|
1242
539
|
unless RUBY_ENGINE == 'opal'
|
1243
|
-
autoload :SyntaxHighlighter, %(#{
|
1244
|
-
autoload :Timings, %(#{
|
540
|
+
autoload :SyntaxHighlighter, %(#{__dir__}/asciidoctor/syntax_highlighter)
|
541
|
+
autoload :Timings, %(#{__dir__}/asciidoctor/timings)
|
1245
542
|
end
|
1246
543
|
end
|
1247
544
|
|
@@ -1251,6 +548,7 @@ require_relative 'asciidoctor/core_ext'
|
|
1251
548
|
# modules and helpers
|
1252
549
|
require_relative 'asciidoctor/helpers'
|
1253
550
|
require_relative 'asciidoctor/logging'
|
551
|
+
require_relative 'asciidoctor/rx'
|
1254
552
|
require_relative 'asciidoctor/substitutors'
|
1255
553
|
require_relative 'asciidoctor/version'
|
1256
554
|
|