mirror of https://github.com/istio/istio.io.git
Switch to PrismJS for syntax highlighting. (#1184)
Instead of doing syntax highlighting statically in Jekyll, we now go back to the PrimsJS library we used in the 0.2-0.4 timeframe. It used to be problematic, but the cause for the problems have been addressed a while ago. This gives us highlighting for non-markdown content, such as dynamically loaded PRE blocks and PRE blocks that come from HTML generated from protos.
This commit is contained in:
parent
9c01a288a8
commit
2505469708
|
@ -5,10 +5,12 @@ kramdown:
|
|||
auto_ids: true
|
||||
input: GFM
|
||||
hard_wrap: false
|
||||
syntax_highlighter_opts:
|
||||
disable : true
|
||||
|
||||
baseurl:
|
||||
|
||||
highlighter: rouge
|
||||
highlighter: none
|
||||
|
||||
liquid:
|
||||
error_mode: strict
|
||||
|
|
|
@ -115,7 +115,7 @@ Verify that the sidecar has been injected into the deployment.
|
|||
```bash
|
||||
kubectl get deployment sleep -o wide
|
||||
```
|
||||
```bash
|
||||
```xxx
|
||||
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
|
||||
sleep 1 1 1 1 2h sleep,istio-proxy tutum/curl,unknown/proxy:unknown app=sleep
|
||||
```
|
||||
|
@ -129,7 +129,7 @@ Sidecars can be automatically added to applicable Kubernetes pods using a
|
|||
kubectl api-versions | grep admissionregistration
|
||||
```
|
||||
|
||||
```bash
|
||||
```xxx
|
||||
admissionregistration.k8s.io/v1beta1
|
||||
```
|
||||
|
||||
|
|
|
@ -100,5 +100,6 @@ layout: compress
|
|||
|
||||
<!-- our own scripts -->
|
||||
<script src="{{home}}/js/misc.min.js"></script>
|
||||
<script src="{{home}}/js/prism.min.js" data-manual></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -137,17 +137,35 @@ thead+tbody tr:first-child td:last-child {
|
|||
border-radius: 0;
|
||||
}
|
||||
|
||||
code {
|
||||
color: $textCodeColor;
|
||||
font-size: 80%;
|
||||
font-weight: $textCodeWeight;
|
||||
word-break: normal;
|
||||
}
|
||||
|
||||
pre {
|
||||
margin: 1em;
|
||||
max-height: 31em;
|
||||
border: 1px solid $codeBlockBorderColor;
|
||||
border-left: 5px solid $codeBlockBorderColor;
|
||||
border: 1px solid $preBlockBorderColor;
|
||||
border-left: 5px solid $preBlockBorderColor;
|
||||
border-radius: 4px;
|
||||
box-shadow: 3px 3px 8px $codeBlockShadowColor;
|
||||
box-shadow: 3px 3px 8px $preBlockShadowColor;
|
||||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||
text-align: left;
|
||||
white-space: pre;
|
||||
word-spacing: normal;
|
||||
word-break: normal;
|
||||
word-wrap: normal;
|
||||
line-height: 1.5;
|
||||
tab-size: 4;
|
||||
hyphens: none;
|
||||
background: $preBlockBackgroundColor;
|
||||
|
||||
code {
|
||||
display: block;
|
||||
padding: .5em;
|
||||
color: $textColor;
|
||||
}
|
||||
|
||||
@media print {
|
||||
|
@ -322,13 +340,6 @@ blockquote {
|
|||
border-radius: 4px 4px 4px 4px;
|
||||
}
|
||||
|
||||
code {
|
||||
color: $textCodeColor;
|
||||
font-size: 80%;
|
||||
font-weight: $textCodeWeight;
|
||||
word-break: normal;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
height: .1rem;
|
||||
|
||||
|
|
|
@ -27,8 +27,9 @@ $dividerBarColor: rgba(255, 255, 255, .1);
|
|||
$glossaryHeaderColor: lighten($gray, 35%);
|
||||
$blockQuoteBackgroundColor: $dark-gray;
|
||||
$deprecatedBackgroundColor: silver;
|
||||
$codeBlockShadowColor: #777777;
|
||||
$codeBlockBorderColor: #777777;
|
||||
$preBlockShadowColor: #777777;
|
||||
$preBlockBorderColor: #777777;
|
||||
$preBlockBackgroundColor: #2d2d2d;
|
||||
$boxBorderColor: $textColor;
|
||||
|
||||
$headerLightShadowColor: rgba(0, 0, 0, .14);
|
||||
|
|
|
@ -1,60 +1,82 @@
|
|||
.highlight { background: $backgroundColor; color: $textColor; }
|
||||
.highlight .c { color: #999988; font-style: italic } /* Comment */
|
||||
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
|
||||
.highlight .k { font-weight: bold } /* Keyword */
|
||||
.highlight .o { font-weight: bold } /* Operator */
|
||||
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
|
||||
.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
|
||||
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
|
||||
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
|
||||
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
|
||||
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
|
||||
.highlight .ge { font-style: italic } /* Generic.Emph */
|
||||
.highlight .gr { color: #aa0000 } /* Generic.Error */
|
||||
.highlight .gh { color: #999999 } /* Generic.Heading */
|
||||
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
|
||||
.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
|
||||
.highlight .go { color: #888888 } /* Generic.Output */
|
||||
.highlight .gp { color: #555555 } /* Generic.Prompt */
|
||||
.highlight .gs { font-weight: bold } /* Generic.Strong */
|
||||
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
|
||||
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
|
||||
.highlight .kc { font-weight: bold } /* Keyword.Constant */
|
||||
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
|
||||
.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
|
||||
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
|
||||
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
|
||||
.highlight .m { color: #009999 } /* Literal.Number */
|
||||
.highlight .s { color: #ff4455 } /* Literal.String */
|
||||
.highlight .na { color: #00e0e0 } /* Name.Attribute */
|
||||
.highlight .nb { color: #0086B3 } /* Name.Builtin */
|
||||
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
|
||||
.highlight .no { color: #00e0e0 } /* Name.Constant */
|
||||
.highlight .ni { color: #e000e0 } /* Name.Entity */
|
||||
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
|
||||
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
|
||||
.highlight .nn { color: #555555 } /* Name.Namespace */
|
||||
.highlight .nt { color: #8080e0 } /* Name.Tag */
|
||||
.highlight .nv { color: #00e0e0 } /* Name.Variable */
|
||||
.highlight .ow { font-weight: bold } /* Operator.Word */
|
||||
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
|
||||
.highlight .mf { color: #009999 } /* Literal.Number.Float */
|
||||
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
|
||||
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
|
||||
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
|
||||
.highlight .sb { color: #ff4455 } /* Literal.String.Backtick */
|
||||
.highlight .sc { color: #ff4455 } /* Literal.String.Char */
|
||||
.highlight .sd { color: #ff4455 } /* Literal.String.Doc */
|
||||
.highlight .s2 { color: #ff4455 } /* Literal.String.Double */
|
||||
.highlight .se { color: #ff4455 } /* Literal.String.Escape */
|
||||
.highlight .sh { color: #ff4455 } /* Literal.String.Heredoc */
|
||||
.highlight .si { color: #ff4455 } /* Literal.String.Interpol */
|
||||
.highlight .sx { color: #ff4455 } /* Literal.String.Other */
|
||||
.highlight .sr { color: #009926 } /* Literal.String.Regex */
|
||||
.highlight .s1 { color: #ff4455 } /* Literal.String.Single */
|
||||
.highlight .ss { color: #990073 } /* Literal.String.Symbol */
|
||||
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
|
||||
.highlight .vc { color: #00e0e0 } /* Name.Variable.Class */
|
||||
.highlight .vg { color: #00e0e0 } /* Name.Variable.Global */
|
||||
.highlight .vi { color: #00e0e0 } /* Name.Variable.Instance */
|
||||
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
|
||||
/* PrismJS 1.14.0
|
||||
http://prismjs.com/download.html#themes=prism-tomorrow&languages=clike+javascript+bash+docker+go+java+protobuf+python+yaml */
|
||||
/**
|
||||
* prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML
|
||||
* Based on https://github.com/chriskempson/tomorrow-theme
|
||||
* @author Rose Pritchard
|
||||
*/
|
||||
|
||||
.token.comment,
|
||||
.token.block-comment,
|
||||
.token.prolog,
|
||||
.token.doctype,
|
||||
.token.cdata {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.token.punctuation {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
.token.tag,
|
||||
.token.attr-name,
|
||||
.token.namespace,
|
||||
.token.deleted {
|
||||
color: #e2777a;
|
||||
}
|
||||
|
||||
.token.function-name {
|
||||
color: #6196cc;
|
||||
}
|
||||
|
||||
.token.boolean,
|
||||
.token.number,
|
||||
.token.function {
|
||||
color: #f08d49;
|
||||
}
|
||||
|
||||
.token.property,
|
||||
.token.class-name,
|
||||
.token.constant,
|
||||
.token.symbol {
|
||||
color: #f8c555;
|
||||
}
|
||||
|
||||
.token.selector,
|
||||
.token.important,
|
||||
.token.atrule,
|
||||
.token.keyword,
|
||||
.token.builtin {
|
||||
color: #cc99cd;
|
||||
}
|
||||
|
||||
.token.string,
|
||||
.token.char,
|
||||
.token.attr-value,
|
||||
.token.regex,
|
||||
.token.variable {
|
||||
color: #7ec699;
|
||||
}
|
||||
|
||||
.token.operator,
|
||||
.token.entity,
|
||||
.token.url {
|
||||
color: #67cdcc;
|
||||
}
|
||||
|
||||
.token.important,
|
||||
.token.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
.token.italic {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.token.entity {
|
||||
cursor: help;
|
||||
}
|
||||
|
||||
.token.inserted {
|
||||
color: green;
|
||||
}
|
||||
|
||||
|
|
|
@ -27,8 +27,9 @@ $dividerBarColor: rgba(0, 0, 0, .1);
|
|||
$glossaryHeaderColor: lighten($gray, 35%);
|
||||
$blockQuoteBackgroundColor: $light-gray;
|
||||
$deprecatedBackgroundColor: silver;
|
||||
$codeBlockShadowColor: #a7a7a7;
|
||||
$codeBlockBorderColor: #dddddd;
|
||||
$preBlockShadowColor: #a7a7a7;
|
||||
$preBlockBorderColor: #dddddd;
|
||||
$preBlockBackgroundColor: $backgroundColor;
|
||||
$boxBorderColor: $secondBrandColor;
|
||||
|
||||
$headerLightShadowColor: rgba(0, 0, 0, .14);
|
||||
|
|
|
@ -1,60 +1,80 @@
|
|||
.highlight { background: #ffffff; }
|
||||
.highlight .c { color: #999988; font-style: italic } /* Comment */
|
||||
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
|
||||
.highlight .k { font-weight: bold } /* Keyword */
|
||||
.highlight .o { font-weight: bold } /* Operator */
|
||||
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
|
||||
.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
|
||||
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
|
||||
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
|
||||
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
|
||||
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
|
||||
.highlight .ge { font-style: italic } /* Generic.Emph */
|
||||
.highlight .gr { color: #aa0000 } /* Generic.Error */
|
||||
.highlight .gh { color: #999999 } /* Generic.Heading */
|
||||
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
|
||||
.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
|
||||
.highlight .go { color: #888888 } /* Generic.Output */
|
||||
.highlight .gp { color: #555555 } /* Generic.Prompt */
|
||||
.highlight .gs { font-weight: bold } /* Generic.Strong */
|
||||
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
|
||||
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
|
||||
.highlight .kc { font-weight: bold } /* Keyword.Constant */
|
||||
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
|
||||
.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
|
||||
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
|
||||
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
|
||||
.highlight .m { color: #009999 } /* Literal.Number */
|
||||
.highlight .s { color: #d14 } /* Literal.String */
|
||||
.highlight .na { color: #008080 } /* Name.Attribute */
|
||||
.highlight .nb { color: #0086B3 } /* Name.Builtin */
|
||||
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
|
||||
.highlight .no { color: #008080 } /* Name.Constant */
|
||||
.highlight .ni { color: #800080 } /* Name.Entity */
|
||||
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
|
||||
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
|
||||
.highlight .nn { color: #555555 } /* Name.Namespace */
|
||||
.highlight .nt { color: #000080 } /* Name.Tag */
|
||||
.highlight .nv { color: #008080 } /* Name.Variable */
|
||||
.highlight .ow { font-weight: bold } /* Operator.Word */
|
||||
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
|
||||
.highlight .mf { color: #009999 } /* Literal.Number.Float */
|
||||
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
|
||||
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
|
||||
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
|
||||
.highlight .sb { color: #d14 } /* Literal.String.Backtick */
|
||||
.highlight .sc { color: #d14 } /* Literal.String.Char */
|
||||
.highlight .sd { color: #d14 } /* Literal.String.Doc */
|
||||
.highlight .s2 { color: #d14 } /* Literal.String.Double */
|
||||
.highlight .se { color: #d14 } /* Literal.String.Escape */
|
||||
.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
|
||||
.highlight .si { color: #d14 } /* Literal.String.Interpol */
|
||||
.highlight .sx { color: #d14 } /* Literal.String.Other */
|
||||
.highlight .sr { color: #009926 } /* Literal.String.Regex */
|
||||
.highlight .s1 { color: #d14 } /* Literal.String.Single */
|
||||
.highlight .ss { color: #990073 } /* Literal.String.Symbol */
|
||||
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
|
||||
.highlight .vc { color: #008080 } /* Name.Variable.Class */
|
||||
.highlight .vg { color: #008080 } /* Name.Variable.Global */
|
||||
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
|
||||
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
|
||||
/* PrismJS 1.14.0
|
||||
http://prismjs.com/download.html#themes=prism&languages=clike+javascript+bash+docker+go+java+protobuf+python+yaml */
|
||||
/**
|
||||
* prism.js default theme for JavaScript, CSS and HTML
|
||||
* Based on dabblet (http://dabblet.com)
|
||||
* @author Lea Verou
|
||||
*/
|
||||
|
||||
.token.comment,
|
||||
.token.prolog,
|
||||
.token.doctype,
|
||||
.token.cdata {
|
||||
color: slategray;
|
||||
}
|
||||
|
||||
.token.punctuation {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.namespace {
|
||||
opacity: .7;
|
||||
}
|
||||
|
||||
.token.property,
|
||||
.token.tag,
|
||||
.token.boolean,
|
||||
.token.number,
|
||||
.token.constant,
|
||||
.token.symbol,
|
||||
.token.deleted {
|
||||
color: #905;
|
||||
}
|
||||
|
||||
.token.selector,
|
||||
.token.attr-name,
|
||||
.token.string,
|
||||
.token.char,
|
||||
.token.builtin,
|
||||
.token.inserted {
|
||||
color: #690;
|
||||
}
|
||||
|
||||
.token.operator,
|
||||
.token.entity,
|
||||
.token.url,
|
||||
.language-css .token.string,
|
||||
.style .token.string {
|
||||
color: #9a6e3a;
|
||||
background: hsla(0, 0%, 100%, .5);
|
||||
}
|
||||
|
||||
.token.atrule,
|
||||
.token.attr-value,
|
||||
.token.keyword {
|
||||
color: #07a;
|
||||
}
|
||||
|
||||
.token.function,
|
||||
.token.class-name {
|
||||
color: #DD4A68;
|
||||
}
|
||||
|
||||
.token.regex,
|
||||
.token.important,
|
||||
.token.variable {
|
||||
color: #e90;
|
||||
}
|
||||
|
||||
.token.important,
|
||||
.token.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
.token.italic {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.token.entity {
|
||||
cursor: help;
|
||||
}
|
||||
|
||||
|
|
400
js/misc.js
400
js/misc.js
|
@ -97,202 +97,227 @@ $(function ($) {
|
|||
});
|
||||
}(jQuery));
|
||||
|
||||
// Apply a bunch of systematic modification to the DOM of all pages.
|
||||
// Ideally, this stuff could be handled offline as part of preparing the
|
||||
// HTML, but alas our current toolchain won't allow that in a clean/simple
|
||||
// way.
|
||||
function patchDOM() {
|
||||
// Add a Copy button to all PRE blocks
|
||||
function attachCopyButtons() {
|
||||
var pre = document.getElementsByTagName('PRE');
|
||||
for (var i = 0; i < pre.length; i++) {
|
||||
var button = document.createElement("BUTTON");
|
||||
button.title = "Copy to clipboard";
|
||||
button.className = "copy copy-hide";
|
||||
button.innerText = "Copy";
|
||||
button.setAttribute("aria-label", "Copy to clipboard");
|
||||
|
||||
var parent = pre[i].parentElement;
|
||||
if (parent.tagName == "DIV") {
|
||||
// This is the case for HTML produced from markdown through Jekyll
|
||||
parent.appendChild(button);
|
||||
} else {
|
||||
// This is the case for HTML produced by protoc-gen-docs from proto sources
|
||||
// we hackily create a DIV on the fly to make this case look like what we get
|
||||
// from Jekyll
|
||||
var div = document.createElement("DIV")
|
||||
div.className = "highlight"
|
||||
parent.insertBefore(div, pre[i])
|
||||
div.appendChild(pre[i])
|
||||
div.appendChild(button)
|
||||
}
|
||||
}
|
||||
|
||||
var copyCode = new Clipboard('button.copy', {
|
||||
target: function (trigger) {
|
||||
return trigger.previousElementSibling;
|
||||
}
|
||||
});
|
||||
|
||||
// On success:
|
||||
// - Change the "Copy" text to "Done".
|
||||
// - Swap it to "Copy" in 2s.
|
||||
|
||||
copyCode.on('success', function (event) {
|
||||
event.clearSelection();
|
||||
event.trigger.textContent = 'Done';
|
||||
window.setTimeout(function () {
|
||||
event.trigger.textContent = 'Copy';
|
||||
}, 2000);
|
||||
});
|
||||
|
||||
// On error (Safari):
|
||||
// - Change to "Not supported"
|
||||
// - Swap it to "Copy" in 2s.
|
||||
|
||||
copyCode.on('error', function (event) {
|
||||
event.trigger.textContent = 'Not supported';
|
||||
window.setTimeout(function () {
|
||||
event.trigger.textContent = 'Copy';
|
||||
}, 5000);
|
||||
});
|
||||
}
|
||||
|
||||
function attachLink(node) {
|
||||
var i = document.createElement("i");
|
||||
i.className = "fa fa-link";
|
||||
|
||||
var anchor = document.createElement("a");
|
||||
anchor.className = "header-link";
|
||||
anchor.href = "#" + node.id;
|
||||
anchor.setAttribute("aria-hidden", "true");
|
||||
anchor.appendChild(i);
|
||||
|
||||
node.appendChild(anchor);
|
||||
}
|
||||
|
||||
// Add a link icon next to each header so people can easily get bookmarks to headers
|
||||
function attachLinksToHeaders() {
|
||||
for (var level = 1; level <= 6; level++) {
|
||||
var headers = document.getElementsByTagName("h" + level);
|
||||
for (var i = 0; i < headers.length; i++) {
|
||||
var header = headers[i]
|
||||
if (header.id !== "") {
|
||||
attachLink(header);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add a link icon next to each defined term so people can easily get bookmarks to them in the glossary
|
||||
function attachLinksToDefinedTerms() {
|
||||
var terms = document.getElementsByTagName("dt");
|
||||
for (var i = 0; i < terms.length; i++) {
|
||||
var term = terms[i]
|
||||
if (term.id !== "") {
|
||||
attachLink(term);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Make it so each link outside of the current domain opens up in a different window
|
||||
function makeOutsideLinksOpenInTabs() {
|
||||
var links = document.getElementsByTagName("a");
|
||||
for (var i = 0; i < links.length; i++) {
|
||||
var link = links[i];
|
||||
if (link.hostname && link.hostname != location.hostname) {
|
||||
link.setAttribute("target", "_blank")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Load the content of any externally-hosted PRE blocks
|
||||
function loadExternalPreBlocks() {
|
||||
|
||||
function fetchFile(elem, url) {
|
||||
fetch(url).then(response => response.text()).then(data => {
|
||||
elem.firstChild.innerText = data;
|
||||
});
|
||||
}
|
||||
|
||||
var pre = document.getElementsByTagName('PRE');
|
||||
for (var i = 0; i < pre.length; i++) {
|
||||
if (pre[i].hasAttribute("data-src")) {
|
||||
fetchFile(pre[i], pre[i].getAttribute("data-src"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function createEndnotes() {
|
||||
var notes = document.getElementById("endnotes");
|
||||
if (notes == undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
// look for anchors in the main section of the doc only (skip headers, footers, tocs, nav bars, etc)
|
||||
var main = document.getElementsByTagName("main")[0];
|
||||
var links = main.getElementsByTagName("a");
|
||||
var count = 1;
|
||||
for (var i = 0; i < links.length; i++) {
|
||||
var link = links[i];
|
||||
if (link.pathname == location.pathname) {
|
||||
// skip links on the current page
|
||||
continue;
|
||||
}
|
||||
|
||||
if (link.pathname.endsWith("/") && link.hash != "") {
|
||||
// skip links on the current page
|
||||
continue;
|
||||
}
|
||||
|
||||
if (link.parentElement.tagName == "FIGURE") {
|
||||
// skip links inside figures
|
||||
continue;
|
||||
}
|
||||
|
||||
// add the superscript reference
|
||||
link.insertAdjacentHTML("afterend", "<sup class='endnote-ref'>" + count + "</sup>");
|
||||
|
||||
// and add a list entry for the link
|
||||
var li = document.createElement("li");
|
||||
li.innerText = link.href;
|
||||
notes.appendChild(li);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
attachCopyButtons();
|
||||
attachLinksToHeaders();
|
||||
attachLinksToDefinedTerms();
|
||||
makeOutsideLinksOpenInTabs();
|
||||
loadExternalPreBlocks();
|
||||
createEndnotes();
|
||||
// Scroll the document to the top
|
||||
function scrollToTop() {
|
||||
document.body.scrollTop = 0; // For Safari
|
||||
document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera
|
||||
}
|
||||
|
||||
// initialized after the DOM has been loaded
|
||||
// initialized after the DOM has been loaded by getDOMTopology
|
||||
var scrollToTopButton;
|
||||
var tocLinks;
|
||||
var tocHeadings;
|
||||
|
||||
// discover a few DOM elements up front so we don't need to do it a zillion times for the life of the page
|
||||
function getDOMTopology() {
|
||||
scrollToTopButton = document.getElementById("scroll-to-top");
|
||||
// post-processing we do once the DOM has loaded
|
||||
function handleDOMLoaded() {
|
||||
|
||||
var toc = document.getElementById("toc");
|
||||
if (toc != undefined) {
|
||||
tocLinks = toc.getElementsByTagName("A");
|
||||
tocHeadings = new Array(tocLinks.length);
|
||||
// Apply a bunch of systematic modification to the DOM of all pages.
|
||||
// Ideally, this stuff could be handled offline as part of preparing the
|
||||
// HTML, but alas our current toolchain won't allow that in a clean/simple
|
||||
// way.
|
||||
function patchDOM() {
|
||||
// Add a Copy button to all PRE blocks
|
||||
function attachCopyButtons() {
|
||||
var pre = document.getElementsByTagName('PRE');
|
||||
for (var i = 0; i < pre.length; i++) {
|
||||
var button = document.createElement("BUTTON");
|
||||
button.title = "Copy to clipboard";
|
||||
button.className = "copy copy-hide";
|
||||
button.innerText = "Copy";
|
||||
button.setAttribute("aria-label", "Copy to clipboard");
|
||||
|
||||
for (var i = 0; i < tocLinks.length; i++) {
|
||||
tocHeadings[i] = document.getElementById(tocLinks[i].hash.substring(1));
|
||||
var parent = pre[i].parentElement;
|
||||
if (parent.tagName == "DIV") {
|
||||
// This is the case for HTML produced from markdown through Jekyll
|
||||
parent.appendChild(button);
|
||||
} else {
|
||||
// This is the case for HTML produced by protoc-gen-docs from proto sources
|
||||
// we hackily create a DIV on the fly to make this case look like what we get
|
||||
// from Jekyll
|
||||
var div = document.createElement("DIV")
|
||||
div.className = "highlight"
|
||||
parent.insertBefore(div, pre[i])
|
||||
div.appendChild(pre[i])
|
||||
div.appendChild(button)
|
||||
}
|
||||
|
||||
// apply syntax highlighting
|
||||
Prism.highlightElement(pre[i].firstChild, false)
|
||||
}
|
||||
|
||||
var copyCode = new Clipboard('button.copy', {
|
||||
target: function (trigger) {
|
||||
return trigger.previousElementSibling;
|
||||
}
|
||||
});
|
||||
|
||||
// On success:
|
||||
// - Change the "Copy" text to "Done".
|
||||
// - Swap it to "Copy" in 2s.
|
||||
|
||||
copyCode.on('success', function (event) {
|
||||
event.clearSelection();
|
||||
event.trigger.textContent = 'Done';
|
||||
window.setTimeout(function () {
|
||||
event.trigger.textContent = 'Copy';
|
||||
}, 2000);
|
||||
});
|
||||
|
||||
// On error (Safari):
|
||||
// - Change to "Not supported"
|
||||
// - Swap it to "Copy" in 2s.
|
||||
|
||||
copyCode.on('error', function (event) {
|
||||
event.trigger.textContent = 'Not supported';
|
||||
window.setTimeout(function () {
|
||||
event.trigger.textContent = 'Copy';
|
||||
}, 5000);
|
||||
});
|
||||
}
|
||||
|
||||
function applySyntaxColoring() {
|
||||
var pre = document.getElementsByTagName('PRE');
|
||||
for (var i = 0; i < pre.length; i++) {
|
||||
Prism.highlightElement(pre[i].firstChild, false)
|
||||
}
|
||||
}
|
||||
|
||||
function attachLink(node) {
|
||||
var i = document.createElement("i");
|
||||
i.className = "fa fa-link";
|
||||
|
||||
var anchor = document.createElement("a");
|
||||
anchor.className = "header-link";
|
||||
anchor.href = "#" + node.id;
|
||||
anchor.setAttribute("aria-hidden", "true");
|
||||
anchor.appendChild(i);
|
||||
|
||||
node.appendChild(anchor);
|
||||
}
|
||||
|
||||
// Add a link icon next to each header so people can easily get bookmarks to headers
|
||||
function attachLinksToHeaders() {
|
||||
for (var level = 1; level <= 6; level++) {
|
||||
var headers = document.getElementsByTagName("h" + level);
|
||||
for (var i = 0; i < headers.length; i++) {
|
||||
var header = headers[i]
|
||||
if (header.id !== "") {
|
||||
attachLink(header);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add a link icon next to each defined term so people can easily get bookmarks to them in the glossary
|
||||
function attachLinksToDefinedTerms() {
|
||||
var terms = document.getElementsByTagName("dt");
|
||||
for (var i = 0; i < terms.length; i++) {
|
||||
var term = terms[i]
|
||||
if (term.id !== "") {
|
||||
attachLink(term);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Make it so each link outside of the current domain opens up in a different window
|
||||
function makeOutsideLinksOpenInTabs() {
|
||||
var links = document.getElementsByTagName("a");
|
||||
for (var i = 0; i < links.length; i++) {
|
||||
var link = links[i];
|
||||
if (link.hostname && link.hostname != location.hostname) {
|
||||
link.setAttribute("target", "_blank")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Load the content of any externally-hosted PRE blocks
|
||||
function loadExternalPreBlocks() {
|
||||
|
||||
function fetchFile(elem, url) {
|
||||
fetch(url).then(response => response.text()).then(data => {
|
||||
elem.firstChild.innerText = data;
|
||||
});
|
||||
}
|
||||
|
||||
var pre = document.getElementsByTagName('PRE');
|
||||
for (var i = 0; i < pre.length; i++) {
|
||||
if (pre[i].hasAttribute("data-src")) {
|
||||
fetchFile(pre[i], pre[i].getAttribute("data-src"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function createEndnotes() {
|
||||
var notes = document.getElementById("endnotes");
|
||||
if (notes == undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
// look for anchors in the main section of the doc only (skip headers, footers, tocs, nav bars, etc)
|
||||
var main = document.getElementsByTagName("main")[0];
|
||||
var links = main.getElementsByTagName("a");
|
||||
var count = 1;
|
||||
for (var i = 0; i < links.length; i++) {
|
||||
var link = links[i];
|
||||
if (link.pathname == location.pathname) {
|
||||
// skip links on the current page
|
||||
continue;
|
||||
}
|
||||
|
||||
if (link.pathname.endsWith("/") && link.hash != "") {
|
||||
// skip links on the current page
|
||||
continue;
|
||||
}
|
||||
|
||||
if (link.parentElement.tagName == "FIGURE") {
|
||||
// skip links inside figures
|
||||
continue;
|
||||
}
|
||||
|
||||
// add the superscript reference
|
||||
link.insertAdjacentHTML("afterend", "<sup class='endnote-ref'>" + count + "</sup>");
|
||||
|
||||
// and add a list entry for the link
|
||||
var li = document.createElement("li");
|
||||
li.innerText = link.href;
|
||||
notes.appendChild(li);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
attachCopyButtons();
|
||||
applySyntaxColoring();
|
||||
attachLinksToHeaders();
|
||||
attachLinksToDefinedTerms();
|
||||
makeOutsideLinksOpenInTabs();
|
||||
loadExternalPreBlocks();
|
||||
createEndnotes();
|
||||
}
|
||||
|
||||
// discover a few DOM elements up front so we don't need to do it a zillion times for the life of the page
|
||||
function getDOMTopology() {
|
||||
scrollToTopButton = document.getElementById("scroll-to-top");
|
||||
|
||||
var toc = document.getElementById("toc");
|
||||
if (toc != undefined) {
|
||||
tocLinks = toc.getElementsByTagName("A");
|
||||
tocHeadings = new Array(tocLinks.length);
|
||||
|
||||
for (var i = 0; i < tocLinks.length; i++) {
|
||||
tocHeadings[i] = document.getElementById(tocLinks[i].hash.substring(1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
patchDOM();
|
||||
getDOMTopology();
|
||||
|
||||
// one forced call here to make sure everything looks right
|
||||
handleScroll();
|
||||
handlePageScroll();
|
||||
}
|
||||
|
||||
function handleScroll() {
|
||||
// What we do when the user scrolls the page
|
||||
function handlePageScroll() {
|
||||
// Based on the scroll position, make the "scroll to top" button visible or not
|
||||
function controlScrollToTopButton() {
|
||||
if (scrollToTopButton) {
|
||||
|
@ -346,12 +371,5 @@ function handleScroll() {
|
|||
controlTOCActivation();
|
||||
}
|
||||
|
||||
// Scroll the document to the top
|
||||
function scrollToTop() {
|
||||
document.body.scrollTop = 0; // For Safari
|
||||
document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", patchDOM);
|
||||
document.addEventListener("DOMContentLoaded", getDOMTopology);
|
||||
window.addEventListener("scroll", handleScroll);
|
||||
document.addEventListener("DOMContentLoaded", handleDOMLoaded);
|
||||
window.addEventListener("scroll", handlePageScroll);
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,870 @@
|
|||
/* PrismJS 1.14.0
|
||||
http://prismjs.com/download.html#themes=prism&languages=clike+javascript+bash+docker+go+java+protobuf+python+yaml */
|
||||
var _self = (typeof window !== 'undefined')
|
||||
? window // if in browser
|
||||
: (
|
||||
(typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)
|
||||
? self // if in worker
|
||||
: {} // if in node js
|
||||
);
|
||||
|
||||
/**
|
||||
* Prism: Lightweight, robust, elegant syntax highlighting
|
||||
* MIT license http://www.opensource.org/licenses/mit-license.php/
|
||||
* @author Lea Verou http://lea.verou.me
|
||||
*/
|
||||
|
||||
var Prism = (function(){
|
||||
|
||||
// Private helper vars
|
||||
var lang = /\blang(?:uage)?-([\w-]+)\b/i;
|
||||
var uniqueId = 0;
|
||||
|
||||
var _ = _self.Prism = {
|
||||
manual: _self.Prism && _self.Prism.manual,
|
||||
disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,
|
||||
util: {
|
||||
encode: function (tokens) {
|
||||
if (tokens instanceof Token) {
|
||||
return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);
|
||||
} else if (_.util.type(tokens) === 'Array') {
|
||||
return tokens.map(_.util.encode);
|
||||
} else {
|
||||
return tokens.replace(/&/g, '&').replace(/</g, '<').replace(/\u00a0/g, ' ');
|
||||
}
|
||||
},
|
||||
|
||||
type: function (o) {
|
||||
return Object.prototype.toString.call(o).match(/\[object (\w+)\]/)[1];
|
||||
},
|
||||
|
||||
objId: function (obj) {
|
||||
if (!obj['__id']) {
|
||||
Object.defineProperty(obj, '__id', { value: ++uniqueId });
|
||||
}
|
||||
return obj['__id'];
|
||||
},
|
||||
|
||||
// Deep clone a language definition (e.g. to extend it)
|
||||
clone: function (o, visited) {
|
||||
var type = _.util.type(o);
|
||||
visited = visited || {};
|
||||
|
||||
switch (type) {
|
||||
case 'Object':
|
||||
if (visited[_.util.objId(o)]) {
|
||||
return visited[_.util.objId(o)];
|
||||
}
|
||||
var clone = {};
|
||||
visited[_.util.objId(o)] = clone;
|
||||
|
||||
for (var key in o) {
|
||||
if (o.hasOwnProperty(key)) {
|
||||
clone[key] = _.util.clone(o[key], visited);
|
||||
}
|
||||
}
|
||||
|
||||
return clone;
|
||||
|
||||
case 'Array':
|
||||
if (visited[_.util.objId(o)]) {
|
||||
return visited[_.util.objId(o)];
|
||||
}
|
||||
var clone = [];
|
||||
visited[_.util.objId(o)] = clone;
|
||||
|
||||
o.forEach(function (v, i) {
|
||||
clone[i] = _.util.clone(v, visited);
|
||||
});
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
return o;
|
||||
}
|
||||
},
|
||||
|
||||
languages: {
|
||||
extend: function (id, redef) {
|
||||
var lang = _.util.clone(_.languages[id]);
|
||||
|
||||
for (var key in redef) {
|
||||
lang[key] = redef[key];
|
||||
}
|
||||
|
||||
return lang;
|
||||
},
|
||||
|
||||
/**
|
||||
* Insert a token before another token in a language literal
|
||||
* As this needs to recreate the object (we cannot actually insert before keys in object literals),
|
||||
* we cannot just provide an object, we need anobject and a key.
|
||||
* @param inside The key (or language id) of the parent
|
||||
* @param before The key to insert before. If not provided, the function appends instead.
|
||||
* @param insert Object with the key/value pairs to insert
|
||||
* @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.
|
||||
*/
|
||||
insertBefore: function (inside, before, insert, root) {
|
||||
root = root || _.languages;
|
||||
var grammar = root[inside];
|
||||
|
||||
if (arguments.length == 2) {
|
||||
insert = arguments[1];
|
||||
|
||||
for (var newToken in insert) {
|
||||
if (insert.hasOwnProperty(newToken)) {
|
||||
grammar[newToken] = insert[newToken];
|
||||
}
|
||||
}
|
||||
|
||||
return grammar;
|
||||
}
|
||||
|
||||
var ret = {};
|
||||
|
||||
for (var token in grammar) {
|
||||
|
||||
if (grammar.hasOwnProperty(token)) {
|
||||
|
||||
if (token == before) {
|
||||
|
||||
for (var newToken in insert) {
|
||||
|
||||
if (insert.hasOwnProperty(newToken)) {
|
||||
ret[newToken] = insert[newToken];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ret[token] = grammar[token];
|
||||
}
|
||||
}
|
||||
|
||||
// Update references in other language definitions
|
||||
_.languages.DFS(_.languages, function(key, value) {
|
||||
if (value === root[inside] && key != inside) {
|
||||
this[key] = ret;
|
||||
}
|
||||
});
|
||||
|
||||
return root[inside] = ret;
|
||||
},
|
||||
|
||||
// Traverse a language definition with Depth First Search
|
||||
DFS: function(o, callback, type, visited) {
|
||||
visited = visited || {};
|
||||
for (var i in o) {
|
||||
if (o.hasOwnProperty(i)) {
|
||||
callback.call(o, i, o[i], type || i);
|
||||
|
||||
if (_.util.type(o[i]) === 'Object' && !visited[_.util.objId(o[i])]) {
|
||||
visited[_.util.objId(o[i])] = true;
|
||||
_.languages.DFS(o[i], callback, null, visited);
|
||||
}
|
||||
else if (_.util.type(o[i]) === 'Array' && !visited[_.util.objId(o[i])]) {
|
||||
visited[_.util.objId(o[i])] = true;
|
||||
_.languages.DFS(o[i], callback, i, visited);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: {},
|
||||
|
||||
highlightAll: function(async, callback) {
|
||||
_.highlightAllUnder(document, async, callback);
|
||||
},
|
||||
|
||||
highlightAllUnder: function(container, async, callback) {
|
||||
var env = {
|
||||
callback: callback,
|
||||
selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
|
||||
};
|
||||
|
||||
_.hooks.run("before-highlightall", env);
|
||||
|
||||
var elements = env.elements || container.querySelectorAll(env.selector);
|
||||
|
||||
for (var i=0, element; element = elements[i++];) {
|
||||
_.highlightElement(element, async === true, env.callback);
|
||||
}
|
||||
},
|
||||
|
||||
highlightElement: function(element, async, callback) {
|
||||
// Find language
|
||||
var language, grammar, parent = element;
|
||||
|
||||
while (parent && !lang.test(parent.className)) {
|
||||
parent = parent.parentNode;
|
||||
}
|
||||
|
||||
if (parent) {
|
||||
language = (parent.className.match(lang) || [,''])[1].toLowerCase();
|
||||
grammar = _.languages[language];
|
||||
}
|
||||
|
||||
// Set language on the element, if not present
|
||||
element.className = element.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
|
||||
|
||||
if (element.parentNode) {
|
||||
// Set language on the parent, for styling
|
||||
parent = element.parentNode;
|
||||
|
||||
if (/pre/i.test(parent.nodeName)) {
|
||||
parent.className = parent.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
|
||||
}
|
||||
}
|
||||
|
||||
var code = element.textContent;
|
||||
|
||||
var env = {
|
||||
element: element,
|
||||
language: language,
|
||||
grammar: grammar,
|
||||
code: code
|
||||
};
|
||||
|
||||
_.hooks.run('before-sanity-check', env);
|
||||
|
||||
if (!env.code || !env.grammar) {
|
||||
if (env.code) {
|
||||
_.hooks.run('before-highlight', env);
|
||||
env.element.textContent = env.code;
|
||||
_.hooks.run('after-highlight', env);
|
||||
}
|
||||
_.hooks.run('complete', env);
|
||||
return;
|
||||
}
|
||||
|
||||
_.hooks.run('before-highlight', env);
|
||||
|
||||
if (async && _self.Worker) {
|
||||
var worker = new Worker(_.filename);
|
||||
|
||||
worker.onmessage = function(evt) {
|
||||
env.highlightedCode = evt.data;
|
||||
|
||||
_.hooks.run('before-insert', env);
|
||||
|
||||
env.element.innerHTML = env.highlightedCode;
|
||||
|
||||
callback && callback.call(env.element);
|
||||
_.hooks.run('after-highlight', env);
|
||||
_.hooks.run('complete', env);
|
||||
};
|
||||
|
||||
worker.postMessage(JSON.stringify({
|
||||
language: env.language,
|
||||
code: env.code,
|
||||
immediateClose: true
|
||||
}));
|
||||
}
|
||||
else {
|
||||
env.highlightedCode = _.highlight(env.code, env.grammar, env.language);
|
||||
|
||||
_.hooks.run('before-insert', env);
|
||||
|
||||
env.element.innerHTML = env.highlightedCode;
|
||||
|
||||
callback && callback.call(element);
|
||||
|
||||
_.hooks.run('after-highlight', env);
|
||||
_.hooks.run('complete', env);
|
||||
}
|
||||
},
|
||||
|
||||
highlight: function (text, grammar, language) {
|
||||
var env = {
|
||||
code: text,
|
||||
grammar: grammar,
|
||||
language: language
|
||||
};
|
||||
_.hooks.run('before-tokenize', env);
|
||||
env.tokens = _.tokenize(env.code, env.grammar);
|
||||
_.hooks.run('after-tokenize', env);
|
||||
return Token.stringify(_.util.encode(env.tokens), env.language);
|
||||
},
|
||||
|
||||
matchGrammar: function (text, strarr, grammar, index, startPos, oneshot, target) {
|
||||
var Token = _.Token;
|
||||
|
||||
for (var token in grammar) {
|
||||
if(!grammar.hasOwnProperty(token) || !grammar[token]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (token == target) {
|
||||
return;
|
||||
}
|
||||
|
||||
var patterns = grammar[token];
|
||||
patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns];
|
||||
|
||||
for (var j = 0; j < patterns.length; ++j) {
|
||||
var pattern = patterns[j],
|
||||
inside = pattern.inside,
|
||||
lookbehind = !!pattern.lookbehind,
|
||||
greedy = !!pattern.greedy,
|
||||
lookbehindLength = 0,
|
||||
alias = pattern.alias;
|
||||
|
||||
if (greedy && !pattern.pattern.global) {
|
||||
// Without the global flag, lastIndex won't work
|
||||
var flags = pattern.pattern.toString().match(/[imuy]*$/)[0];
|
||||
pattern.pattern = RegExp(pattern.pattern.source, flags + "g");
|
||||
}
|
||||
|
||||
pattern = pattern.pattern || pattern;
|
||||
|
||||
// Don’t cache length as it changes during the loop
|
||||
for (var i = index, pos = startPos; i < strarr.length; pos += strarr[i].length, ++i) {
|
||||
|
||||
var str = strarr[i];
|
||||
|
||||
if (strarr.length > text.length) {
|
||||
// Something went terribly wrong, ABORT, ABORT!
|
||||
return;
|
||||
}
|
||||
|
||||
if (str instanceof Token) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (greedy && i != strarr.length - 1) {
|
||||
pattern.lastIndex = pos;
|
||||
var match = pattern.exec(text);
|
||||
if (!match) {
|
||||
break;
|
||||
}
|
||||
|
||||
var from = match.index + (lookbehind ? match[1].length : 0),
|
||||
to = match.index + match[0].length,
|
||||
k = i,
|
||||
p = pos;
|
||||
|
||||
for (var len = strarr.length; k < len && (p < to || (!strarr[k].type && !strarr[k - 1].greedy)); ++k) {
|
||||
p += strarr[k].length;
|
||||
// Move the index i to the element in strarr that is closest to from
|
||||
if (from >= p) {
|
||||
++i;
|
||||
pos = p;
|
||||
}
|
||||
}
|
||||
|
||||
// If strarr[i] is a Token, then the match starts inside another Token, which is invalid
|
||||
if (strarr[i] instanceof Token) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Number of tokens to delete and replace with the new match
|
||||
delNum = k - i;
|
||||
str = text.slice(pos, p);
|
||||
match.index -= pos;
|
||||
} else {
|
||||
pattern.lastIndex = 0;
|
||||
|
||||
var match = pattern.exec(str),
|
||||
delNum = 1;
|
||||
}
|
||||
|
||||
if (!match) {
|
||||
if (oneshot) {
|
||||
break;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if(lookbehind) {
|
||||
lookbehindLength = match[1] ? match[1].length : 0;
|
||||
}
|
||||
|
||||
var from = match.index + lookbehindLength,
|
||||
match = match[0].slice(lookbehindLength),
|
||||
to = from + match.length,
|
||||
before = str.slice(0, from),
|
||||
after = str.slice(to);
|
||||
|
||||
var args = [i, delNum];
|
||||
|
||||
if (before) {
|
||||
++i;
|
||||
pos += before.length;
|
||||
args.push(before);
|
||||
}
|
||||
|
||||
var wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias, match, greedy);
|
||||
|
||||
args.push(wrapped);
|
||||
|
||||
if (after) {
|
||||
args.push(after);
|
||||
}
|
||||
|
||||
Array.prototype.splice.apply(strarr, args);
|
||||
|
||||
if (delNum != 1)
|
||||
_.matchGrammar(text, strarr, grammar, i, pos, true, token);
|
||||
|
||||
if (oneshot)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
tokenize: function(text, grammar, language) {
|
||||
var strarr = [text];
|
||||
|
||||
var rest = grammar.rest;
|
||||
|
||||
if (rest) {
|
||||
for (var token in rest) {
|
||||
grammar[token] = rest[token];
|
||||
}
|
||||
|
||||
delete grammar.rest;
|
||||
}
|
||||
|
||||
_.matchGrammar(text, strarr, grammar, 0, 0, false);
|
||||
|
||||
return strarr;
|
||||
},
|
||||
|
||||
hooks: {
|
||||
all: {},
|
||||
|
||||
add: function (name, callback) {
|
||||
var hooks = _.hooks.all;
|
||||
|
||||
hooks[name] = hooks[name] || [];
|
||||
|
||||
hooks[name].push(callback);
|
||||
},
|
||||
|
||||
run: function (name, env) {
|
||||
var callbacks = _.hooks.all[name];
|
||||
|
||||
if (!callbacks || !callbacks.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (var i=0, callback; callback = callbacks[i++];) {
|
||||
callback(env);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var Token = _.Token = function(type, content, alias, matchedStr, greedy) {
|
||||
this.type = type;
|
||||
this.content = content;
|
||||
this.alias = alias;
|
||||
// Copy of the full string this token was created from
|
||||
this.length = (matchedStr || "").length|0;
|
||||
this.greedy = !!greedy;
|
||||
};
|
||||
|
||||
Token.stringify = function(o, language, parent) {
|
||||
if (typeof o == 'string') {
|
||||
return o;
|
||||
}
|
||||
|
||||
if (_.util.type(o) === 'Array') {
|
||||
return o.map(function(element) {
|
||||
return Token.stringify(element, language, o);
|
||||
}).join('');
|
||||
}
|
||||
|
||||
var env = {
|
||||
type: o.type,
|
||||
content: Token.stringify(o.content, language, parent),
|
||||
tag: 'span',
|
||||
classes: ['token', o.type],
|
||||
attributes: {},
|
||||
language: language,
|
||||
parent: parent
|
||||
};
|
||||
|
||||
if (o.alias) {
|
||||
var aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];
|
||||
Array.prototype.push.apply(env.classes, aliases);
|
||||
}
|
||||
|
||||
_.hooks.run('wrap', env);
|
||||
|
||||
var attributes = Object.keys(env.attributes).map(function(name) {
|
||||
return name + '="' + (env.attributes[name] || '').replace(/"/g, '"') + '"';
|
||||
}).join(' ');
|
||||
|
||||
return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + (attributes ? ' ' + attributes : '') + '>' + env.content + '</' + env.tag + '>';
|
||||
|
||||
};
|
||||
|
||||
if (!_self.document) {
|
||||
if (!_self.addEventListener) {
|
||||
// in Node.js
|
||||
return _self.Prism;
|
||||
}
|
||||
|
||||
if (!_.disableWorkerMessageHandler) {
|
||||
// In worker
|
||||
_self.addEventListener('message', function (evt) {
|
||||
var message = JSON.parse(evt.data),
|
||||
lang = message.language,
|
||||
code = message.code,
|
||||
immediateClose = message.immediateClose;
|
||||
|
||||
_self.postMessage(_.highlight(code, _.languages[lang], lang));
|
||||
if (immediateClose) {
|
||||
_self.close();
|
||||
}
|
||||
}, false);
|
||||
}
|
||||
|
||||
return _self.Prism;
|
||||
}
|
||||
|
||||
//Get current script and highlight
|
||||
var script = document.currentScript || [].slice.call(document.getElementsByTagName("script")).pop();
|
||||
|
||||
if (script) {
|
||||
_.filename = script.src;
|
||||
|
||||
if (!_.manual && !script.hasAttribute('data-manual')) {
|
||||
if(document.readyState !== "loading") {
|
||||
if (window.requestAnimationFrame) {
|
||||
window.requestAnimationFrame(_.highlightAll);
|
||||
} else {
|
||||
window.setTimeout(_.highlightAll, 16);
|
||||
}
|
||||
}
|
||||
else {
|
||||
document.addEventListener('DOMContentLoaded', _.highlightAll);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return _self.Prism;
|
||||
|
||||
})();
|
||||
|
||||
if (typeof module !== 'undefined' && module.exports) {
|
||||
module.exports = Prism;
|
||||
}
|
||||
|
||||
// hack for components to work correctly in node.js
|
||||
if (typeof global !== 'undefined') {
|
||||
global.Prism = Prism;
|
||||
}
|
||||
;
|
||||
Prism.languages.clike = {
|
||||
'comment': [
|
||||
{
|
||||
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
|
||||
lookbehind: true
|
||||
},
|
||||
{
|
||||
pattern: /(^|[^\\:])\/\/.*/,
|
||||
lookbehind: true,
|
||||
greedy: true
|
||||
}
|
||||
],
|
||||
'string': {
|
||||
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
|
||||
greedy: true
|
||||
},
|
||||
'class-name': {
|
||||
pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,
|
||||
lookbehind: true,
|
||||
inside: {
|
||||
punctuation: /[.\\]/
|
||||
}
|
||||
},
|
||||
'keyword': /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,
|
||||
'boolean': /\b(?:true|false)\b/,
|
||||
'function': /[a-z0-9_]+(?=\()/i,
|
||||
'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,
|
||||
'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,
|
||||
'punctuation': /[{}[\];(),.:]/
|
||||
};
|
||||
|
||||
Prism.languages.javascript = Prism.languages.extend('clike', {
|
||||
'keyword': /\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,
|
||||
'number': /\b(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,
|
||||
// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
|
||||
'function': /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\()/i,
|
||||
'operator': /-[-=]?|\+[+=]?|!=?=?|<<?=?|>>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/
|
||||
});
|
||||
|
||||
Prism.languages.insertBefore('javascript', 'keyword', {
|
||||
'regex': {
|
||||
pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[[^\]\r\n]+]|\\.|[^/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/,
|
||||
lookbehind: true,
|
||||
greedy: true
|
||||
},
|
||||
// This must be declared before keyword because we use "function" inside the look-forward
|
||||
'function-variable': {
|
||||
pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=\s*(?:function\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i,
|
||||
alias: 'function'
|
||||
},
|
||||
'constant': /\b[A-Z][A-Z\d_]*\b/
|
||||
});
|
||||
|
||||
Prism.languages.insertBefore('javascript', 'string', {
|
||||
'template-string': {
|
||||
pattern: /`(?:\\[\s\S]|[^\\`])*`/,
|
||||
greedy: true,
|
||||
inside: {
|
||||
'interpolation': {
|
||||
pattern: /\$\{[^}]+\}/,
|
||||
inside: {
|
||||
'interpolation-punctuation': {
|
||||
pattern: /^\$\{|\}$/,
|
||||
alias: 'punctuation'
|
||||
},
|
||||
rest: Prism.languages.javascript
|
||||
}
|
||||
},
|
||||
'string': /[\s\S]+/
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (Prism.languages.markup) {
|
||||
Prism.languages.insertBefore('markup', 'tag', {
|
||||
'script': {
|
||||
pattern: /(<script[\s\S]*?>)[\s\S]*?(?=<\/script>)/i,
|
||||
lookbehind: true,
|
||||
inside: Prism.languages.javascript,
|
||||
alias: 'language-javascript',
|
||||
greedy: true
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Prism.languages.js = Prism.languages.javascript;
|
||||
|
||||
(function(Prism) {
|
||||
var insideString = {
|
||||
variable: [
|
||||
// Arithmetic Environment
|
||||
{
|
||||
pattern: /\$?\(\([\s\S]+?\)\)/,
|
||||
inside: {
|
||||
// If there is a $ sign at the beginning highlight $(( and )) as variable
|
||||
variable: [{
|
||||
pattern: /(^\$\(\([\s\S]+)\)\)/,
|
||||
lookbehind: true
|
||||
},
|
||||
/^\$\(\(/
|
||||
],
|
||||
number: /\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,
|
||||
// Operators according to https://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic
|
||||
operator: /--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,
|
||||
// If there is no $ sign at the beginning highlight (( and )) as punctuation
|
||||
punctuation: /\(\(?|\)\)?|,|;/
|
||||
}
|
||||
},
|
||||
// Command Substitution
|
||||
{
|
||||
pattern: /\$\([^)]+\)|`[^`]+`/,
|
||||
greedy: true,
|
||||
inside: {
|
||||
variable: /^\$\(|^`|\)$|`$/
|
||||
}
|
||||
},
|
||||
/\$(?:[\w#?*!@]+|\{[^}]+\})/i
|
||||
]
|
||||
};
|
||||
|
||||
Prism.languages.bash = {
|
||||
'shebang': {
|
||||
pattern: /^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,
|
||||
alias: 'important'
|
||||
},
|
||||
'comment': {
|
||||
pattern: /(^|[^"{\\])#.*/,
|
||||
lookbehind: true
|
||||
},
|
||||
'string': [
|
||||
//Support for Here-Documents https://en.wikipedia.org/wiki/Here_document
|
||||
{
|
||||
pattern: /((?:^|[^<])<<\s*)["']?(\w+?)["']?\s*\r?\n(?:[\s\S])*?\r?\n\2/,
|
||||
lookbehind: true,
|
||||
greedy: true,
|
||||
inside: insideString
|
||||
},
|
||||
{
|
||||
pattern: /(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/,
|
||||
greedy: true,
|
||||
inside: insideString
|
||||
}
|
||||
],
|
||||
'variable': insideString.variable,
|
||||
// Originally based on http://ss64.com/bash/
|
||||
'function': {
|
||||
pattern: /(^|[\s;|&])(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|npm|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)(?=$|[\s;|&])/,
|
||||
lookbehind: true
|
||||
},
|
||||
'keyword': {
|
||||
pattern: /(^|[\s;|&])(?:let|:|\.|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)(?=$|[\s;|&])/,
|
||||
lookbehind: true
|
||||
},
|
||||
'boolean': {
|
||||
pattern: /(^|[\s;|&])(?:true|false)(?=$|[\s;|&])/,
|
||||
lookbehind: true
|
||||
},
|
||||
'operator': /&&?|\|\|?|==?|!=?|<<<?|>>|<=?|>=?|=~/,
|
||||
'punctuation': /\$?\(\(?|\)\)?|\.\.|[{}[\];]/
|
||||
};
|
||||
|
||||
var inside = insideString.variable[1].inside;
|
||||
inside.string = Prism.languages.bash.string;
|
||||
inside['function'] = Prism.languages.bash['function'];
|
||||
inside.keyword = Prism.languages.bash.keyword;
|
||||
inside.boolean = Prism.languages.bash.boolean;
|
||||
inside.operator = Prism.languages.bash.operator;
|
||||
inside.punctuation = Prism.languages.bash.punctuation;
|
||||
|
||||
Prism.languages.shell = Prism.languages.bash;
|
||||
})(Prism);
|
||||
|
||||
Prism.languages.docker = {
|
||||
'keyword': {
|
||||
pattern: /(^\s*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)/mi,
|
||||
lookbehind: true
|
||||
},
|
||||
'string': /("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,
|
||||
'comment': /#.*/,
|
||||
'punctuation': /---|\.\.\.|[:[\]{}\-,|>?]/
|
||||
};
|
||||
|
||||
Prism.languages.dockerfile = Prism.languages.docker;
|
||||
|
||||
Prism.languages.go = Prism.languages.extend('clike', {
|
||||
'keyword': /\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,
|
||||
'builtin': /\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/,
|
||||
'boolean': /\b(?:_|iota|nil|true|false)\b/,
|
||||
'operator': /[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,
|
||||
'number': /(?:\b0x[a-f\d]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[-+]?\d+)?)i?/i,
|
||||
'string': {
|
||||
pattern: /(["'`])(\\[\s\S]|(?!\1)[^\\])*\1/,
|
||||
greedy: true
|
||||
}
|
||||
});
|
||||
delete Prism.languages.go['class-name'];
|
||||
|
||||
Prism.languages.java = Prism.languages.extend('clike', {
|
||||
'keyword': /\b(?:abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/,
|
||||
'number': /\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp-]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?[df]?/i,
|
||||
'operator': {
|
||||
pattern: /(^|[^.])(?:\+[+=]?|-[-=]?|!=?|<<?=?|>>?>?=?|==?|&[&=]?|\|[|=]?|\*=?|\/=?|%=?|\^=?|[?:~])/m,
|
||||
lookbehind: true
|
||||
}
|
||||
});
|
||||
|
||||
Prism.languages.insertBefore('java','function', {
|
||||
'annotation': {
|
||||
alias: 'punctuation',
|
||||
pattern: /(^|[^.])@\w+/,
|
||||
lookbehind: true
|
||||
}
|
||||
});
|
||||
|
||||
Prism.languages.insertBefore('java', 'class-name', {
|
||||
'generics': {
|
||||
pattern: /<\s*\w+(?:\.\w+)?(?:\s*,\s*\w+(?:\.\w+)?)*>/i,
|
||||
alias: 'function',
|
||||
inside: {
|
||||
keyword: Prism.languages.java.keyword,
|
||||
punctuation: /[<>(),.:]/
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Prism.languages.protobuf = Prism.languages.extend('clike', {
|
||||
keyword: /\b(?:package|import|message|enum)\b/,
|
||||
builtin: /\b(?:required|repeated|optional|reserved)\b/,
|
||||
primitive: {
|
||||
pattern: /\b(?:double|float|int32|int64|uint32|uint64|sint32|sint64|fixed32|fixed64|sfixed32|sfixed64|bool|string|bytes)\b/,
|
||||
alias: 'symbol'
|
||||
}
|
||||
});
|
||||
|
||||
Prism.languages.python = {
|
||||
'comment': {
|
||||
pattern: /(^|[^\\])#.*/,
|
||||
lookbehind: true
|
||||
},
|
||||
'triple-quoted-string': {
|
||||
pattern: /("""|''')[\s\S]+?\1/,
|
||||
greedy: true,
|
||||
alias: 'string'
|
||||
},
|
||||
'string': {
|
||||
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
|
||||
greedy: true
|
||||
},
|
||||
'function': {
|
||||
pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,
|
||||
lookbehind: true
|
||||
},
|
||||
'class-name': {
|
||||
pattern: /(\bclass\s+)\w+/i,
|
||||
lookbehind: true
|
||||
},
|
||||
'keyword': /\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|pass|print|raise|return|try|while|with|yield)\b/,
|
||||
'builtin':/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,
|
||||
'boolean': /\b(?:True|False|None)\b/,
|
||||
'number': /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,
|
||||
'operator': /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,
|
||||
'punctuation': /[{}[\];(),.:]/
|
||||
};
|
||||
|
||||
Prism.languages.yaml = {
|
||||
'scalar': {
|
||||
pattern: /([\-:]\s*(?:![^\s]+)?[ \t]*[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)[^\r\n]+(?:\2[^\r\n]+)*)/,
|
||||
lookbehind: true,
|
||||
alias: 'string'
|
||||
},
|
||||
'comment': /#.*/,
|
||||
'key': {
|
||||
pattern: /(\s*(?:^|[:\-,[{\r\n?])[ \t]*(?:![^\s]+)?[ \t]*)[^\r\n{[\]},#\s]+?(?=\s*:\s)/,
|
||||
lookbehind: true,
|
||||
alias: 'atrule'
|
||||
},
|
||||
'directive': {
|
||||
pattern: /(^[ \t]*)%.+/m,
|
||||
lookbehind: true,
|
||||
alias: 'important'
|
||||
},
|
||||
'datetime': {
|
||||
pattern: /([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?)?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?)(?=[ \t]*(?:$|,|]|}))/m,
|
||||
lookbehind: true,
|
||||
alias: 'number'
|
||||
},
|
||||
'boolean': {
|
||||
pattern: /([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:true|false)[ \t]*(?=$|,|]|})/im,
|
||||
lookbehind: true,
|
||||
alias: 'important'
|
||||
},
|
||||
'null': {
|
||||
pattern: /([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:null|~)[ \t]*(?=$|,|]|})/im,
|
||||
lookbehind: true,
|
||||
alias: 'important'
|
||||
},
|
||||
'string': {
|
||||
pattern: /([:\-,[{]\s*(?:![^\s]+)?[ \t]*)("|')(?:(?!\2)[^\\\r\n]|\\.)*\2(?=[ \t]*(?:$|,|]|}))/m,
|
||||
lookbehind: true,
|
||||
greedy: true
|
||||
},
|
||||
'number': {
|
||||
pattern: /([:\-,[{]\s*(?:![^\s]+)?[ \t]*)[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+\.?\d*|\.?\d+)(?:e[+-]?\d+)?|\.inf|\.nan)[ \t]*(?=$|,|]|})/im,
|
||||
lookbehind: true
|
||||
},
|
||||
'tag': /![^\s]+/,
|
||||
'important': /[&*][\w]+/,
|
||||
'punctuation': /---|[:[\]{}\-,|>?]|\.\.\./
|
||||
};
|
||||
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue