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
|
auto_ids: true
|
||||||
input: GFM
|
input: GFM
|
||||||
hard_wrap: false
|
hard_wrap: false
|
||||||
|
syntax_highlighter_opts:
|
||||||
|
disable : true
|
||||||
|
|
||||||
baseurl:
|
baseurl:
|
||||||
|
|
||||||
highlighter: rouge
|
highlighter: none
|
||||||
|
|
||||||
liquid:
|
liquid:
|
||||||
error_mode: strict
|
error_mode: strict
|
||||||
|
|
|
@ -115,7 +115,7 @@ Verify that the sidecar has been injected into the deployment.
|
||||||
```bash
|
```bash
|
||||||
kubectl get deployment sleep -o wide
|
kubectl get deployment sleep -o wide
|
||||||
```
|
```
|
||||||
```bash
|
```xxx
|
||||||
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
|
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
|
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
|
kubectl api-versions | grep admissionregistration
|
||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
```xxx
|
||||||
admissionregistration.k8s.io/v1beta1
|
admissionregistration.k8s.io/v1beta1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -100,5 +100,6 @@ layout: compress
|
||||||
|
|
||||||
<!-- our own scripts -->
|
<!-- our own scripts -->
|
||||||
<script src="{{home}}/js/misc.min.js"></script>
|
<script src="{{home}}/js/misc.min.js"></script>
|
||||||
|
<script src="{{home}}/js/prism.min.js" data-manual></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -137,17 +137,35 @@ thead+tbody tr:first-child td:last-child {
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
color: $textCodeColor;
|
||||||
|
font-size: 80%;
|
||||||
|
font-weight: $textCodeWeight;
|
||||||
|
word-break: normal;
|
||||||
|
}
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
margin: 1em;
|
margin: 1em;
|
||||||
max-height: 31em;
|
max-height: 31em;
|
||||||
border: 1px solid $codeBlockBorderColor;
|
border: 1px solid $preBlockBorderColor;
|
||||||
border-left: 5px solid $codeBlockBorderColor;
|
border-left: 5px solid $preBlockBorderColor;
|
||||||
border-radius: 4px;
|
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 {
|
code {
|
||||||
display: block;
|
display: block;
|
||||||
padding: .5em;
|
padding: .5em;
|
||||||
|
color: $textColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media print {
|
@media print {
|
||||||
|
@ -322,13 +340,6 @@ blockquote {
|
||||||
border-radius: 4px 4px 4px 4px;
|
border-radius: 4px 4px 4px 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
code {
|
|
||||||
color: $textCodeColor;
|
|
||||||
font-size: 80%;
|
|
||||||
font-weight: $textCodeWeight;
|
|
||||||
word-break: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.spacer {
|
.spacer {
|
||||||
height: .1rem;
|
height: .1rem;
|
||||||
|
|
||||||
|
|
|
@ -27,8 +27,9 @@ $dividerBarColor: rgba(255, 255, 255, .1);
|
||||||
$glossaryHeaderColor: lighten($gray, 35%);
|
$glossaryHeaderColor: lighten($gray, 35%);
|
||||||
$blockQuoteBackgroundColor: $dark-gray;
|
$blockQuoteBackgroundColor: $dark-gray;
|
||||||
$deprecatedBackgroundColor: silver;
|
$deprecatedBackgroundColor: silver;
|
||||||
$codeBlockShadowColor: #777777;
|
$preBlockShadowColor: #777777;
|
||||||
$codeBlockBorderColor: #777777;
|
$preBlockBorderColor: #777777;
|
||||||
|
$preBlockBackgroundColor: #2d2d2d;
|
||||||
$boxBorderColor: $textColor;
|
$boxBorderColor: $textColor;
|
||||||
|
|
||||||
$headerLightShadowColor: rgba(0, 0, 0, .14);
|
$headerLightShadowColor: rgba(0, 0, 0, .14);
|
||||||
|
|
|
@ -1,60 +1,82 @@
|
||||||
.highlight { background: $backgroundColor; color: $textColor; }
|
/* PrismJS 1.14.0
|
||||||
.highlight .c { color: #999988; font-style: italic } /* Comment */
|
http://prismjs.com/download.html#themes=prism-tomorrow&languages=clike+javascript+bash+docker+go+java+protobuf+python+yaml */
|
||||||
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
|
/**
|
||||||
.highlight .k { font-weight: bold } /* Keyword */
|
* prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML
|
||||||
.highlight .o { font-weight: bold } /* Operator */
|
* Based on https://github.com/chriskempson/tomorrow-theme
|
||||||
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
|
* @author Rose Pritchard
|
||||||
.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 */
|
.token.comment,
|
||||||
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
|
.token.block-comment,
|
||||||
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
|
.token.prolog,
|
||||||
.highlight .ge { font-style: italic } /* Generic.Emph */
|
.token.doctype,
|
||||||
.highlight .gr { color: #aa0000 } /* Generic.Error */
|
.token.cdata {
|
||||||
.highlight .gh { color: #999999 } /* Generic.Heading */
|
color: #999;
|
||||||
.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 */
|
.token.punctuation {
|
||||||
.highlight .gp { color: #555555 } /* Generic.Prompt */
|
color: #ccc;
|
||||||
.highlight .gs { font-weight: bold } /* Generic.Strong */
|
}
|
||||||
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
|
|
||||||
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
|
.token.tag,
|
||||||
.highlight .kc { font-weight: bold } /* Keyword.Constant */
|
.token.attr-name,
|
||||||
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
|
.token.namespace,
|
||||||
.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
|
.token.deleted {
|
||||||
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
|
color: #e2777a;
|
||||||
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
|
}
|
||||||
.highlight .m { color: #009999 } /* Literal.Number */
|
|
||||||
.highlight .s { color: #ff4455 } /* Literal.String */
|
.token.function-name {
|
||||||
.highlight .na { color: #00e0e0 } /* Name.Attribute */
|
color: #6196cc;
|
||||||
.highlight .nb { color: #0086B3 } /* Name.Builtin */
|
}
|
||||||
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
|
|
||||||
.highlight .no { color: #00e0e0 } /* Name.Constant */
|
.token.boolean,
|
||||||
.highlight .ni { color: #e000e0 } /* Name.Entity */
|
.token.number,
|
||||||
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
|
.token.function {
|
||||||
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
|
color: #f08d49;
|
||||||
.highlight .nn { color: #555555 } /* Name.Namespace */
|
}
|
||||||
.highlight .nt { color: #8080e0 } /* Name.Tag */
|
|
||||||
.highlight .nv { color: #00e0e0 } /* Name.Variable */
|
.token.property,
|
||||||
.highlight .ow { font-weight: bold } /* Operator.Word */
|
.token.class-name,
|
||||||
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
|
.token.constant,
|
||||||
.highlight .mf { color: #009999 } /* Literal.Number.Float */
|
.token.symbol {
|
||||||
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
|
color: #f8c555;
|
||||||
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
|
}
|
||||||
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
|
|
||||||
.highlight .sb { color: #ff4455 } /* Literal.String.Backtick */
|
.token.selector,
|
||||||
.highlight .sc { color: #ff4455 } /* Literal.String.Char */
|
.token.important,
|
||||||
.highlight .sd { color: #ff4455 } /* Literal.String.Doc */
|
.token.atrule,
|
||||||
.highlight .s2 { color: #ff4455 } /* Literal.String.Double */
|
.token.keyword,
|
||||||
.highlight .se { color: #ff4455 } /* Literal.String.Escape */
|
.token.builtin {
|
||||||
.highlight .sh { color: #ff4455 } /* Literal.String.Heredoc */
|
color: #cc99cd;
|
||||||
.highlight .si { color: #ff4455 } /* Literal.String.Interpol */
|
}
|
||||||
.highlight .sx { color: #ff4455 } /* Literal.String.Other */
|
|
||||||
.highlight .sr { color: #009926 } /* Literal.String.Regex */
|
.token.string,
|
||||||
.highlight .s1 { color: #ff4455 } /* Literal.String.Single */
|
.token.char,
|
||||||
.highlight .ss { color: #990073 } /* Literal.String.Symbol */
|
.token.attr-value,
|
||||||
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
|
.token.regex,
|
||||||
.highlight .vc { color: #00e0e0 } /* Name.Variable.Class */
|
.token.variable {
|
||||||
.highlight .vg { color: #00e0e0 } /* Name.Variable.Global */
|
color: #7ec699;
|
||||||
.highlight .vi { color: #00e0e0 } /* Name.Variable.Instance */
|
}
|
||||||
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
|
|
||||||
|
.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%);
|
$glossaryHeaderColor: lighten($gray, 35%);
|
||||||
$blockQuoteBackgroundColor: $light-gray;
|
$blockQuoteBackgroundColor: $light-gray;
|
||||||
$deprecatedBackgroundColor: silver;
|
$deprecatedBackgroundColor: silver;
|
||||||
$codeBlockShadowColor: #a7a7a7;
|
$preBlockShadowColor: #a7a7a7;
|
||||||
$codeBlockBorderColor: #dddddd;
|
$preBlockBorderColor: #dddddd;
|
||||||
|
$preBlockBackgroundColor: $backgroundColor;
|
||||||
$boxBorderColor: $secondBrandColor;
|
$boxBorderColor: $secondBrandColor;
|
||||||
|
|
||||||
$headerLightShadowColor: rgba(0, 0, 0, .14);
|
$headerLightShadowColor: rgba(0, 0, 0, .14);
|
||||||
|
|
|
@ -1,60 +1,80 @@
|
||||||
.highlight { background: #ffffff; }
|
/* PrismJS 1.14.0
|
||||||
.highlight .c { color: #999988; font-style: italic } /* Comment */
|
http://prismjs.com/download.html#themes=prism&languages=clike+javascript+bash+docker+go+java+protobuf+python+yaml */
|
||||||
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
|
/**
|
||||||
.highlight .k { font-weight: bold } /* Keyword */
|
* prism.js default theme for JavaScript, CSS and HTML
|
||||||
.highlight .o { font-weight: bold } /* Operator */
|
* Based on dabblet (http://dabblet.com)
|
||||||
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
|
* @author Lea Verou
|
||||||
.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 */
|
.token.comment,
|
||||||
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
|
.token.prolog,
|
||||||
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
|
.token.doctype,
|
||||||
.highlight .ge { font-style: italic } /* Generic.Emph */
|
.token.cdata {
|
||||||
.highlight .gr { color: #aa0000 } /* Generic.Error */
|
color: slategray;
|
||||||
.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 */
|
.token.punctuation {
|
||||||
.highlight .go { color: #888888 } /* Generic.Output */
|
color: #999;
|
||||||
.highlight .gp { color: #555555 } /* Generic.Prompt */
|
}
|
||||||
.highlight .gs { font-weight: bold } /* Generic.Strong */
|
|
||||||
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
|
.namespace {
|
||||||
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
|
opacity: .7;
|
||||||
.highlight .kc { font-weight: bold } /* Keyword.Constant */
|
}
|
||||||
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
|
|
||||||
.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
|
.token.property,
|
||||||
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
|
.token.tag,
|
||||||
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
|
.token.boolean,
|
||||||
.highlight .m { color: #009999 } /* Literal.Number */
|
.token.number,
|
||||||
.highlight .s { color: #d14 } /* Literal.String */
|
.token.constant,
|
||||||
.highlight .na { color: #008080 } /* Name.Attribute */
|
.token.symbol,
|
||||||
.highlight .nb { color: #0086B3 } /* Name.Builtin */
|
.token.deleted {
|
||||||
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
|
color: #905;
|
||||||
.highlight .no { color: #008080 } /* Name.Constant */
|
}
|
||||||
.highlight .ni { color: #800080 } /* Name.Entity */
|
|
||||||
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
|
.token.selector,
|
||||||
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
|
.token.attr-name,
|
||||||
.highlight .nn { color: #555555 } /* Name.Namespace */
|
.token.string,
|
||||||
.highlight .nt { color: #000080 } /* Name.Tag */
|
.token.char,
|
||||||
.highlight .nv { color: #008080 } /* Name.Variable */
|
.token.builtin,
|
||||||
.highlight .ow { font-weight: bold } /* Operator.Word */
|
.token.inserted {
|
||||||
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
|
color: #690;
|
||||||
.highlight .mf { color: #009999 } /* Literal.Number.Float */
|
}
|
||||||
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
|
|
||||||
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
|
.token.operator,
|
||||||
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
|
.token.entity,
|
||||||
.highlight .sb { color: #d14 } /* Literal.String.Backtick */
|
.token.url,
|
||||||
.highlight .sc { color: #d14 } /* Literal.String.Char */
|
.language-css .token.string,
|
||||||
.highlight .sd { color: #d14 } /* Literal.String.Doc */
|
.style .token.string {
|
||||||
.highlight .s2 { color: #d14 } /* Literal.String.Double */
|
color: #9a6e3a;
|
||||||
.highlight .se { color: #d14 } /* Literal.String.Escape */
|
background: hsla(0, 0%, 100%, .5);
|
||||||
.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
|
}
|
||||||
.highlight .si { color: #d14 } /* Literal.String.Interpol */
|
|
||||||
.highlight .sx { color: #d14 } /* Literal.String.Other */
|
.token.atrule,
|
||||||
.highlight .sr { color: #009926 } /* Literal.String.Regex */
|
.token.attr-value,
|
||||||
.highlight .s1 { color: #d14 } /* Literal.String.Single */
|
.token.keyword {
|
||||||
.highlight .ss { color: #990073 } /* Literal.String.Symbol */
|
color: #07a;
|
||||||
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
|
}
|
||||||
.highlight .vc { color: #008080 } /* Name.Variable.Class */
|
|
||||||
.highlight .vg { color: #008080 } /* Name.Variable.Global */
|
.token.function,
|
||||||
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
|
.token.class-name {
|
||||||
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
|
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));
|
}(jQuery));
|
||||||
|
|
||||||
// Apply a bunch of systematic modification to the DOM of all pages.
|
// Scroll the document to the top
|
||||||
// Ideally, this stuff could be handled offline as part of preparing the
|
function scrollToTop() {
|
||||||
// HTML, but alas our current toolchain won't allow that in a clean/simple
|
document.body.scrollTop = 0; // For Safari
|
||||||
// way.
|
document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialized after the DOM has been loaded
|
// initialized after the DOM has been loaded by getDOMTopology
|
||||||
var scrollToTopButton;
|
var scrollToTopButton;
|
||||||
var tocLinks;
|
var tocLinks;
|
||||||
var tocHeadings;
|
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
|
// post-processing we do once the DOM has loaded
|
||||||
function getDOMTopology() {
|
function handleDOMLoaded() {
|
||||||
scrollToTopButton = document.getElementById("scroll-to-top");
|
|
||||||
|
|
||||||
var toc = document.getElementById("toc");
|
// Apply a bunch of systematic modification to the DOM of all pages.
|
||||||
if (toc != undefined) {
|
// Ideally, this stuff could be handled offline as part of preparing the
|
||||||
tocLinks = toc.getElementsByTagName("A");
|
// HTML, but alas our current toolchain won't allow that in a clean/simple
|
||||||
tocHeadings = new Array(tocLinks.length);
|
// 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++) {
|
var parent = pre[i].parentElement;
|
||||||
tocHeadings[i] = document.getElementById(tocLinks[i].hash.substring(1));
|
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
|
// 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
|
// Based on the scroll position, make the "scroll to top" button visible or not
|
||||||
function controlScrollToTopButton() {
|
function controlScrollToTopButton() {
|
||||||
if (scrollToTopButton) {
|
if (scrollToTopButton) {
|
||||||
|
@ -346,12 +371,5 @@ function handleScroll() {
|
||||||
controlTOCActivation();
|
controlTOCActivation();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scroll the document to the top
|
document.addEventListener("DOMContentLoaded", handleDOMLoaded);
|
||||||
function scrollToTop() {
|
window.addEventListener("scroll", handlePageScroll);
|
||||||
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);
|
|
||||||
|
|
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