2024-07-14 16:18:52 -04:00
/******/ ( function ( ) { // webpackBootstrap
/******/ var _ _webpack _modules _ _ = ( [
/* 0 */ ,
/* 1 */
/***/ ( function ( module ) {
2024-09-16 16:29:32 -04:00
function _typeof ( o ) { "@babel/helpers - typeof" ; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol . iterator ? function ( o ) { return typeof o ; } : function ( o ) { return o && "function" == typeof Symbol && o . constructor === Symbol && o !== Symbol . prototype ? "symbol" : typeof o ; } , _typeof ( o ) ; }
var getDate = function getDate ( ) {
var d = new Date ( ) ;
return d . toLocaleDateString ( lang , {
day : "numeric" ,
month : "long" ,
year : "numeric"
} ) ;
} ;
String . prototype . toTitleCase = function ( ) {
return this . replace ( /\w\S*/g , function ( txt ) {
return txt . charAt ( 0 ) . toUpperCase ( ) + txt . substr ( 1 ) . toLowerCase ( ) ;
} ) ;
} ;
String . prototype . toSentenceCase = function ( ) {
return this . charAt ( 0 ) . toUpperCase ( ) + this . substr ( 1 ) . toLowerCase ( ) ;
} ;
String . prototype . toContent = function ( ) {
return this . replace ( /-/g , " " ) ;
} ;
String . prototype . toPath = function ( ) {
return this . trim ( ) . replace ( / /g , "_" ) . replace ( /-/g , "_" ) . replace ( /[\/\W]/g , "" ) . replace ( /_/g , "-" ) ;
} ;
var font = {
size : 0
} ;
2025-01-30 22:57:18 -05:00
var copyFallback = function copyFallback ( copyInfo , attr ) {
2024-09-16 16:29:32 -04:00
console . log ( "fallback" ) ;
var textArea = document . createElement ( 'textarea' ) ;
textArea . value = copyInfo ;
// Avoid scrolling to bottom
textArea . style . top = '0' ;
textArea . style . left = '0' ;
textArea . style . position = 'fixed' ;
document . body . appendChild ( textArea ) ;
textArea . focus ( ) ;
textArea . select ( ) ;
try {
var successful = document . execCommand ( 'copy' ) ;
setTimeout ( function ( ) {
if ( successful ) {
//copyInfo.success();
showMessage ( "Copied " . concat ( attr , "." ) ) ;
} else {
//copyInfo.error();
showMessage ( "Copy failed (" . concat ( attr , ")." ) , false ) ;
}
} , 1 ) ;
} catch ( err ) {
setTimeout ( function ( ) {
showMessage ( "Copy failed (" . concat ( attr , "). " ) . concat ( err . Message ) , false ) ;
//copyInfo.error(err);
} , 1 ) ;
}
document . body . removeChild ( textArea ) ;
} ;
var showMessage = function showMessage ( m , s ) {
s = s == undefined ? true : s ;
console . log ( "Copy success (navigator.clipboard)" ) ;
var status = document . createElement ( "div" ) ;
status . setAttribute ( "id" , "copystatus" ) ;
// status.style.display = "none";
status . innerHTML = "<div class='" + ( s ? "succeeded" : "failed" ) + "'>" + m + "</div>" ;
document . querySelector ( "body" ) . prepend ( status ) ;
status . querySelector ( "div" ) . style . top = window . scrollY + 100 + "px" ;
setTimeout ( function ( ) {
status . remove ( ) ;
} , 1000 ) ;
} ;
var getURLVars = function getURLVars ( ) {
var oResult = { } ;
if ( location . search . length > 0 ) {
var aQueryString = location . search . substr ( 1 ) . split ( "&" ) ;
for ( var i = 0 ; i < aQueryString . length ; i ++ ) {
var aTemp = aQueryString [ i ] . split ( "=" ) ;
if ( aTemp [ 1 ] . length > 0 ) {
oResult [ aTemp [ 0 ] ] = decodeURIComponent ( aTemp [ 1 ] . replace ( /\+/g , '%20' ) ) ;
}
}
}
return oResult ;
} ;
2024-07-14 16:18:52 -04:00
module . exports = {
2024-09-16 16:29:32 -04:00
url : function ( ) {
var v = { } ;
if ( location . search . length > 0 ) {
var qs = location . search . substr ( 1 ) . split ( "&" ) ;
for ( var i = 0 ; i < qs . length ; i ++ ) {
var t = qs [ i ] . split ( "=" ) ;
if ( t [ 1 ] . length > 0 ) {
v [ t [ 0 ] ] = decodeURIComponent ( t [ 1 ] . replace ( /\+/g , '%20' ) ) ;
}
}
}
return v ;
} ( ) ,
cookie : {
set : function set ( name , value , expires , path , domain , secure ) {
switch ( _typeof ( expires ) ) {
case "number" :
var d = new Date ( ) ;
expires = d . setTime ( d + expires * 24 * 60 * 60 * 1000 ) ;
break ;
case "object" :
expires = expires . toGMTString ( ) ;
}
document . cookie = name + "=" + escape ( value ) + ( expires ? "; expires=" + expires : "" ) + "; path=/" + ( domain ? "; domain=" + domain : "" ) + ( secure ? "; secure" : "" ) ;
} ,
get : function get ( cname ) {
var name = cname + "=" ;
var ca = document . cookie . split ( ";" ) ;
for ( var i = 0 ; i < ca . length ; i ++ ) {
var c = ca [ i ] ;
while ( c . charAt ( 0 ) === " " ) {
c = c . substring ( 1 ) ;
}
if ( c . indexOf ( name ) === 0 ) {
return c . substring ( name . length , c . length ) ;
}
}
return "" ;
} ,
2024-10-02 10:07:51 -04:00
remove : function remove ( cname ) {
2024-10-18 18:39:38 -04:00
module . exports . cookie . set ( cname , null , new Date ( null ) ) ;
2024-09-16 16:29:32 -04:00
}
} ,
2024-10-18 18:25:40 -04:00
oneClickSelect : function oneClickSelect ( e ) {
var t = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : e . currentTarget ;
// In here, "this" is the element
var range , selection ;
if ( window . getSelection ) {
selection = window . getSelection ( ) ;
range = document . createRange ( ) ;
range . selectNodeContents ( t ) ;
selection . removeAllRanges ( ) ;
selection . addRange ( range ) ;
} else if ( document . body . createTextRange ) {
range = document . body . createTextRange ( ) ;
range . moveToElementText ( t ) ;
range . select ( ) ;
}
} ,
2024-09-16 16:29:32 -04:00
colour : {
copy : function copy ( w , t ) {
var c = t . parentNode . getAttribute ( "data-" + ( w == "var" ? "token" : w ) ) ;
c = w == "var" ? "var(" . concat ( c , ")" ) : c ;
if ( navigator . clipboard ) {
navigator . clipboard . writeText ( c ) . then ( function ( ) {
showMessage ( "Copied " . concat ( w , "." ) ) ;
} , function ( e ) {
2025-01-30 22:57:18 -05:00
copyFallback ( c , w ) ;
2024-09-16 16:29:32 -04:00
} ) ;
} else {
2025-01-30 22:57:18 -05:00
copyFallback ( c , w ) ;
2024-09-16 16:29:32 -04:00
}
} ,
positionTooltip : function positionTooltip ( ) {
document . querySelectorAll ( "color-pill > span" ) . forEach ( function ( ps ) {
ps . querySelectorAll ( "div.tooltip-tc" ) . forEach ( function ( tip ) {
if ( font . size * 10 > ps . offsetLeft ) {
tip . setAttribute ( "tip-position" , "right" ) ;
} else {
tip . setAttribute ( "tip-position" , "bottom" ) ;
}
} ) ;
} ) ;
}
} ,
2024-10-02 10:07:51 -04:00
getCSS : function getCSS ( el , prop ) {
var b = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : false ;
return window . getComputedStyle ( el , null ) . getPropertyValue ( prop ) ;
} ,
2025-01-30 22:57:18 -05:00
getTabPath : function getTabPath ( t ) {
var url = window . location . toString ( ) ;
url = url . indexOf ( "?" ) > 0 ? url . substring ( 0 , url . indexOf ( "?" ) ) : url ;
url = "" . concat ( url , "?p=" ) . concat ( t . closest ( "article" ) . getAttribute ( "data-path" ) , "#" ) . concat ( t . getAttribute ( "id" ) ) ;
var type = "URL" ;
if ( navigator . clipboard ) {
navigator . clipboard . writeText ( url ) . then ( function ( ) {
showMessage ( "Copied " . concat ( type , "." ) ) ;
} , function ( e ) {
copyFallback ( url , type ) ;
} ) ;
} else {
copyFallback ( url , type ) ;
}
} ,
2024-09-16 16:29:32 -04:00
init : function init ( ) {
var args = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : { } ;
var url = getURLVars ( ) ;
font . size = parseFloat ( getComputedStyle ( document . documentElement ) . fontSize . replace ( "px" , "" ) ) ;
if ( url . p !== undefined ) {
document . querySelectorAll ( "main article:not([data-path^='" + url . p + "'])" ) . forEach ( function ( a ) {
a . remove ( ) ;
} ) ;
if ( url . p == - 1 ) {
document . querySelector ( "title" ) . innerHTML = "" . concat ( url . p . toContent ( ) . toTitleCase ( ) , " | " ) . concat ( document . querySelector ( "title" ) . getAttribute ( "data-site" ) ) ;
} else {
var theTitle = document . querySelectorAll ( "article" ) ;
if ( theTitle . length > 0 ) {
theTitle = theTitle [ 0 ] . getAttribute ( "data-name" ) . toContent ( ) . toTitleCase ( ) ;
if ( document . querySelector ( "article" ) . getAttribute ( "data-display" ) !== null ) {
theTitle = document . querySelector ( "article" ) . getAttribute ( "data-display" ) ;
}
document . querySelector ( "title" ) . innerHTML = "" . concat ( theTitle , " | " ) . concat ( document . querySelector ( "title" ) . getAttribute ( "data-site" ) ) ;
}
}
}
if ( typeof args . beforeArticleLoad == "function" ) args . beforeArticleLoad ( ) ;
document . querySelectorAll ( "article" ) . forEach ( function ( a ) {
if ( a . getAttribute ( "data-template" ) != "none" ) {
var observer = new IntersectionObserver ( function ( articles ) {
articles . forEach ( function ( article ) {
var a = article . target ;
if ( article . isIntersecting == true ) {
var path = a . getAttribute ( "data-path" ) ;
path = "patterns/" + ( a . getAttribute ( "data-core" ) == "true" ? "core/" + path . substring ( path . lastIndexOf ( "/" ) + 1 ) : a . getAttribute ( "data-path" ) ) + "/index.html" ;
var ASYNC = true ;
var ajx = new XMLHttpRequest ( ) ;
ajx . onreadystatechange = function ( ) {
if ( ajx . readyState == 4 ) {
observer . unobserve ( article . target ) ;
switch ( ajx . status ) {
case 200 :
a . innerHTML = a . innerHTML + ajx . responseText ;
a . style . height = "auto" ;
switch ( a . getAttribute ( "data-template" ) ) {
case "pug" :
a . querySelectorAll ( "pre" ) . forEach ( function ( aa ) {
aa . innerHTML = "<code class=\"" . concat ( aa . getAttribute ( "class" ) , "\">" ) . concat ( aa . innerHTML , "</code>" ) ;
} ) ;
break ;
case "md" :
a . querySelectorAll ( "code" ) . forEach ( function ( aa ) {
aa . classList . add ( "language-html" ) ;
} ) ;
break ;
}
a . querySelectorAll ( "code" ) . forEach ( function ( c ) {
c . classList . add ( "line-numbers" ) ;
c . innerHTML = c . innerHTML . replace ( /</g , "<" ) ;
c . classList . add ( "copy-to-clipboard-button" ) ;
} ) ;
if ( typeof args . success == "function" ) args . success ( a ) ;
Prism . highlightAll ( ) ;
a . querySelectorAll ( "code" ) . forEach ( function ( c ) {
c . onclick = function ( e ) {
2024-10-18 18:25:40 -04:00
module . exports . oneClickSelect ( e ) ;
2024-09-16 16:29:32 -04:00
} ;
} ) ;
module . exports . colour . positionTooltip ( ) ;
window . onresize = function ( ) {
module . exports . colour . positionTooltip ( ) ;
} ;
a . querySelectorAll ( "name > span, color-pill > span" ) . forEach ( function ( pill ) {
pill . onclick = function ( e ) {
e . preventDefault ( ) ;
var w = "" ;
if ( e . metaKey || e . ctrlKey || e . keyCode == 91 || e . keyCode == 224 ) {
w = "var" ;
} else if ( e . altKey ) {
w = "token" ;
} else if ( e . shiftKey ) {
w = "rgb" ;
} else {
w = "hex" ;
}
module . exports . colour . copy ( w , pill ) ;
} ;
} ) ;
break ;
case 404 :
if ( typeof args . notFound == "function" ) args . notFound ( a , path ) ;
break ;
default :
console . log ( "uncaught http error" , {
status : ajx . status ,
path : a . getAttribute ( "data-path" )
} ) ;
}
a . style . height = "auto" ;
if ( typeof args . done == "function" ) args . done ( a ) ;
}
} ;
ajx . open ( "GET" , path , ASYNC ) ;
ajx . send ( ) ;
}
} ) ;
} , {
threshold : 0 ,
rootMargin : "100%"
} ) ;
observer . observe ( a ) ;
} else {
a . style . height = "auto" ;
}
} ) ;
if ( typeof args . afterArticleLoad == "function" ) args . afterArticleLoad ( ) ;
}
2024-07-14 16:18:52 -04:00
} ;
/***/ } ) ,
/* 2 */
/***/ ( function ( module , _ _unused _webpack _exports , _ _webpack _require _ _ ) {
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Begin prism - core . js
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/// <reference lib="WebWorker"/>
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
*
* @ license MIT < https : //opensource.org/licenses/MIT>
* @ author Lea Verou < https : //lea.verou.me>
* @ namespace
* @ public
* /
var Prism = ( function ( _self ) {
// Private helper vars
var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i ;
var uniqueId = 0 ;
// The grammar object for plaintext
var plainTextGrammar = { } ;
var _ = {
/ * *
* By default , Prism will attempt to highlight all code elements ( by calling { @ link Prism . highlightAll } ) on the
* current page after the page finished loading . This might be a problem if e . g . you wanted to asynchronously load
* additional languages or plugins yourself .
*
* By setting this value to ` true ` , Prism will not automatically highlight all code elements on the page .
*
* You obviously have to change this value before the automatic highlighting started . To do this , you can add an
* empty Prism object into the global scope before loading the Prism script like this :
*
* ` ` ` js
* window . Prism = window . Prism || { } ;
* Prism . manual = true ;
* // add a new <script> to load Prism's script
* ` ` `
*
* @ default false
* @ type { boolean }
* @ memberof Prism
* @ public
* /
manual : _self . Prism && _self . Prism . manual ,
/ * *
* By default , if Prism is in a web worker , it assumes that it is in a worker it created itself , so it uses
* ` addEventListener ` to communicate with its parent instance . However , if you ' re using Prism manually in your
* own worker , you don ' t want it to do this .
*
* By setting this value to ` true ` , Prism will not add its own listeners to the worker .
*
* You obviously have to change this value before Prism executes . To do this , you can add an
* empty Prism object into the global scope before loading the Prism script like this :
*
* ` ` ` js
* window . Prism = window . Prism || { } ;
* Prism . disableWorkerMessageHandler = true ;
* // Load Prism's script
* ` ` `
*
* @ default false
* @ type { boolean }
* @ memberof Prism
* @ public
* /
disableWorkerMessageHandler : _self . Prism && _self . Prism . disableWorkerMessageHandler ,
/ * *
* A namespace for utility methods .
*
* All function in this namespace that are not explicitly marked as _public _ are for _ _internal use only _ _ and may
* change or disappear at any time .
*
* @ namespace
* @ memberof Prism
* /
util : {
encode : function encode ( tokens ) {
if ( tokens instanceof Token ) {
return new Token ( tokens . type , encode ( tokens . content ) , tokens . alias ) ;
} else if ( Array . isArray ( tokens ) ) {
return tokens . map ( encode ) ;
} else {
return tokens . replace ( /&/g , '&' ) . replace ( /</g , '<' ) . replace ( /\u00a0/g , ' ' ) ;
}
} ,
/ * *
* Returns the name of the type of the given value .
*
* @ param { any } o
* @ returns { string }
* @ example
* type ( null ) === 'Null'
* type ( undefined ) === 'Undefined'
* type ( 123 ) === 'Number'
* type ( 'foo' ) === 'String'
* type ( true ) === 'Boolean'
* type ( [ 1 , 2 ] ) === 'Array'
* type ( { } ) === 'Object'
* type ( String ) === 'Function'
* type ( /abc+/ ) === 'RegExp'
* /
type : function ( o ) {
return Object . prototype . toString . call ( o ) . slice ( 8 , - 1 ) ;
} ,
/ * *
* Returns a unique number for the given object . Later calls will still return the same number .
*
* @ param { Object } obj
* @ returns { number }
* /
objId : function ( obj ) {
if ( ! obj [ '__id' ] ) {
Object . defineProperty ( obj , '__id' , { value : ++ uniqueId } ) ;
}
return obj [ '__id' ] ;
} ,
/ * *
* Creates a deep clone of the given object .
*
* The main intended use of this function is to clone language definitions .
*
* @ param { T } o
* @ param { Record < number , any > } [ visited ]
* @ returns { T }
* @ template T
* /
clone : function deepClone ( o , visited ) {
visited = visited || { } ;
var clone ; var id ;
switch ( _ . util . type ( o ) ) {
case 'Object' :
id = _ . util . objId ( o ) ;
if ( visited [ id ] ) {
return visited [ id ] ;
}
clone = /** @type {Record<string, any>} */ ( { } ) ;
visited [ id ] = clone ;
for ( var key in o ) {
if ( o . hasOwnProperty ( key ) ) {
clone [ key ] = deepClone ( o [ key ] , visited ) ;
}
}
return /** @type {any} */ ( clone ) ;
case 'Array' :
id = _ . util . objId ( o ) ;
if ( visited [ id ] ) {
return visited [ id ] ;
}
clone = [ ] ;
visited [ id ] = clone ;
( /** @type {Array} */ ( /** @type {any} */ ( o ) ) ) . forEach ( function ( v , i ) {
clone [ i ] = deepClone ( v , visited ) ;
} ) ;
return /** @type {any} */ ( clone ) ;
default :
return o ;
}
} ,
/ * *
* Returns the Prism language of the given element set by a ` language-xxxx ` or ` lang-xxxx ` class .
*
* If no language is set for the element or the element is ` null ` or ` undefined ` , ` none ` will be returned .
*
* @ param { Element } element
* @ returns { string }
* /
getLanguage : function ( element ) {
while ( element ) {
var m = lang . exec ( element . className ) ;
if ( m ) {
return m [ 1 ] . toLowerCase ( ) ;
}
element = element . parentElement ;
}
return 'none' ;
} ,
/ * *
* Sets the Prism ` language-xxxx ` class of the given element .
*
* @ param { Element } element
* @ param { string } language
* @ returns { void }
* /
setLanguage : function ( element , language ) {
// remove all `language-xxxx` classes
// (this might leave behind a leading space)
element . className = element . className . replace ( RegExp ( lang , 'gi' ) , '' ) ;
// add the new `language-xxxx` class
// (using `classList` will automatically clean up spaces for us)
element . classList . add ( 'language-' + language ) ;
} ,
/ * *
* Returns the script element that is currently executing .
*
* This does _ _not _ _ work for line script element .
*
* @ returns { HTMLScriptElement | null }
* /
currentScript : function ( ) {
if ( typeof document === 'undefined' ) {
return null ;
}
if ( 'currentScript' in document && 1 < 2 /* hack to trip TS' flow analysis */ ) {
return /** @type {any} */ ( document . currentScript ) ;
}
// IE11 workaround
// we'll get the src of the current script by parsing IE11's error stack trace
// this will not work for inline scripts
try {
throw new Error ( ) ;
} catch ( err ) {
// Get file src url from stack. Specifically works with the format of stack traces in IE.
// A stack will look like this:
//
// Error
// at _.util.currentScript (http://localhost/components/prism-core.js:119:5)
// at Global code (http://localhost/components/prism-core.js:606:1)
var src = ( /at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i . exec ( err . stack ) || [ ] ) [ 1 ] ;
if ( src ) {
var scripts = document . getElementsByTagName ( 'script' ) ;
for ( var i in scripts ) {
if ( scripts [ i ] . src == src ) {
return scripts [ i ] ;
}
}
}
return null ;
}
} ,
/ * *
* Returns whether a given class is active for ` element ` .
*
* The class can be activated if ` element ` or one of its ancestors has the given class and it can be deactivated
* if ` element ` or one of its ancestors has the negated version of the given class . The _negated version _ of the
* given class is just the given class with a ` no- ` prefix .
*
* Whether the class is active is determined by the closest ancestor of ` element ` ( where ` element ` itself is
* closest ancestor ) that has the given class or the negated version of it . If neither ` element ` nor any of its
* ancestors have the given class or the negated version of it , then the default activation will be returned .
*
* In the paradoxical situation where the closest ancestor contains _ _both _ _ the given class and the negated
* version of it , the class is considered active .
*
* @ param { Element } element
* @ param { string } className
* @ param { boolean } [ defaultActivation = false ]
* @ returns { boolean }
* /
isActive : function ( element , className , defaultActivation ) {
var no = 'no-' + className ;
while ( element ) {
var classList = element . classList ;
if ( classList . contains ( className ) ) {
return true ;
}
if ( classList . contains ( no ) ) {
return false ;
}
element = element . parentElement ;
}
return ! ! defaultActivation ;
}
} ,
/ * *
* This namespace contains all currently loaded languages and the some helper functions to create and modify languages .
*
* @ namespace
* @ memberof Prism
* @ public
* /
languages : {
/ * *
* The grammar for plain , unformatted text .
* /
plain : plainTextGrammar ,
plaintext : plainTextGrammar ,
text : plainTextGrammar ,
txt : plainTextGrammar ,
/ * *
* Creates a deep copy of the language with the given id and appends the given tokens .
*
* If a token in ` redef ` also appears in the copied language , then the existing token in the copied language
* will be overwritten at its original position .
*
* # # Best practices
*
* Since the position of overwriting tokens ( token in ` redef ` that overwrite tokens in the copied language )
* doesn ' t matter , they can technically be in any order . However , this can be confusing to others that trying to
* understand the language definition because , normally , the order of tokens matters in Prism grammars .
*
* Therefore , it is encouraged to order overwriting tokens according to the positions of the overwritten tokens .
* Furthermore , all non - overwriting tokens should be placed after the overwriting ones .
*
* @ param { string } id The id of the language to extend . This has to be a key in ` Prism.languages ` .
* @ param { Grammar } redef The new tokens to append .
* @ returns { Grammar } The new language created .
* @ public
* @ example
* Prism . languages [ 'css-with-colors' ] = Prism . languages . extend ( 'css' , {
* // Prism.languages.css already has a 'comment' token, so this token will overwrite CSS' 'comment' token
* // at its original position
* 'comment' : { ... } ,
* // CSS doesn't have a 'color' token, so this token will be appended
* 'color' : /\b(?:red|green|blue)\b/
* } ) ;
* /
extend : function ( id , redef ) {
var lang = _ . util . clone ( _ . languages [ id ] ) ;
for ( var key in redef ) {
lang [ key ] = redef [ key ] ;
}
return lang ;
} ,
/ * *
* Inserts tokens _before _ another token in a language definition or any other grammar .
*
* # # Usage
*
* This helper method makes it easy to modify existing languages . For example , the CSS language definition
* not only defines CSS highlighting for CSS documents , but also needs to define highlighting for CSS embedded
* in HTML through ` <style> ` elements . To do this , it needs to modify ` Prism.languages.markup ` and add the
* appropriate tokens . However , ` Prism.languages.markup ` is a regular JavaScript object literal , so if you do
* this :
*
* ` ` ` js
* Prism . languages . markup . style = {
* // token
* } ;
* ` ` `
*
* then the ` style ` token will be added ( and processed ) at the end . ` insertBefore ` allows you to insert tokens
* before existing tokens . For the CSS example above , you would use it like this :
*
* ` ` ` js
* Prism . languages . insertBefore ( 'markup' , 'cdata' , {
* 'style' : {
* // token
* }
* } ) ;
* ` ` `
*
* # # Special cases
*
* If the grammars of ` inside ` and ` insert ` have tokens with the same name , the tokens in ` inside ` ' s grammar
* will be ignored .
*
* This behavior can be used to insert tokens after ` before ` :
*
* ` ` ` js
* Prism . languages . insertBefore ( 'markup' , 'comment' , {
* 'comment' : Prism . languages . markup . comment ,
* // tokens after 'comment'
* } ) ;
* ` ` `
*
* # # Limitations
*
* The main problem ` insertBefore ` has to solve is iteration order . Since ES2015 , the iteration order for object
* properties is guaranteed to be the insertion order ( except for integer keys ) but some browsers behave
* differently when keys are deleted and re - inserted . So ` insertBefore ` can ' t be implemented by temporarily
* deleting properties which is necessary to insert at arbitrary positions .
*
* To solve this problem , ` insertBefore ` doesn ' t actually insert the given tokens into the target object .
* Instead , it will create a new object and replace all references to the target object with the new one . This
* can be done without temporarily deleting properties , so the iteration order is well - defined .
*
* However , only references that can be reached from ` Prism.languages ` or ` insert ` will be replaced . I . e . if
* you hold the target object in a variable , then the value of the variable will not change .
*
* ` ` ` js
* var oldMarkup = Prism . languages . markup ;
* var newMarkup = Prism . languages . insertBefore ( 'markup' , 'comment' , { ... } ) ;
*
* assert ( oldMarkup !== Prism . languages . markup ) ;
* assert ( newMarkup === Prism . languages . markup ) ;
* ` ` `
*
* @ param { string } inside The property of ` root ` ( e . g . a language id in ` Prism.languages ` ) that contains the
* object to be modified .
* @ param { string } before The key to insert before .
* @ param { Grammar } insert An object containing the key - value pairs to be inserted .
* @ param { Object < string , any > } [ root ] The object containing ` inside ` , i . e . the object that contains the
* object to be modified .
*
* Defaults to ` Prism.languages ` .
* @ returns { Grammar } The new grammar object .
* @ public
* /
insertBefore : function ( inside , before , insert , root ) {
root = root || /** @type {any} */ ( _ . languages ) ;
var grammar = root [ inside ] ;
/** @type {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 ] ;
}
}
}
// Do not insert token which also occur in insert. See #1525
if ( ! insert . hasOwnProperty ( token ) ) {
ret [ token ] = grammar [ token ] ;
}
}
}
var old = root [ inside ] ;
root [ inside ] = ret ;
// Update references in other language definitions
_ . languages . DFS ( _ . languages , function ( key , value ) {
if ( value === old && key != inside ) {
this [ key ] = ret ;
}
} ) ;
return ret ;
} ,
// Traverse a language definition with Depth First Search
DFS : function DFS ( o , callback , type , visited ) {
visited = visited || { } ;
var objId = _ . util . objId ;
for ( var i in o ) {
if ( o . hasOwnProperty ( i ) ) {
callback . call ( o , i , o [ i ] , type || i ) ;
var property = o [ i ] ;
var propertyType = _ . util . type ( property ) ;
if ( propertyType === 'Object' && ! visited [ objId ( property ) ] ) {
visited [ objId ( property ) ] = true ;
DFS ( property , callback , null , visited ) ;
} else if ( propertyType === 'Array' && ! visited [ objId ( property ) ] ) {
visited [ objId ( property ) ] = true ;
DFS ( property , callback , i , visited ) ;
}
}
}
}
} ,
plugins : { } ,
/ * *
* This is the most high - level function in Prism ’ s API .
* It fetches all the elements that have a ` .language-xxxx ` class and then calls { @ link Prism . highlightElement } on
* each one of them .
*
* This is equivalent to ` Prism.highlightAllUnder(document, async, callback) ` .
*
* @ param { boolean } [ async = false ] Same as in { @ link Prism . highlightAllUnder } .
* @ param { HighlightCallback } [ callback ] Same as in { @ link Prism . highlightAllUnder } .
* @ memberof Prism
* @ public
* /
highlightAll : function ( async , callback ) {
_ . highlightAllUnder ( document , async , callback ) ;
} ,
/ * *
* Fetches all the descendants of ` container ` that have a ` .language-xxxx ` class and then calls
* { @ link Prism . highlightElement } on each one of them .
*
* The following hooks will be run :
* 1. ` before-highlightall `
* 2. ` before-all-elements-highlight `
* 3. All hooks of { @ link Prism . highlightElement } for each element .
*
* @ param { ParentNode } container The root element , whose descendants that have a ` .language-xxxx ` class will be highlighted .
* @ param { boolean } [ async = false ] Whether each element is to be highlighted asynchronously using Web Workers .
* @ param { HighlightCallback } [ callback ] An optional callback to be invoked on each element after its highlighting is done .
* @ memberof Prism
* @ public
* /
highlightAllUnder : function ( container , async , callback ) {
var env = {
callback : callback ,
container : container ,
selector : 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
} ;
_ . hooks . run ( 'before-highlightall' , env ) ;
env . elements = Array . prototype . slice . apply ( env . container . querySelectorAll ( env . selector ) ) ;
_ . hooks . run ( 'before-all-elements-highlight' , env ) ;
for ( var i = 0 , element ; ( element = env . elements [ i ++ ] ) ; ) {
_ . highlightElement ( element , async === true , env . callback ) ;
}
} ,
/ * *
* Highlights the code inside a single element .
*
* The following hooks will be run :
* 1. ` before-sanity-check `
* 2. ` before-highlight `
* 3. All hooks of { @ link Prism . highlight } . These hooks will be run by an asynchronous worker if ` async ` is ` true ` .
* 4. ` before-insert `
* 5. ` after-highlight `
* 6. ` complete `
*
* Some the above hooks will be skipped if the element doesn ' t contain any text or there is no grammar loaded for
* the element ' s language .
*
* @ param { Element } element The element containing the code .
* It must have a class of ` language-xxxx ` to be processed , where ` xxxx ` is a valid language identifier .
* @ param { boolean } [ async = false ] Whether the element is to be highlighted asynchronously using Web Workers
* to improve performance and avoid blocking the UI when highlighting very large chunks of code . This option is
* [ disabled by default ] ( https : //prismjs.com/faq.html#why-is-asynchronous-highlighting-disabled-by-default).
*
* Note : All language definitions required to highlight the code must be included in the main ` prism.js ` file for
* asynchronous highlighting to work . You can build your own bundle on the
* [ Download page ] ( https : //prismjs.com/download.html).
* @ param { HighlightCallback } [ callback ] An optional callback to be invoked after the highlighting is done .
* Mostly useful when ` async ` is ` true ` , since in that case , the highlighting is done asynchronously .
* @ memberof Prism
* @ public
* /
highlightElement : function ( element , async , callback ) {
// Find language
var language = _ . util . getLanguage ( element ) ;
var grammar = _ . languages [ language ] ;
// Set language on the element, if not present
_ . util . setLanguage ( element , language ) ;
// Set language on the parent, for styling
var parent = element . parentElement ;
if ( parent && parent . nodeName . toLowerCase ( ) === 'pre' ) {
_ . util . setLanguage ( parent , language ) ;
}
var code = element . textContent ;
var env = {
element : element ,
language : language ,
grammar : grammar ,
code : code
} ;
function insertHighlightedCode ( highlightedCode ) {
env . highlightedCode = highlightedCode ;
_ . hooks . run ( 'before-insert' , env ) ;
env . element . innerHTML = env . highlightedCode ;
_ . hooks . run ( 'after-highlight' , env ) ;
_ . hooks . run ( 'complete' , env ) ;
callback && callback . call ( env . element ) ;
}
_ . hooks . run ( 'before-sanity-check' , env ) ;
// plugins may change/add the parent/element
parent = env . element . parentElement ;
if ( parent && parent . nodeName . toLowerCase ( ) === 'pre' && ! parent . hasAttribute ( 'tabindex' ) ) {
parent . setAttribute ( 'tabindex' , '0' ) ;
}
if ( ! env . code ) {
_ . hooks . run ( 'complete' , env ) ;
callback && callback . call ( env . element ) ;
return ;
}
_ . hooks . run ( 'before-highlight' , env ) ;
if ( ! env . grammar ) {
insertHighlightedCode ( _ . util . encode ( env . code ) ) ;
return ;
}
if ( async && _self . Worker ) {
var worker = new Worker ( _ . filename ) ;
worker . onmessage = function ( evt ) {
insertHighlightedCode ( evt . data ) ;
} ;
worker . postMessage ( JSON . stringify ( {
language : env . language ,
code : env . code ,
immediateClose : true
} ) ) ;
} else {
insertHighlightedCode ( _ . highlight ( env . code , env . grammar , env . language ) ) ;
}
} ,
/ * *
* Low - level function , only use if you know what you ’ re doing . It accepts a string of text as input
* and the language definitions to use , and returns a string with the HTML produced .
*
* The following hooks will be run :
* 1. ` before-tokenize `
* 2. ` after-tokenize `
* 3. ` wrap ` : On each { @ link Token } .
*
* @ param { string } text A string with the code to be highlighted .
* @ param { Grammar } grammar An object containing the tokens to use .
*
* Usually a language definition like ` Prism.languages.markup ` .
* @ param { string } language The name of the language definition passed to ` grammar ` .
* @ returns { string } The highlighted HTML .
* @ memberof Prism
* @ public
* @ example
* Prism . highlight ( 'var foo = true;' , Prism . languages . javascript , 'javascript' ) ;
* /
highlight : function ( text , grammar , language ) {
var env = {
code : text ,
grammar : grammar ,
language : language
} ;
_ . hooks . run ( 'before-tokenize' , env ) ;
if ( ! env . grammar ) {
throw new Error ( 'The language "' + env . language + '" has no grammar.' ) ;
}
env . tokens = _ . tokenize ( env . code , env . grammar ) ;
_ . hooks . run ( 'after-tokenize' , env ) ;
return Token . stringify ( _ . util . encode ( env . tokens ) , env . language ) ;
} ,
/ * *
* This is the heart of Prism , and the most low - level function you can use . It accepts a string of text as input
* and the language definitions to use , and returns an array with the tokenized code .
*
* When the language definition includes nested tokens , the function is called recursively on each of these tokens .
*
* This method could be useful in other contexts as well , as a very crude parser .
*
* @ param { string } text A string with the code to be highlighted .
* @ param { Grammar } grammar An object containing the tokens to use .
*
* Usually a language definition like ` Prism.languages.markup ` .
* @ returns { TokenStream } An array of strings and tokens , a token stream .
* @ memberof Prism
* @ public
* @ example
* let code = ` var foo = 0; ` ;
* let tokens = Prism . tokenize ( code , Prism . languages . javascript ) ;
* tokens . forEach ( token => {
* if ( token instanceof Prism . Token && token . type === 'number' ) {
* console . log ( ` Found numeric literal: ${ token . content } ` ) ;
* }
* } ) ;
* /
tokenize : function ( text , grammar ) {
var rest = grammar . rest ;
if ( rest ) {
for ( var token in rest ) {
grammar [ token ] = rest [ token ] ;
}
delete grammar . rest ;
}
var tokenList = new LinkedList ( ) ;
addAfter ( tokenList , tokenList . head , text ) ;
matchGrammar ( text , tokenList , grammar , tokenList . head , 0 ) ;
return toArray ( tokenList ) ;
} ,
/ * *
* @ namespace
* @ memberof Prism
* @ public
* /
hooks : {
all : { } ,
/ * *
* Adds the given callback to the list of callbacks for the given hook .
*
* The callback will be invoked when the hook it is registered for is run .
* Hooks are usually directly run by a highlight function but you can also run hooks yourself .
*
* One callback function can be registered to multiple hooks and the same hook multiple times .
*
* @ param { string } name The name of the hook .
* @ param { HookCallback } callback The callback function which is given environment variables .
* @ public
* /
add : function ( name , callback ) {
var hooks = _ . hooks . all ;
hooks [ name ] = hooks [ name ] || [ ] ;
hooks [ name ] . push ( callback ) ;
} ,
/ * *
* Runs a hook invoking all registered callbacks with the given environment variables .
*
* Callbacks will be invoked synchronously and in the order in which they were registered .
*
* @ param { string } name The name of the hook .
* @ param { Object < string , any > } env The environment variables of the hook passed to all callbacks registered .
* @ public
* /
run : function ( name , env ) {
var callbacks = _ . hooks . all [ name ] ;
if ( ! callbacks || ! callbacks . length ) {
return ;
}
for ( var i = 0 , callback ; ( callback = callbacks [ i ++ ] ) ; ) {
callback ( env ) ;
}
}
} ,
Token : Token
} ;
_self . Prism = _ ;
// Typescript note:
// The following can be used to import the Token type in JSDoc:
//
// @typedef {InstanceType<import("./prism-core")["Token"]>} Token
/ * *
* Creates a new token .
*
* @ param { string } type See { @ link Token # type type }
* @ param { string | TokenStream } content See { @ link Token # content content }
* @ param { string | string [ ] } [ alias ] The alias ( es ) of the token .
* @ param { string } [ matchedStr = "" ] A copy of the full string this token was created from .
* @ class
* @ global
* @ public
* /
function Token ( type , content , alias , matchedStr ) {
/ * *
* The type of the token .
*
* This is usually the key of a pattern in a { @ link Grammar } .
*
* @ type { string }
* @ see GrammarToken
* @ public
* /
this . type = type ;
/ * *
* The strings or tokens contained by this token .
*
* This will be a token stream if the pattern matched also defined an ` inside ` grammar .
*
* @ type { string | TokenStream }
* @ public
* /
this . content = content ;
/ * *
* The alias ( es ) of the token .
*
* @ type { string | string [ ] }
* @ see GrammarToken
* @ public
* /
this . alias = alias ;
// Copy of the full string this token was created from
this . length = ( matchedStr || '' ) . length | 0 ;
}
/ * *
* A token stream is an array of strings and { @ link Token Token } objects .
*
* Token streams have to fulfill a few properties that are assumed by most functions ( mostly internal ones ) that process
* them .
*
* 1. No adjacent strings .
* 2. No empty strings .
*
* The only exception here is the token stream that only contains the empty string and nothing else .
*
* @ typedef { Array < string | Token > } TokenStream
* @ global
* @ public
* /
/ * *
* Converts the given token or token stream to an HTML representation .
*
* The following hooks will be run :
* 1. ` wrap ` : On each { @ link Token } .
*
* @ param { string | Token | TokenStream } o The token or token stream to be converted .
* @ param { string } language The name of current language .
* @ returns { string } The HTML representation of the token or token stream .
* @ memberof Token
* @ static
* /
Token . stringify = function stringify ( o , language ) {
if ( typeof o == 'string' ) {
return o ;
}
if ( Array . isArray ( o ) ) {
var s = '' ;
o . forEach ( function ( e ) {
s += stringify ( e , language ) ;
} ) ;
return s ;
}
var env = {
type : o . type ,
content : stringify ( o . content , language ) ,
tag : 'span' ,
classes : [ 'token' , o . type ] ,
attributes : { } ,
language : language
} ;
var aliases = o . alias ;
if ( aliases ) {
if ( Array . isArray ( aliases ) ) {
Array . prototype . push . apply ( env . classes , aliases ) ;
} else {
env . classes . push ( aliases ) ;
}
}
_ . hooks . run ( 'wrap' , env ) ;
var attributes = '' ;
for ( var name in env . attributes ) {
attributes += ' ' + name + '="' + ( env . attributes [ name ] || '' ) . replace ( /"/g , '"' ) + '"' ;
}
return '<' + env . tag + ' class="' + env . classes . join ( ' ' ) + '"' + attributes + '>' + env . content + '</' + env . tag + '>' ;
} ;
/ * *
* @ param { RegExp } pattern
* @ param { number } pos
* @ param { string } text
* @ param { boolean } lookbehind
* @ returns { RegExpExecArray | null }
* /
function matchPattern ( pattern , pos , text , lookbehind ) {
pattern . lastIndex = pos ;
var match = pattern . exec ( text ) ;
if ( match && lookbehind && match [ 1 ] ) {
// change the match to remove the text matched by the Prism lookbehind group
var lookbehindLength = match [ 1 ] . length ;
match . index += lookbehindLength ;
match [ 0 ] = match [ 0 ] . slice ( lookbehindLength ) ;
}
return match ;
}
/ * *
* @ param { string } text
* @ param { LinkedList < string | Token > } tokenList
* @ param { any } grammar
* @ param { LinkedListNode < string | Token > } startNode
* @ param { number } startPos
* @ param { RematchOptions } [ rematch ]
* @ returns { void }
* @ private
*
* @ typedef RematchOptions
* @ property { string } cause
* @ property { number } reach
* /
function matchGrammar ( text , tokenList , grammar , startNode , startPos , rematch ) {
for ( var token in grammar ) {
if ( ! grammar . hasOwnProperty ( token ) || ! grammar [ token ] ) {
continue ;
}
var patterns = grammar [ token ] ;
patterns = Array . isArray ( patterns ) ? patterns : [ patterns ] ;
for ( var j = 0 ; j < patterns . length ; ++ j ) {
if ( rematch && rematch . cause == token + ',' + j ) {
return ;
}
var patternObj = patterns [ j ] ;
var inside = patternObj . inside ;
var lookbehind = ! ! patternObj . lookbehind ;
var greedy = ! ! patternObj . greedy ;
var alias = patternObj . alias ;
if ( greedy && ! patternObj . pattern . global ) {
// Without the global flag, lastIndex won't work
var flags = patternObj . pattern . toString ( ) . match ( /[imsuy]*$/ ) [ 0 ] ;
patternObj . pattern = RegExp ( patternObj . pattern . source , flags + 'g' ) ;
}
/** @type {RegExp} */
var pattern = patternObj . pattern || patternObj ;
for ( // iterate the token list and keep track of the current token/string position
var currentNode = startNode . next , pos = startPos ;
currentNode !== tokenList . tail ;
pos += currentNode . value . length , currentNode = currentNode . next
) {
if ( rematch && pos >= rematch . reach ) {
break ;
}
var str = currentNode . value ;
if ( tokenList . length > text . length ) {
// Something went terribly wrong, ABORT, ABORT!
return ;
}
if ( str instanceof Token ) {
continue ;
}
var removeCount = 1 ; // this is the to parameter of removeBetween
var match ;
if ( greedy ) {
match = matchPattern ( pattern , pos , text , lookbehind ) ;
if ( ! match || match . index >= text . length ) {
break ;
}
var from = match . index ;
var to = match . index + match [ 0 ] . length ;
var p = pos ;
// find the node that contains the match
p += currentNode . value . length ;
while ( from >= p ) {
currentNode = currentNode . next ;
p += currentNode . value . length ;
}
// adjust pos (and p)
p -= currentNode . value . length ;
pos = p ;
// the current node is a Token, then the match starts inside another Token, which is invalid
if ( currentNode . value instanceof Token ) {
continue ;
}
// find the last node which is affected by this match
for (
var k = currentNode ;
k !== tokenList . tail && ( p < to || typeof k . value === 'string' ) ;
k = k . next
) {
removeCount ++ ;
p += k . value . length ;
}
removeCount -- ;
// replace with the new match
str = text . slice ( pos , p ) ;
match . index -= pos ;
} else {
match = matchPattern ( pattern , 0 , str , lookbehind ) ;
if ( ! match ) {
continue ;
}
}
// eslint-disable-next-line no-redeclare
var from = match . index ;
var matchStr = match [ 0 ] ;
var before = str . slice ( 0 , from ) ;
var after = str . slice ( from + matchStr . length ) ;
var reach = pos + str . length ;
if ( rematch && reach > rematch . reach ) {
rematch . reach = reach ;
}
var removeFrom = currentNode . prev ;
if ( before ) {
removeFrom = addAfter ( tokenList , removeFrom , before ) ;
pos += before . length ;
}
removeRange ( tokenList , removeFrom , removeCount ) ;
var wrapped = new Token ( token , inside ? _ . tokenize ( matchStr , inside ) : matchStr , alias , matchStr ) ;
currentNode = addAfter ( tokenList , removeFrom , wrapped ) ;
if ( after ) {
addAfter ( tokenList , currentNode , after ) ;
}
if ( removeCount > 1 ) {
// at least one Token object was removed, so we have to do some rematching
// this can only happen if the current pattern is greedy
/** @type {RematchOptions} */
var nestedRematch = {
cause : token + ',' + j ,
reach : reach
} ;
matchGrammar ( text , tokenList , grammar , currentNode . prev , pos , nestedRematch ) ;
// the reach might have been extended because of the rematching
if ( rematch && nestedRematch . reach > rematch . reach ) {
rematch . reach = nestedRematch . reach ;
}
}
}
}
}
}
/ * *
* @ typedef LinkedListNode
* @ property { T } value
* @ property { LinkedListNode < T > | null } prev The previous node .
* @ property { LinkedListNode < T > | null } next The next node .
* @ template T
* @ private
* /
/ * *
* @ template T
* @ private
* /
function LinkedList ( ) {
/** @type {LinkedListNode<T>} */
var head = { value : null , prev : null , next : null } ;
/** @type {LinkedListNode<T>} */
var tail = { value : null , prev : head , next : null } ;
head . next = tail ;
/** @type {LinkedListNode<T>} */
this . head = head ;
/** @type {LinkedListNode<T>} */
this . tail = tail ;
this . length = 0 ;
}
/ * *
* Adds a new node with the given value to the list .
*
* @ param { LinkedList < T > } list
* @ param { LinkedListNode < T > } node
* @ param { T } value
* @ returns { LinkedListNode < T > } The added node .
* @ template T
* /
function addAfter ( list , node , value ) {
// assumes that node != list.tail && values.length >= 0
var next = node . next ;
var newNode = { value : value , prev : node , next : next } ;
node . next = newNode ;
next . prev = newNode ;
list . length ++ ;
return newNode ;
}
/ * *
* Removes ` count ` nodes after the given node . The given node will not be removed .
*
* @ param { LinkedList < T > } list
* @ param { LinkedListNode < T > } node
* @ param { number } count
* @ template T
* /
function removeRange ( list , node , count ) {
var next = node . next ;
for ( var i = 0 ; i < count && next !== list . tail ; i ++ ) {
next = next . next ;
}
node . next = next ;
next . prev = node ;
list . length -= i ;
}
/ * *
* @ param { LinkedList < T > } list
* @ returns { T [ ] }
* @ template T
* /
function toArray ( list ) {
var array = [ ] ;
var node = list . head . next ;
while ( node !== list . tail ) {
array . push ( node . value ) ;
node = node . next ;
}
return array ;
}
if ( ! _self . document ) {
if ( ! _self . addEventListener ) {
// in Node.js
return _ ;
}
if ( ! _ . disableWorkerMessageHandler ) {
// In worker
_self . addEventListener ( 'message' , function ( evt ) {
var message = JSON . parse ( evt . data ) ;
var lang = message . language ;
var code = message . code ;
var immediateClose = message . immediateClose ;
_self . postMessage ( _ . highlight ( code , _ . languages [ lang ] , lang ) ) ;
if ( immediateClose ) {
_self . close ( ) ;
}
} , false ) ;
}
return _ ;
}
// Get current script and highlight
var script = _ . util . currentScript ( ) ;
if ( script ) {
_ . filename = script . src ;
if ( script . hasAttribute ( 'data-manual' ) ) {
_ . manual = true ;
}
}
function highlightAutomaticallyCallback ( ) {
if ( ! _ . manual ) {
_ . highlightAll ( ) ;
}
}
if ( ! _ . manual ) {
// If the document state is "loading", then we'll use DOMContentLoaded.
// If the document state is "interactive" and the prism.js script is deferred, then we'll also use the
// DOMContentLoaded event because there might be some plugins or languages which have also been deferred and they
// might take longer one animation frame to execute which can create a race condition where only some plugins have
// been loaded when Prism.highlightAll() is executed, depending on how fast resources are loaded.
// See https://github.com/PrismJS/prism/issues/2102
var readyState = document . readyState ;
if ( readyState === 'loading' || readyState === 'interactive' && script && script . defer ) {
document . addEventListener ( 'DOMContentLoaded' , highlightAutomaticallyCallback ) ;
} else {
if ( window . requestAnimationFrame ) {
window . requestAnimationFrame ( highlightAutomaticallyCallback ) ;
} else {
window . setTimeout ( highlightAutomaticallyCallback , 16 ) ;
}
}
}
return _ ;
} ( _self ) ) ;
if ( true && module . exports ) {
module . exports = Prism ;
}
// hack for components to work correctly in node.js
if ( typeof _ _webpack _require _ _ . g !== 'undefined' ) {
_ _webpack _require _ _ . g . Prism = Prism ;
}
// some additional documentation/types
/ * *
* The expansion of a simple ` RegExp ` literal to support additional properties .
*
* @ typedef GrammarToken
* @ property { RegExp } pattern The regular expression of the token .
* @ property { boolean } [ lookbehind = false ] If ` true ` , then the first capturing group of ` pattern ` will ( effectively )
* behave as a lookbehind group meaning that the captured text will not be part of the matched text of the new token .
* @ property { boolean } [ greedy = false ] Whether the token is greedy .
* @ property { string | string [ ] } [ alias ] An optional alias or list of aliases .
* @ property { Grammar } [ inside ] The nested grammar of this token .
*
* The ` inside ` grammar will be used to tokenize the text value of each token of this kind .
*
* This can be used to make nested and even recursive language definitions .
*
* Note : This can cause infinite recursion . Be careful when you embed different languages or even the same language into
* each another .
* @ global
* @ public
* /
/ * *
* @ typedef Grammar
* @ type { Object < string , RegExp | GrammarToken | Array < RegExp | GrammarToken >> }
* @ property { Grammar } [ rest ] An optional grammar object that will be appended to this grammar .
* @ global
* @ public
* /
/ * *
* A function which will invoked after an element was successfully highlighted .
*
* @ callback HighlightCallback
* @ param { Element } element The element successfully highlighted .
* @ returns { void }
* @ global
* @ public
* /
/ * *
* @ callback HookCallback
* @ param { Object < string , any > } env The environment variables of the hook .
* @ returns { void }
* @ global
* @ public
* /
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Begin prism - markup . js
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
Prism . languages . markup = {
'comment' : {
pattern : /<!--(?:(?!<!--)[\s\S])*?-->/ ,
greedy : true
} ,
'prolog' : {
pattern : /<\?[\s\S]+?\?>/ ,
greedy : true
} ,
'doctype' : {
// https://www.w3.org/TR/xml/#NT-doctypedecl
pattern : /<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i ,
greedy : true ,
inside : {
'internal-subset' : {
pattern : /(^[^\[]*\[)[\s\S]+(?=\]>$)/ ,
lookbehind : true ,
greedy : true ,
inside : null // see below
} ,
'string' : {
pattern : /"[^"]*"|'[^']*'/ ,
greedy : true
} ,
'punctuation' : /^<!|>$|[[\]]/ ,
'doctype-tag' : /^DOCTYPE/i ,
'name' : /[^\s<>'"]+/
}
} ,
'cdata' : {
pattern : /<!\[CDATA\[[\s\S]*?\]\]>/i ,
greedy : true
} ,
'tag' : {
pattern : /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/ ,
greedy : true ,
inside : {
'tag' : {
pattern : /^<\/?[^\s>\/]+/ ,
inside : {
'punctuation' : /^<\/?/ ,
'namespace' : /^[^\s>\/:]+:/
}
} ,
'special-attr' : [ ] ,
'attr-value' : {
pattern : /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/ ,
inside : {
'punctuation' : [
{
pattern : /^=/ ,
alias : 'attr-equals'
} ,
{
pattern : /^(\s*)["']|["']$/ ,
lookbehind : true
}
]
}
} ,
'punctuation' : /\/?>/ ,
'attr-name' : {
pattern : /[^\s>\/]+/ ,
inside : {
'namespace' : /^[^\s>\/:]+:/
}
}
}
} ,
'entity' : [
{
pattern : /&[\da-z]{1,8};/i ,
alias : 'named-entity'
} ,
/&#x?[\da-f]{1,8};/i
]
} ;
Prism . languages . markup [ 'tag' ] . inside [ 'attr-value' ] . inside [ 'entity' ] =
Prism . languages . markup [ 'entity' ] ;
Prism . languages . markup [ 'doctype' ] . inside [ 'internal-subset' ] . inside = Prism . languages . markup ;
// Plugin to make entity title show the real entity, idea by Roman Komarov
Prism . hooks . add ( 'wrap' , function ( env ) {
if ( env . type === 'entity' ) {
env . attributes [ 'title' ] = env . content . replace ( /&/ , '&' ) ;
}
} ) ;
Object . defineProperty ( Prism . languages . markup . tag , 'addInlined' , {
/ * *
* Adds an inlined language to markup .
*
* An example of an inlined language is CSS with ` <style> ` tags .
*
* @ param { string } tagName The name of the tag that contains the inlined language . This name will be treated as
* case insensitive .
* @ param { string } lang The language key .
* @ example
* addInlined ( 'style' , 'css' ) ;
* /
value : function addInlined ( tagName , lang ) {
var includedCdataInside = { } ;
includedCdataInside [ 'language-' + lang ] = {
pattern : /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i ,
lookbehind : true ,
inside : Prism . languages [ lang ]
} ;
includedCdataInside [ 'cdata' ] = /^<!\[CDATA\[|\]\]>$/i ;
var inside = {
'included-cdata' : {
pattern : /<!\[CDATA\[[\s\S]*?\]\]>/i ,
inside : includedCdataInside
}
} ;
inside [ 'language-' + lang ] = {
pattern : /[\s\S]+/ ,
inside : Prism . languages [ lang ]
} ;
var def = { } ;
def [ tagName ] = {
pattern : RegExp ( /(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/ . source . replace ( /__/g , function ( ) { return tagName ; } ) , 'i' ) ,
lookbehind : true ,
greedy : true ,
inside : inside
} ;
Prism . languages . insertBefore ( 'markup' , 'cdata' , def ) ;
}
} ) ;
Object . defineProperty ( Prism . languages . markup . tag , 'addAttribute' , {
/ * *
* Adds an pattern to highlight languages embedded in HTML attributes .
*
* An example of an inlined language is CSS with ` style ` attributes .
*
* @ param { string } attrName The name of the tag that contains the inlined language . This name will be treated as
* case insensitive .
* @ param { string } lang The language key .
* @ example
* addAttribute ( 'style' , 'css' ) ;
* /
value : function ( attrName , lang ) {
Prism . languages . markup . tag . inside [ 'special-attr' ] . push ( {
pattern : RegExp (
/(^|["'\s])/ . source + '(?:' + attrName + ')' + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/ . source ,
'i'
) ,
lookbehind : true ,
inside : {
'attr-name' : /^[^\s=]+/ ,
'attr-value' : {
pattern : /=[\s\S]+/ ,
inside : {
'value' : {
pattern : /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/ ,
lookbehind : true ,
alias : [ lang , 'language-' + lang ] ,
inside : Prism . languages [ lang ]
} ,
'punctuation' : [
{
pattern : /^=/ ,
alias : 'attr-equals'
} ,
/"|'/
]
}
}
}
} ) ;
}
} ) ;
Prism . languages . html = Prism . languages . markup ;
Prism . languages . mathml = Prism . languages . markup ;
Prism . languages . svg = Prism . languages . markup ;
Prism . languages . xml = Prism . languages . extend ( 'markup' , { } ) ;
Prism . languages . ssml = Prism . languages . xml ;
Prism . languages . atom = Prism . languages . xml ;
Prism . languages . rss = Prism . languages . xml ;
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Begin prism - css . js
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
( function ( Prism ) {
var string = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/ ;
Prism . languages . css = {
'comment' : /\/\*[\s\S]*?\*\// ,
'atrule' : {
pattern : RegExp ( '@[\\w-](?:' + /[^;{\s"']|\s+(?!\s)/ . source + '|' + string . source + ')*?' + /(?:;|(?=\s*\{))/ . source ) ,
inside : {
'rule' : /^@[\w-]+/ ,
'selector-function-argument' : {
pattern : /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/ ,
lookbehind : true ,
alias : 'selector'
} ,
'keyword' : {
pattern : /(^|[^\w-])(?:and|not|only|or)(?![\w-])/ ,
lookbehind : true
}
// See rest below
}
} ,
'url' : {
// https://drafts.csswg.org/css-values-3/#urls
pattern : RegExp ( '\\burl\\((?:' + string . source + '|' + /(?:[^\\\r\n()"']|\\[\s\S])*/ . source + ')\\)' , 'i' ) ,
greedy : true ,
inside : {
'function' : /^url/i ,
'punctuation' : /^\(|\)$/ ,
'string' : {
pattern : RegExp ( '^' + string . source + '$' ) ,
alias : 'url'
}
}
} ,
'selector' : {
pattern : RegExp ( '(^|[{}\\s])[^{}\\s](?:[^{};"\'\\s]|\\s+(?![\\s{])|' + string . source + ')*(?=\\s*\\{)' ) ,
lookbehind : true
} ,
'string' : {
pattern : string ,
greedy : true
} ,
'property' : {
pattern : /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i ,
lookbehind : true
} ,
'important' : /!important\b/i ,
'function' : {
pattern : /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i ,
lookbehind : true
} ,
'punctuation' : /[(){};:,]/
} ;
Prism . languages . css [ 'atrule' ] . inside . rest = Prism . languages . css ;
var markup = Prism . languages . markup ;
if ( markup ) {
markup . tag . addInlined ( 'style' , 'css' ) ;
markup . tag . addAttribute ( 'style' , 'css' ) ;
}
} ( Prism ) ) ;
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Begin prism - clike . js
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
Prism . languages . clike = {
'comment' : [
{
pattern : /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/ ,
lookbehind : true ,
greedy : true
} ,
{
pattern : /(^|[^\\:])\/\/.*/ ,
lookbehind : true ,
greedy : true
}
] ,
'string' : {
pattern : /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/ ,
greedy : true
} ,
'class-name' : {
pattern : /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i ,
lookbehind : true ,
inside : {
'punctuation' : /[.\\]/
}
} ,
'keyword' : /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/ ,
'boolean' : /\b(?:false|true)\b/ ,
'function' : /\b\w+(?=\()/ ,
'number' : /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i ,
'operator' : /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/ ,
'punctuation' : /[{}[\];(),.:]/
} ;
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Begin prism - javascript . js
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
Prism . languages . javascript = Prism . languages . extend ( 'clike' , {
'class-name' : [
Prism . languages . clike [ 'class-name' ] ,
{
pattern : /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/ ,
lookbehind : true
}
] ,
'keyword' : [
{
pattern : /((?:^|\})\s*)catch\b/ ,
lookbehind : true
} ,
{
pattern : /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/ ,
lookbehind : true
} ,
] ,
// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
'function' : /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/ ,
'number' : {
pattern : RegExp (
/(^|[^\w$])/ . source +
'(?:' +
(
// constant
/NaN|Infinity/ . source +
'|' +
// binary integer
/0[bB][01]+(?:_[01]+)*n?/ . source +
'|' +
// octal integer
/0[oO][0-7]+(?:_[0-7]+)*n?/ . source +
'|' +
// hexadecimal integer
/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/ . source +
'|' +
// decimal bigint
/\d+(?:_\d+)*n/ . source +
'|' +
// decimal number (integer or float) but no bigint
/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/ . source
) +
')' +
/(?![\w$])/ . source
) ,
lookbehind : true
} ,
'operator' : /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/
} ) ;
Prism . languages . javascript [ 'class-name' ] [ 0 ] . pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/ ;
Prism . languages . insertBefore ( 'javascript' , 'keyword' , {
'regex' : {
pattern : RegExp (
// lookbehind
// eslint-disable-next-line regexp/no-dupe-characters-character-class
/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/ . source +
// Regex pattern:
// There are 2 regex patterns here. The RegExp set notation proposal added support for nested character
// classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible
// with the only syntax, so we have to define 2 different regex patterns.
/\// . source +
'(?:' +
/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/ . source +
'|' +
// `v` flag syntax. This supports 3 levels of nested character classes.
/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/ . source +
')' +
// lookahead
/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/ . source
) ,
lookbehind : true ,
greedy : true ,
inside : {
'regex-source' : {
pattern : /^(\/)[\s\S]+(?=\/[a-z]*$)/ ,
lookbehind : true ,
alias : 'language-regex' ,
inside : Prism . languages . regex
} ,
'regex-delimiter' : /^\/|\/$/ ,
'regex-flags' : /^[a-z]+$/ ,
}
} ,
// This must be declared before keyword because we use "function" inside the look-forward
'function-variable' : {
pattern : /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/ ,
alias : 'function'
} ,
'parameter' : [
{
pattern : /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/ ,
lookbehind : true ,
inside : Prism . languages . javascript
} ,
{
pattern : /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i ,
lookbehind : true ,
inside : Prism . languages . javascript
} ,
{
pattern : /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/ ,
lookbehind : true ,
inside : Prism . languages . javascript
} ,
{
pattern : /((?:\b|\s|^)(?!(?: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|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/ ,
lookbehind : true ,
inside : Prism . languages . javascript
}
] ,
'constant' : /\b[A-Z](?:[A-Z_]|\dx?)*\b/
} ) ;
Prism . languages . insertBefore ( 'javascript' , 'string' , {
'hashbang' : {
pattern : /^#!.*/ ,
greedy : true ,
alias : 'comment'
} ,
'template-string' : {
pattern : /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/ ,
greedy : true ,
inside : {
'template-punctuation' : {
pattern : /^`|`$/ ,
alias : 'string'
} ,
'interpolation' : {
pattern : /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/ ,
lookbehind : true ,
inside : {
'interpolation-punctuation' : {
pattern : /^\$\{|\}$/ ,
alias : 'punctuation'
} ,
rest : Prism . languages . javascript
}
} ,
'string' : /[\s\S]+/
}
} ,
'string-property' : {
pattern : /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m ,
lookbehind : true ,
greedy : true ,
alias : 'property'
}
} ) ;
Prism . languages . insertBefore ( 'javascript' , 'operator' , {
'literal-property' : {
pattern : /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m ,
lookbehind : true ,
alias : 'property'
} ,
} ) ;
if ( Prism . languages . markup ) {
Prism . languages . markup . tag . addInlined ( 'script' , 'javascript' ) ;
// add attribute support for all DOM events.
// https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events
Prism . languages . markup . tag . addAttribute (
/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/ . source ,
'javascript'
) ;
}
Prism . languages . js = Prism . languages . javascript ;
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Begin prism - file - highlight . js
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
( function ( ) {
if ( typeof Prism === 'undefined' || typeof document === 'undefined' ) {
return ;
}
// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill
if ( ! Element . prototype . matches ) {
Element . prototype . matches = Element . prototype . msMatchesSelector || Element . prototype . webkitMatchesSelector ;
}
var LOADING _MESSAGE = 'Loading…' ;
var FAILURE _MESSAGE = function ( status , message ) {
return '✖ Error ' + status + ' while fetching file: ' + message ;
} ;
var FAILURE _EMPTY _MESSAGE = '✖ Error: File does not exist or is empty' ;
var EXTENSIONS = {
'js' : 'javascript' ,
'py' : 'python' ,
'rb' : 'ruby' ,
'ps1' : 'powershell' ,
'psm1' : 'powershell' ,
'sh' : 'bash' ,
'bat' : 'batch' ,
'h' : 'c' ,
'tex' : 'latex'
} ;
var STATUS _ATTR = 'data-src-status' ;
var STATUS _LOADING = 'loading' ;
var STATUS _LOADED = 'loaded' ;
var STATUS _FAILED = 'failed' ;
var SELECTOR = 'pre[data-src]:not([' + STATUS _ATTR + '="' + STATUS _LOADED + '"])'
+ ':not([' + STATUS _ATTR + '="' + STATUS _LOADING + '"])' ;
/ * *
* Loads the given file .
*
* @ param { string } src The URL or path of the source file to load .
* @ param { ( result : string ) => void } success
* @ param { ( reason : string ) => void } error
* /
function loadFile ( src , success , error ) {
var xhr = new XMLHttpRequest ( ) ;
xhr . open ( 'GET' , src , true ) ;
xhr . onreadystatechange = function ( ) {
if ( xhr . readyState == 4 ) {
if ( xhr . status < 400 && xhr . responseText ) {
success ( xhr . responseText ) ;
} else {
if ( xhr . status >= 400 ) {
error ( FAILURE _MESSAGE ( xhr . status , xhr . statusText ) ) ;
} else {
error ( FAILURE _EMPTY _MESSAGE ) ;
}
}
}
} ;
xhr . send ( null ) ;
}
/ * *
* Parses the given range .
*
* This returns a range with inclusive ends .
*
* @ param { string | null | undefined } range
* @ returns { [ number , number | undefined ] | undefined }
* /
function parseRange ( range ) {
var m = /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/ . exec ( range || '' ) ;
if ( m ) {
var start = Number ( m [ 1 ] ) ;
var comma = m [ 2 ] ;
var end = m [ 3 ] ;
if ( ! comma ) {
return [ start , start ] ;
}
if ( ! end ) {
return [ start , undefined ] ;
}
return [ start , Number ( end ) ] ;
}
return undefined ;
}
Prism . hooks . add ( 'before-highlightall' , function ( env ) {
env . selector += ', ' + SELECTOR ;
} ) ;
Prism . hooks . add ( 'before-sanity-check' , function ( env ) {
var pre = /** @type {HTMLPreElement} */ ( env . element ) ;
if ( pre . matches ( SELECTOR ) ) {
env . code = '' ; // fast-path the whole thing and go to complete
pre . setAttribute ( STATUS _ATTR , STATUS _LOADING ) ; // mark as loading
// add code element with loading message
var code = pre . appendChild ( document . createElement ( 'CODE' ) ) ;
code . textContent = LOADING _MESSAGE ;
var src = pre . getAttribute ( 'data-src' ) ;
var language = env . language ;
if ( language === 'none' ) {
// the language might be 'none' because there is no language set;
// in this case, we want to use the extension as the language
var extension = ( /\.(\w+)$/ . exec ( src ) || [ , 'none' ] ) [ 1 ] ;
language = EXTENSIONS [ extension ] || extension ;
}
// set language classes
Prism . util . setLanguage ( code , language ) ;
Prism . util . setLanguage ( pre , language ) ;
// preload the language
var autoloader = Prism . plugins . autoloader ;
if ( autoloader ) {
autoloader . loadLanguages ( language ) ;
}
// load file
loadFile (
src ,
function ( text ) {
// mark as loaded
pre . setAttribute ( STATUS _ATTR , STATUS _LOADED ) ;
// handle data-range
var range = parseRange ( pre . getAttribute ( 'data-range' ) ) ;
if ( range ) {
var lines = text . split ( /\r\n?|\n/g ) ;
// the range is one-based and inclusive on both ends
var start = range [ 0 ] ;
var end = range [ 1 ] == null ? lines . length : range [ 1 ] ;
if ( start < 0 ) { start += lines . length ; }
start = Math . max ( 0 , Math . min ( start - 1 , lines . length ) ) ;
if ( end < 0 ) { end += lines . length ; }
end = Math . max ( 0 , Math . min ( end , lines . length ) ) ;
text = lines . slice ( start , end ) . join ( '\n' ) ;
// add data-start for line numbers
if ( ! pre . hasAttribute ( 'data-start' ) ) {
pre . setAttribute ( 'data-start' , String ( start + 1 ) ) ;
}
}
// highlight code
code . textContent = text ;
Prism . highlightElement ( code ) ;
} ,
function ( error ) {
// mark as failed
pre . setAttribute ( STATUS _ATTR , STATUS _FAILED ) ;
code . textContent = error ;
}
) ;
}
} ) ;
Prism . plugins . fileHighlight = {
/ * *
* Executes the File Highlight plugin for all matching ` pre ` elements under the given container .
*
* Note : Elements which are already loaded or currently loading will not be touched by this method .
*
* @ param { ParentNode } [ container = document ]
* /
highlight : function highlight ( container ) {
var elements = ( container || document ) . querySelectorAll ( SELECTOR ) ;
for ( var i = 0 , element ; ( element = elements [ i ++ ] ) ; ) {
Prism . highlightElement ( element ) ;
}
}
} ;
var logged = false ;
/** @deprecated Use `Prism.plugins.fileHighlight.highlight` instead. */
Prism . fileHighlight = function ( ) {
if ( ! logged ) {
console . warn ( 'Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.' ) ;
logged = true ;
}
Prism . plugins . fileHighlight . highlight . apply ( this , arguments ) ;
} ;
} ( ) ) ;
/***/ } ) ,
/* 3 */
/***/ ( function ( ) {
( function ( ) {
if ( typeof Prism === 'undefined' || typeof document === 'undefined' ) {
return ;
}
/ * *
* Plugin name which is used as a class name for < pre > which is activating the plugin
*
* @ type { string }
* /
var PLUGIN _NAME = 'line-numbers' ;
/ * *
* Regular expression used for determining line breaks
*
* @ type { RegExp }
* /
var NEW _LINE _EXP = /\n(?!$)/g ;
/ * *
* Global exports
* /
var config = Prism . plugins . lineNumbers = {
/ * *
* Get node for provided line number
*
* @ param { Element } element pre element
* @ param { number } number line number
* @ returns { Element | undefined }
* /
getLine : function ( element , number ) {
if ( element . tagName !== 'PRE' || ! element . classList . contains ( PLUGIN _NAME ) ) {
return ;
}
var lineNumberRows = element . querySelector ( '.line-numbers-rows' ) ;
if ( ! lineNumberRows ) {
return ;
}
var lineNumberStart = parseInt ( element . getAttribute ( 'data-start' ) , 10 ) || 1 ;
var lineNumberEnd = lineNumberStart + ( lineNumberRows . children . length - 1 ) ;
if ( number < lineNumberStart ) {
number = lineNumberStart ;
}
if ( number > lineNumberEnd ) {
number = lineNumberEnd ;
}
var lineIndex = number - lineNumberStart ;
return lineNumberRows . children [ lineIndex ] ;
} ,
/ * *
* Resizes the line numbers of the given element .
*
* This function will not add line numbers . It will only resize existing ones .
*
* @ param { HTMLElement } element A ` <pre> ` element with line numbers .
* @ returns { void }
* /
resize : function ( element ) {
resizeElements ( [ element ] ) ;
} ,
/ * *
* Whether the plugin can assume that the units font sizes and margins are not depended on the size of
* the current viewport .
*
* Setting this to ` true ` will allow the plugin to do certain optimizations for better performance .
*
* Set this to ` false ` if you use any of the following CSS units : ` vh ` , ` vw ` , ` vmin ` , ` vmax ` .
*
* @ type { boolean }
* /
assumeViewportIndependence : true
} ;
/ * *
* Resizes the given elements .
*
* @ param { HTMLElement [ ] } elements
* /
function resizeElements ( elements ) {
elements = elements . filter ( function ( e ) {
var codeStyles = getStyles ( e ) ;
var whiteSpace = codeStyles [ 'white-space' ] ;
return whiteSpace === 'pre-wrap' || whiteSpace === 'pre-line' ;
} ) ;
if ( elements . length == 0 ) {
return ;
}
var infos = elements . map ( function ( element ) {
var codeElement = element . querySelector ( 'code' ) ;
var lineNumbersWrapper = element . querySelector ( '.line-numbers-rows' ) ;
if ( ! codeElement || ! lineNumbersWrapper ) {
return undefined ;
}
/** @type {HTMLElement} */
var lineNumberSizer = element . querySelector ( '.line-numbers-sizer' ) ;
var codeLines = codeElement . textContent . split ( NEW _LINE _EXP ) ;
if ( ! lineNumberSizer ) {
lineNumberSizer = document . createElement ( 'span' ) ;
lineNumberSizer . className = 'line-numbers-sizer' ;
codeElement . appendChild ( lineNumberSizer ) ;
}
lineNumberSizer . innerHTML = '0' ;
lineNumberSizer . style . display = 'block' ;
var oneLinerHeight = lineNumberSizer . getBoundingClientRect ( ) . height ;
lineNumberSizer . innerHTML = '' ;
return {
element : element ,
lines : codeLines ,
lineHeights : [ ] ,
oneLinerHeight : oneLinerHeight ,
sizer : lineNumberSizer ,
} ;
} ) . filter ( Boolean ) ;
infos . forEach ( function ( info ) {
var lineNumberSizer = info . sizer ;
var lines = info . lines ;
var lineHeights = info . lineHeights ;
var oneLinerHeight = info . oneLinerHeight ;
lineHeights [ lines . length - 1 ] = undefined ;
lines . forEach ( function ( line , index ) {
if ( line && line . length > 1 ) {
var e = lineNumberSizer . appendChild ( document . createElement ( 'span' ) ) ;
e . style . display = 'block' ;
e . textContent = line ;
} else {
lineHeights [ index ] = oneLinerHeight ;
}
} ) ;
} ) ;
infos . forEach ( function ( info ) {
var lineNumberSizer = info . sizer ;
var lineHeights = info . lineHeights ;
var childIndex = 0 ;
for ( var i = 0 ; i < lineHeights . length ; i ++ ) {
if ( lineHeights [ i ] === undefined ) {
lineHeights [ i ] = lineNumberSizer . children [ childIndex ++ ] . getBoundingClientRect ( ) . height ;
}
}
} ) ;
infos . forEach ( function ( info ) {
var lineNumberSizer = info . sizer ;
var wrapper = info . element . querySelector ( '.line-numbers-rows' ) ;
lineNumberSizer . style . display = 'none' ;
lineNumberSizer . innerHTML = '' ;
info . lineHeights . forEach ( function ( height , lineNumber ) {
wrapper . children [ lineNumber ] . style . height = height + 'px' ;
} ) ;
} ) ;
}
/ * *
* Returns style declarations for the element
*
* @ param { Element } element
* /
function getStyles ( element ) {
if ( ! element ) {
return null ;
}
return window . getComputedStyle ? getComputedStyle ( element ) : ( element . currentStyle || null ) ;
}
var lastWidth = undefined ;
window . addEventListener ( 'resize' , function ( ) {
if ( config . assumeViewportIndependence && lastWidth === window . innerWidth ) {
return ;
}
lastWidth = window . innerWidth ;
resizeElements ( Array . prototype . slice . call ( document . querySelectorAll ( 'pre.' + PLUGIN _NAME ) ) ) ;
} ) ;
Prism . hooks . add ( 'complete' , function ( env ) {
if ( ! env . code ) {
return ;
}
var code = /** @type {Element} */ ( env . element ) ;
var pre = /** @type {HTMLElement} */ ( code . parentNode ) ;
// works only for <code> wrapped inside <pre> (not inline)
if ( ! pre || ! /pre/i . test ( pre . nodeName ) ) {
return ;
}
// Abort if line numbers already exists
if ( code . querySelector ( '.line-numbers-rows' ) ) {
return ;
}
// only add line numbers if <code> or one of its ancestors has the `line-numbers` class
if ( ! Prism . util . isActive ( code , PLUGIN _NAME ) ) {
return ;
}
// Remove the class 'line-numbers' from the <code>
code . classList . remove ( PLUGIN _NAME ) ;
// Add the class 'line-numbers' to the <pre>
pre . classList . add ( PLUGIN _NAME ) ;
var match = env . code . match ( NEW _LINE _EXP ) ;
var linesNum = match ? match . length + 1 : 1 ;
var lineNumbersWrapper ;
var lines = new Array ( linesNum + 1 ) . join ( '<span></span>' ) ;
lineNumbersWrapper = document . createElement ( 'span' ) ;
lineNumbersWrapper . setAttribute ( 'aria-hidden' , 'true' ) ;
lineNumbersWrapper . className = 'line-numbers-rows' ;
lineNumbersWrapper . innerHTML = lines ;
if ( pre . hasAttribute ( 'data-start' ) ) {
pre . style . counterReset = 'linenumber ' + ( parseInt ( pre . getAttribute ( 'data-start' ) , 10 ) - 1 ) ;
}
env . element . appendChild ( lineNumbersWrapper ) ;
resizeElements ( [ pre ] ) ;
Prism . hooks . run ( 'line-numbers' , env ) ;
} ) ;
Prism . hooks . add ( 'line-numbers' , function ( env ) {
env . plugins = env . plugins || { } ;
env . plugins . lineNumbers = true ;
} ) ;
} ( ) ) ;
/***/ } ) ,
/* 4 */
/***/ ( function ( ) {
( function ( ) {
if ( typeof Prism === 'undefined' || typeof document === 'undefined' ) {
return ;
}
var callbacks = [ ] ;
var map = { } ;
var noop = function ( ) { } ;
Prism . plugins . toolbar = { } ;
/ * *
* @ typedef ButtonOptions
* @ property { string } text The text displayed .
* @ property { string } [ url ] The URL of the link which will be created .
* @ property { Function } [ onClick ] The event listener for the ` click ` event of the created button .
* @ property { string } [ className ] The class attribute to include with element .
* /
/ * *
* Register a button callback with the toolbar .
*
* @ param { string } key
* @ param { ButtonOptions | Function } opts
* /
var registerButton = Prism . plugins . toolbar . registerButton = function ( key , opts ) {
var callback ;
if ( typeof opts === 'function' ) {
callback = opts ;
} else {
callback = function ( env ) {
var element ;
if ( typeof opts . onClick === 'function' ) {
element = document . createElement ( 'button' ) ;
element . type = 'button' ;
element . addEventListener ( 'click' , function ( ) {
opts . onClick . call ( this , env ) ;
} ) ;
} else if ( typeof opts . url === 'string' ) {
element = document . createElement ( 'a' ) ;
element . href = opts . url ;
} else {
element = document . createElement ( 'span' ) ;
}
if ( opts . className ) {
element . classList . add ( opts . className ) ;
}
element . textContent = opts . text ;
return element ;
} ;
}
if ( key in map ) {
console . warn ( 'There is a button with the key "' + key + '" registered already.' ) ;
return ;
}
callbacks . push ( map [ key ] = callback ) ;
} ;
/ * *
* Returns the callback order of the given element .
*
* @ param { HTMLElement } element
* @ returns { string [ ] | undefined }
* /
function getOrder ( element ) {
while ( element ) {
var order = element . getAttribute ( 'data-toolbar-order' ) ;
if ( order != null ) {
order = order . trim ( ) ;
if ( order . length ) {
return order . split ( /\s*,\s*/g ) ;
} else {
return [ ] ;
}
}
element = element . parentElement ;
}
}
/ * *
* Post - highlight Prism hook callback .
*
* @ param env
* /
var hook = Prism . plugins . toolbar . hook = function ( env ) {
// Check if inline or actual code block (credit to line-numbers plugin)
var pre = env . element . parentNode ;
if ( ! pre || ! /pre/i . test ( pre . nodeName ) ) {
return ;
}
// Autoloader rehighlights, so only do this once.
if ( pre . parentNode . classList . contains ( 'code-toolbar' ) ) {
return ;
}
// Create wrapper for <pre> to prevent scrolling toolbar with content
var wrapper = document . createElement ( 'div' ) ;
wrapper . classList . add ( 'code-toolbar' ) ;
pre . parentNode . insertBefore ( wrapper , pre ) ;
wrapper . appendChild ( pre ) ;
// Setup the toolbar
var toolbar = document . createElement ( 'div' ) ;
toolbar . classList . add ( 'toolbar' ) ;
// order callbacks
var elementCallbacks = callbacks ;
var order = getOrder ( env . element ) ;
if ( order ) {
elementCallbacks = order . map ( function ( key ) {
return map [ key ] || noop ;
} ) ;
}
elementCallbacks . forEach ( function ( callback ) {
var element = callback ( env ) ;
if ( ! element ) {
return ;
}
var item = document . createElement ( 'div' ) ;
item . classList . add ( 'toolbar-item' ) ;
item . appendChild ( element ) ;
toolbar . appendChild ( item ) ;
} ) ;
// Add our toolbar to the currently created wrapper of <pre> tag
wrapper . appendChild ( toolbar ) ;
} ;
registerButton ( 'label' , function ( env ) {
var pre = env . element . parentNode ;
if ( ! pre || ! /pre/i . test ( pre . nodeName ) ) {
return ;
}
if ( ! pre . hasAttribute ( 'data-label' ) ) {
return ;
}
var element ; var template ;
var text = pre . getAttribute ( 'data-label' ) ;
try {
// Any normal text will blow up this selector.
template = document . querySelector ( 'template#' + text ) ;
} catch ( e ) { /* noop */ }
if ( template ) {
element = template . content ;
} else {
if ( pre . hasAttribute ( 'data-url' ) ) {
element = document . createElement ( 'a' ) ;
element . href = pre . getAttribute ( 'data-url' ) ;
} else {
element = document . createElement ( 'span' ) ;
}
element . textContent = text ;
}
return element ;
} ) ;
/ * *
* Register the toolbar with Prism .
* /
Prism . hooks . add ( 'complete' , hook ) ;
} ( ) ) ;
/***/ } ) ,
/* 5 */
/***/ ( function ( ) {
// https://www.json.org/json-en.html
Prism . languages . json = {
'property' : {
pattern : /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/ ,
lookbehind : true ,
greedy : true
} ,
'string' : {
pattern : /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/ ,
lookbehind : true ,
greedy : true
} ,
'comment' : {
pattern : /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/ ,
greedy : true
} ,
'number' : /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i ,
'punctuation' : /[{}[\],]/ ,
'operator' : /:/ ,
'boolean' : /\b(?:false|true)\b/ ,
'null' : {
pattern : /\bnull\b/ ,
alias : 'keyword'
}
} ;
Prism . languages . webmanifest = Prism . languages . json ;
/***/ } ) ,
/* 6 */
/***/ ( function ( ) {
( function ( Prism ) {
// TODO:
// - Add CSS highlighting inside <style> tags
// - Add support for multi-line code blocks
// - Add support for interpolation #{} and !{}
// - Add support for tag interpolation #[]
// - Add explicit support for plain text using |
// - Add support for markup embedded in plain text
Prism . languages . pug = {
// Multiline stuff should appear before the rest
// This handles both single-line and multi-line comments
'comment' : {
pattern : /(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m ,
lookbehind : true
} ,
// All the tag-related part is in lookbehind
// so that it can be highlighted by the "tag" pattern
'multiline-script' : {
pattern : /(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m ,
lookbehind : true ,
inside : Prism . languages . javascript
} ,
// See at the end of the file for known filters
'filter' : {
pattern : /(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m ,
lookbehind : true ,
inside : {
'filter-name' : {
pattern : /^:[\w-]+/ ,
alias : 'variable'
} ,
'text' : /\S[\s\S]*/ ,
}
} ,
'multiline-plain-text' : {
pattern : /(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m ,
lookbehind : true
} ,
'markup' : {
pattern : /(^[\t ]*)<.+/m ,
lookbehind : true ,
inside : Prism . languages . markup
} ,
'doctype' : {
pattern : /((?:^|\n)[\t ]*)doctype(?: .+)?/ ,
lookbehind : true
} ,
// This handle all conditional and loop keywords
'flow-control' : {
pattern : /(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m ,
lookbehind : true ,
inside : {
'each' : {
pattern : /^each .+? in\b/ ,
inside : {
'keyword' : /\b(?:each|in)\b/ ,
'punctuation' : /,/
}
} ,
'branch' : {
pattern : /^(?:case|default|else|if|unless|when|while)\b/ ,
alias : 'keyword'
} ,
rest : Prism . languages . javascript
}
} ,
'keyword' : {
pattern : /(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m ,
lookbehind : true
} ,
'mixin' : [
// Declaration
{
pattern : /(^[\t ]*)mixin .+/m ,
lookbehind : true ,
inside : {
'keyword' : /^mixin/ ,
'function' : /\w+(?=\s*\(|\s*$)/ ,
'punctuation' : /[(),.]/
}
} ,
// Usage
{
pattern : /(^[\t ]*)\+.+/m ,
lookbehind : true ,
inside : {
'name' : {
pattern : /^\+\w+/ ,
alias : 'function'
} ,
rest : Prism . languages . javascript
}
}
] ,
'script' : {
pattern : /(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m ,
lookbehind : true ,
inside : Prism . languages . javascript
} ,
'plain-text' : {
pattern : /(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m ,
lookbehind : true
} ,
'tag' : {
pattern : /(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m ,
lookbehind : true ,
inside : {
'attributes' : [
{
pattern : /&[^(]+\([^)]+\)/ ,
inside : Prism . languages . javascript
} ,
{
pattern : /\([^)]+\)/ ,
inside : {
'attr-value' : {
pattern : /(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/ ,
lookbehind : true ,
inside : Prism . languages . javascript
} ,
'attr-name' : /[\w-]+(?=\s*!?=|\s*[,)])/ ,
'punctuation' : /[!=(),]+/
}
}
] ,
'punctuation' : /:/ ,
'attr-id' : /#[\w\-]+/ ,
'attr-class' : /\.[\w\-]+/
}
} ,
'code' : [
{
pattern : /(^[\t ]*(?:-|!?=)).+/m ,
lookbehind : true ,
inside : Prism . languages . javascript
}
] ,
'punctuation' : /[.\-!=|]+/
} ;
var filter _pattern = /(^([\t ]*)):<filter_name>(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/ . source ;
// Non exhaustive list of available filters and associated languages
var filters = [
{ filter : 'atpl' , language : 'twig' } ,
{ filter : 'coffee' , language : 'coffeescript' } ,
'ejs' ,
'handlebars' ,
'less' ,
'livescript' ,
'markdown' ,
{ filter : 'sass' , language : 'scss' } ,
'stylus'
] ;
var all _filters = { } ;
for ( var i = 0 , l = filters . length ; i < l ; i ++ ) {
var filter = filters [ i ] ;
filter = typeof filter === 'string' ? { filter : filter , language : filter } : filter ;
if ( Prism . languages [ filter . language ] ) {
all _filters [ 'filter-' + filter . filter ] = {
pattern : RegExp ( filter _pattern . replace ( '<filter_name>' , function ( ) { return filter . filter ; } ) , 'm' ) ,
lookbehind : true ,
inside : {
'filter-name' : {
pattern : /^:[\w-]+/ ,
alias : 'variable'
} ,
'text' : {
pattern : /\S[\s\S]*/ ,
alias : [ filter . language , 'language-' + filter . language ] ,
inside : Prism . languages [ filter . language ]
}
}
} ;
}
}
Prism . languages . insertBefore ( 'pug' , 'filter' , all _filters ) ;
} ( Prism ) ) ;
/***/ } ) ,
/* 7 */
/***/ ( function ( ) {
( function ( Prism ) {
Prism . languages . sass = Prism . languages . extend ( 'css' , {
// Sass comments don't need to be closed, only indented
'comment' : {
pattern : /^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m ,
lookbehind : true ,
greedy : true
}
} ) ;
Prism . languages . insertBefore ( 'sass' , 'atrule' , {
// We want to consume the whole line
'atrule-line' : {
// Includes support for = and + shortcuts
pattern : /^(?:[ \t]*)[@+=].+/m ,
greedy : true ,
inside : {
'atrule' : /(?:@[\w-]+|[+=])/
}
}
} ) ;
delete Prism . languages . sass . atrule ;
var variable = /\$[-\w]+|#\{\$[-\w]+\}/ ;
var operator = [
/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/ ,
{
pattern : /(\s)-(?=\s)/ ,
lookbehind : true
}
] ;
Prism . languages . insertBefore ( 'sass' , 'property' , {
// We want to consume the whole line
'variable-line' : {
pattern : /^[ \t]*\$.+/m ,
greedy : true ,
inside : {
'punctuation' : /:/ ,
'variable' : variable ,
'operator' : operator
}
} ,
// We want to consume the whole line
'property-line' : {
pattern : /^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m ,
greedy : true ,
inside : {
'property' : [
/[^:\s]+(?=\s*:)/ ,
{
pattern : /(:)[^:\s]+/ ,
lookbehind : true
}
] ,
'punctuation' : /:/ ,
'variable' : variable ,
'operator' : operator ,
'important' : Prism . languages . sass . important
}
}
} ) ;
delete Prism . languages . sass . property ;
delete Prism . languages . sass . important ;
// Now that whole lines for other patterns are consumed,
// what's left should be selectors
Prism . languages . insertBefore ( 'sass' , 'punctuation' , {
'selector' : {
pattern : /^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m ,
lookbehind : true ,
greedy : true
}
} ) ;
} ( Prism ) ) ;
/***/ } ) ,
/* 8 */
/***/ ( function ( _ _unused _webpack _module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
/* harmony export */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , {
/* harmony export */ init : function ( ) { return /* binding */ init ; }
/* harmony export */ } ) ;
2024-09-16 16:29:32 -04:00
function _slicedToArray ( r , e ) { return _arrayWithHoles ( r ) || _iterableToArrayLimit ( r , e ) || _unsupportedIterableToArray ( r , e ) || _nonIterableRest ( ) ; }
function _nonIterableRest ( ) { throw new TypeError ( "Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." ) ; }
function _unsupportedIterableToArray ( r , a ) { if ( r ) { if ( "string" == typeof r ) return _arrayLikeToArray ( r , a ) ; var t = { } . toString . call ( r ) . slice ( 8 , - 1 ) ; return "Object" === t && r . constructor && ( t = r . constructor . name ) , "Map" === t || "Set" === t ? Array . from ( r ) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/ . test ( t ) ? _arrayLikeToArray ( r , a ) : void 0 ; } }
function _arrayLikeToArray ( r , a ) { ( null == a || a > r . length ) && ( a = r . length ) ; for ( var e = 0 , n = Array ( a ) ; e < a ; e ++ ) n [ e ] = r [ e ] ; return n ; }
function _iterableToArrayLimit ( r , l ) { var t = null == r ? null : "undefined" != typeof Symbol && r [ Symbol . iterator ] || r [ "@@iterator" ] ; if ( null != t ) { var e , n , i , u , a = [ ] , f = ! 0 , o = ! 1 ; try { if ( i = ( t = t . call ( r ) ) . next , 0 === l ) { if ( Object ( t ) !== t ) return ; f = ! 1 ; } else for ( ; ! ( f = ( e = i . call ( t ) ) . done ) && ( a . push ( e . value ) , a . length !== l ) ; f = ! 0 ) ; } catch ( r ) { o = ! 0 , n = r ; } finally { try { if ( ! f && null != t . return && ( u = t . return ( ) , Object ( u ) !== u ) ) return ; } finally { if ( o ) throw n ; } } return a ; } }
function _arrayWithHoles ( r ) { if ( Array . isArray ( r ) ) return r ; }
2024-07-14 16:18:52 -04:00
//- DS2 core (c) 2024 Alexander McIlwraith
//- Licensed under CC BY-SA 4.0
2024-09-16 16:29:32 -04:00
var font = {
size : 0
} ;
var pos = {
x : 0 ,
y : 0
} ;
2024-07-14 16:18:52 -04:00
function drag ( sticky ) {
2024-09-16 16:29:32 -04:00
sticky . onmousedown = function ( event ) {
// get the position within the sticky
pos . x = event . clientX - sticky . offsetLeft ;
pos . y = event . clientY - sticky . offsetTop ;
// on mouse move, move the sticky to the position, minus the offset, of the mouse
document . onmousemove = function ( documentEvent ) {
sticky . style . top = documentEvent . clientY - pos . y + 'px' ;
sticky . style . left = documentEvent . clientX - pos . x + 'px' ;
sticky . setAttribute ( "moved" , "true" ) ;
} ;
// when done, remove mouse move and mouse up handlers.
document . onmouseup = function ( ) {
document . onmouseup = null ;
document . onmousemove = null ;
} ;
} ;
2024-07-14 16:18:52 -04:00
}
function waitForElement ( selector ) {
2024-09-16 16:29:32 -04:00
return new Promise ( function ( resolve ) {
if ( document . querySelector ( selector ) ) {
return resolve ( document . querySelector ( selector ) ) ;
}
var observer = new MutationObserver ( function ( mutations ) {
if ( document . querySelector ( selector ) ) {
observer . disconnect ( ) ;
resolve ( document . querySelector ( selector ) ) ;
}
2024-07-14 16:18:52 -04:00
} ) ;
2024-09-16 16:29:32 -04:00
// If you get "parameter 1 is not of type 'Node'" error, see https://stackoverflow.com/a/77855838/492336
observer . observe ( document . body , {
childList : true ,
subtree : true
} ) ;
} ) ;
2024-07-14 16:18:52 -04:00
}
2024-09-16 16:29:32 -04:00
var checkBottom = function checkBottom ( attach ) {
// check if top or bottom
if ( attach . y < 0 ) {
attach . ys = "bottom" ;
attach . y = attach . y * - 1 ;
}
} ;
var setStickyPostions = function setStickyPostions ( s , attach ) {
// set
s . style [ attach . ys ] = "" . concat ( attach . y , "px" ) ;
s . style [ attach . xs ] = "" . concat ( attach . x , "px" ) ;
s . style . display = "grid" ;
} ;
var css = function css ( el , attr ) {
var st = "" ;
Object . entries ( attr ) . forEach ( function ( val ) {
var _val = _slicedToArray ( val , 2 ) ,
key = _val [ 0 ] ,
value = _val [ 1 ] ;
st += "" . concat ( key , ": " ) . concat ( value , "; " ) ;
} ) ;
el . setAttribute ( "style" , st . trim ( ) ) ;
} ;
var calculateStickyPosition = function calculateStickyPosition ( s ) {
var float = s . getAttribute ( "float" ) ;
var p = s . parentNode . getBoundingClientRect ( ) ;
switch ( float ) {
case "left" :
css ( s , {
left : p . left * - 1 + "px"
} ) ;
break ;
case "right" :
css ( s , {
left : Math . max ( document . documentElement . clientWidth || 0 , window . innerWidth || 0 ) - p . left - s . offsetWidth - font . size * 2 + "px"
} ) ;
break ;
}
var offset = s . getAttribute ( "offset" ) ;
if ( offset !== null ) {
offset = offset . trim ( ) . split ( " " ) ;
css ( s , {
top : offset [ 0 ] ,
left : offset [ 1 ]
} ) ;
}
} ;
function init ( ) {
var p = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : document ;
font . size = parseFloat ( getComputedStyle ( document . documentElement ) . fontSize . replace ( "px" , "" ) ) ;
p . querySelectorAll ( "sticky-note" ) . forEach ( function ( s ) {
if ( s . querySelectorAll ( "svg" ) . length == 0 ) {
var wrapper = document . createElement ( "sticky-note-wrapper" ) ;
s . parentNode . insertBefore ( wrapper , s ) ;
wrapper . appendChild ( s ) ;
s . setAttribute ( "content" , s . innerHTML . replace ( /"/g , "\"" ) ) ;
s . innerHTML = "<div><svg width='0' height='0'><defs><clipPath id='stickyClip' clipPathUnits='objectBoundingBox'><path d='M 0 0 Q 0 0.69, 0.03 0.96 0.03 0.96, 1 0.96 Q 0.96 0.69, 0.96 0 0.96 0, 0 0' stroke-linejoin='round' stroke-linecap='square' /></clipPath></defs></svg></div><div><div>" . concat ( s . innerHTML , "</div></div>" ) ;
}
calculateStickyPosition ( s ) ;
drag ( s ) ;
s . ondblclick = function ( e ) {
if ( e . ctrlKey ) {
calculateStickyPosition ( s ) ;
} else {
// add one click select
}
} ;
} ) ;
window . onresize = function ( ) {
font . size = parseFloat ( getComputedStyle ( document . documentElement ) . fontSize . replace ( "px" , "" ) ) ;
var stickies = p . querySelectorAll ( "sticky-note" ) ;
stickies . forEach ( function ( s ) {
calculateStickyPosition ( s ) ;
} ) ;
} ;
2024-07-14 16:18:52 -04:00
}
/***/ } ) ,
/* 9 */
/***/ ( function ( module ) {
//- DS2 core (c) 2024 Alexander McIlwraith
//- Licensed under CC BY-SA 4.0
function flip ( e ) {
2024-09-16 16:29:32 -04:00
var sw = e . currentTarget ;
switch ( sw . getAttribute ( "aria-checked" ) ) {
case "true" :
sw . setAttribute ( "aria-checked" , "false" ) ;
break ;
case "false" :
sw . setAttribute ( "aria-checked" , "true" ) ;
break ;
}
2024-07-14 16:18:52 -04:00
}
2024-09-16 16:29:32 -04:00
;
module . exports = {
init : function init ( ) {
var p = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : document ;
2024-10-18 18:19:40 -04:00
try {
p . querySelectorAll ( "[role='switch']" ) . forEach ( function ( sw ) {
sw . innerHTML = "<span></span>" ;
sw . setAttribute ( "aria-checked" , "false" ) ;
sw . setAttribute ( "tabindex" , "0" ) ;
sw . addEventListener ( "click" , flip , false ) ;
sw . addEventListener ( "keypress" , flip , false ) ;
} ) ;
} catch ( e ) {
console . warn ( "Cannot initialise switches." , e ) ;
}
2024-09-16 16:29:32 -04:00
}
} ;
2024-07-14 16:18:52 -04:00
/***/ } ) ,
/* 10 */
/***/ ( function ( _ _unused _webpack _module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
/* harmony export */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , {
/* harmony export */ init : function ( ) { return /* binding */ init ; }
/* harmony export */ } ) ;
/ * D S 2 c o r e ( c ) 2 0 2 4 A l e x a n d e r M c I l w r a i t h
2024-09-03 17:55:37 -04:00
Released under Creative Commons Attribution - ShareAlike 4.0 International
2024-07-14 16:18:52 -04:00
* /
2024-09-03 17:55:37 -04:00
// create a pure JS mouse click event
2024-09-16 16:29:32 -04:00
var click = new MouseEvent ( 'click' , {
view : window ,
bubbles : false ,
cancelable : true
2024-09-03 17:55:37 -04:00
} ) ;
2025-01-30 22:57:18 -05:00
var waitForElement = function waitForElement ( selector ) {
return new Promise ( function ( resolve ) {
if ( document . querySelector ( selector ) ) {
return resolve ( document . querySelector ( selector ) ) ;
}
var observer = new MutationObserver ( function ( mutations ) {
if ( document . querySelector ( selector ) ) {
observer . disconnect ( ) ;
resolve ( document . querySelector ( selector ) ) ;
}
} ) ;
// If you get "parameter 1 is not of type 'Node'" error, see https://stackoverflow.com/a/77855838/492336
observer . observe ( document . body , {
childList : true ,
subtree : true
} ) ;
} ) ;
} ;
2024-09-16 16:29:32 -04:00
function init ( ) {
2025-01-30 22:57:18 -05:00
var container = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : document ;
var spacer = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : true ;
var args = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : { } ;
container . querySelectorAll ( ".tab-group, tabset" ) . forEach ( function ( tabGroup ) {
2024-09-16 16:29:32 -04:00
if ( tabGroup . querySelector ( "[role=tablist]" ) === null ) {
var tabgroup = tabGroup . getAttribute ( "id" ) ;
var tablist = "" ;
Array . from ( tabGroup . children ) . forEach ( function ( child ) {
var tab = child . getAttribute ( "tab" ) || child . getAttribute ( "data-tab" ) ;
if ( tab !== null ) {
var tabID = tab . replace ( /\W+/g , "-" ) . toLowerCase ( ) ;
var tabPanel = document . createElement ( 'div' ) ;
tabPanel . id = "tab-panel-" . concat ( tabgroup , "-" ) . concat ( tabID ) ;
tabPanel . className = tablist === "" ? "open" : "" ;
tabPanel . setAttribute ( "role" , "tabpanel" ) ;
tabPanel . setAttribute ( "tabindex" , "0" ) ;
tabPanel . setAttribute ( "aria-labelledby" , "tab-" . concat ( tabgroup , "-" ) . concat ( tabID ) ) ;
tabPanel . appendChild ( child . cloneNode ( true ) ) ;
child . parentNode . replaceChild ( tabPanel , child ) ;
tablist += "<li tabindex=\"0\" role=\"tab\" " . concat ( tablist === "" ? "class='selected'" : "" , " id=\"tab-" ) . concat ( tabgroup , "-" ) . concat ( tabID , "\"><span>" ) . concat ( tab , "</span></li>" ) ;
} else {
child . classList . add ( "tab-hidden" ) ;
}
} ) ;
var ul = document . createElement ( 'ul' ) ;
ul . setAttribute ( "role" , "tablist" ) ;
2025-01-30 22:57:18 -05:00
ul . innerHTML = spacer != true ? "" . concat ( tablist ) : "" . concat ( tablist , "<li role=\"separator\" class=\"separator\"></li>" ) ;
2024-09-16 16:29:32 -04:00
tabGroup . insertBefore ( ul , tabGroup . firstChild ) ;
tabGroup . querySelectorAll ( '[role="tab"]' ) . forEach ( function ( tab ) {
2025-01-30 22:57:18 -05:00
tab . addEventListener ( "click" , function ( e ) {
if ( e . altKey && typeof args . altModifier == "function" ) {
args . altModifier ( tab ) ;
} else if ( e . shiftKey && typeof args . shiftModifier == "function" ) {
args . shiftModifier ( tab ) ;
} else if ( e . metaKey && typeof args . metaModifier == "function" ) {
args . metaModifier ( tab ) ;
} else {
var siblings = Array . from ( tab . parentNode . children ) ;
siblings . forEach ( function ( sibling ) {
return sibling . classList . remove ( "selected" ) ;
} ) ;
tab . classList . add ( "selected" ) ;
var tabPanels = Array . from ( tab . parentNode . parentNode . children ) . filter ( function ( child ) {
return child . getAttribute ( "role" ) === "tabpanel" ;
} ) ;
tabPanels . forEach ( function ( panel ) {
return panel . classList . remove ( "open" ) ;
} ) ;
var tabPanelId = tab . getAttribute ( "id" ) . replace ( "tab" , "tab-panel" ) ;
document . getElementById ( tabPanelId ) . classList . add ( "open" ) ;
}
2024-09-16 16:29:32 -04:00
} ) ;
tab . addEventListener ( "keypress" , function ( e ) {
e . preventDefault ( ) ;
if ( e . which == 32 || e . which == 13 ) {
e . currentTarget . dispatchEvent ( click ) ;
}
} ) ;
} ) ;
}
2025-01-11 13:03:27 -05:00
if ( document . location . hash != "" && document . location . hash . substring ( 0 , 5 ) == "#tab-" ) {
2025-01-30 22:57:18 -05:00
waitForElement ( document . location . hash ) . then ( function ( el ) {
el . scrollIntoView ( ) ;
el . dispatchEvent ( click ) ;
} ) ;
2025-01-11 13:03:27 -05:00
}
2024-09-16 16:29:32 -04:00
} ) ;
2024-07-14 16:18:52 -04:00
}
/***/ } )
/******/ ] ) ;
/************************************************************************/
/******/ // The module cache
/******/ var _ _webpack _module _cache _ _ = { } ;
/******/
/******/ // The require function
/******/ function _ _webpack _require _ _ ( moduleId ) {
/******/ // Check if module is in cache
/******/ var cachedModule = _ _webpack _module _cache _ _ [ moduleId ] ;
/******/ if ( cachedModule !== undefined ) {
/******/ return cachedModule . exports ;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = _ _webpack _module _cache _ _ [ moduleId ] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports : { }
/******/ } ;
/******/
/******/ // Execute the module function
/******/ _ _webpack _modules _ _ [ moduleId ] ( module , module . exports , _ _webpack _require _ _ ) ;
/******/
/******/ // Return the exports of the module
/******/ return module . exports ;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ ! function ( ) {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ _ _webpack _require _ _ . n = function ( module ) {
/******/ var getter = module && module . _ _esModule ?
/******/ function ( ) { return module [ 'default' ] ; } :
/******/ function ( ) { return module ; } ;
/******/ _ _webpack _require _ _ . d ( getter , { a : getter } ) ;
/******/ return getter ;
/******/ } ;
/******/ } ( ) ;
/******/
/******/ /* webpack/runtime/define property getters */
/******/ ! function ( ) {
/******/ // define getter functions for harmony exports
/******/ _ _webpack _require _ _ . d = function ( exports , definition ) {
/******/ for ( var key in definition ) {
/******/ if ( _ _webpack _require _ _ . o ( definition , key ) && ! _ _webpack _require _ _ . o ( exports , key ) ) {
/******/ Object . defineProperty ( exports , key , { enumerable : true , get : definition [ key ] } ) ;
/******/ }
/******/ }
/******/ } ;
/******/ } ( ) ;
/******/
/******/ /* webpack/runtime/global */
/******/ ! function ( ) {
/******/ _ _webpack _require _ _ . g = ( function ( ) {
/******/ if ( typeof globalThis === 'object' ) return globalThis ;
/******/ try {
/******/ return this || new Function ( 'return this' ) ( ) ;
/******/ } catch ( e ) {
/******/ if ( typeof window === 'object' ) return window ;
/******/ }
/******/ } ) ( ) ;
/******/ } ( ) ;
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ ! function ( ) {
/******/ _ _webpack _require _ _ . o = function ( obj , prop ) { return Object . prototype . hasOwnProperty . call ( obj , prop ) ; }
/******/ } ( ) ;
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ ! function ( ) {
/******/ // define __esModule on exports
/******/ _ _webpack _require _ _ . r = function ( exports ) {
/******/ if ( typeof Symbol !== 'undefined' && Symbol . toStringTag ) {
/******/ Object . defineProperty ( exports , Symbol . toStringTag , { value : 'Module' } ) ;
/******/ }
/******/ Object . defineProperty ( exports , '__esModule' , { value : true } ) ;
/******/ } ;
/******/ } ( ) ;
/******/
/************************************************************************/
var _ _webpack _exports _ _ = { } ;
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
! function ( ) {
"use strict" ;
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
/* harmony import */ var _core _core _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ = _ _webpack _require _ _ ( 1 ) ;
/* harmony import */ var _core _core _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _core _core _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ ) ;
/* harmony import */ var _node _modules _prismjs _prism _ _WEBPACK _IMPORTED _MODULE _1 _ _ = _ _webpack _require _ _ ( 2 ) ;
/* harmony import */ var _node _modules _prismjs _prism _ _WEBPACK _IMPORTED _MODULE _1 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _node _modules _prismjs _prism _ _WEBPACK _IMPORTED _MODULE _1 _ _ ) ;
/* harmony import */ var _node _modules _prismjs _plugins _line _numbers _prism _line _numbers _ _WEBPACK _IMPORTED _MODULE _2 _ _ = _ _webpack _require _ _ ( 3 ) ;
/* harmony import */ var _node _modules _prismjs _plugins _line _numbers _prism _line _numbers _ _WEBPACK _IMPORTED _MODULE _2 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _node _modules _prismjs _plugins _line _numbers _prism _line _numbers _ _WEBPACK _IMPORTED _MODULE _2 _ _ ) ;
/* harmony import */ var _node _modules _prismjs _plugins _toolbar _prism _toolbar _ _WEBPACK _IMPORTED _MODULE _3 _ _ = _ _webpack _require _ _ ( 4 ) ;
/* harmony import */ var _node _modules _prismjs _plugins _toolbar _prism _toolbar _ _WEBPACK _IMPORTED _MODULE _3 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _node _modules _prismjs _plugins _toolbar _prism _toolbar _ _WEBPACK _IMPORTED _MODULE _3 _ _ ) ;
/* harmony import */ var _node _modules _prismjs _components _prism _json _ _WEBPACK _IMPORTED _MODULE _4 _ _ = _ _webpack _require _ _ ( 5 ) ;
/* harmony import */ var _node _modules _prismjs _components _prism _json _ _WEBPACK _IMPORTED _MODULE _4 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _node _modules _prismjs _components _prism _json _ _WEBPACK _IMPORTED _MODULE _4 _ _ ) ;
/* harmony import */ var _node _modules _prismjs _components _prism _pug _ _WEBPACK _IMPORTED _MODULE _5 _ _ = _ _webpack _require _ _ ( 6 ) ;
/* harmony import */ var _node _modules _prismjs _components _prism _pug _ _WEBPACK _IMPORTED _MODULE _5 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _node _modules _prismjs _components _prism _pug _ _WEBPACK _IMPORTED _MODULE _5 _ _ ) ;
/* harmony import */ var _node _modules _prismjs _components _prism _sass _ _WEBPACK _IMPORTED _MODULE _6 _ _ = _ _webpack _require _ _ ( 7 ) ;
/* harmony import */ var _node _modules _prismjs _components _prism _sass _ _WEBPACK _IMPORTED _MODULE _6 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _node _modules _prismjs _components _prism _sass _ _WEBPACK _IMPORTED _MODULE _6 _ _ ) ;
/* harmony import */ var _pg _patterns _core _sticky _note _sticky _note _js _ _WEBPACK _IMPORTED _MODULE _7 _ _ = _ _webpack _require _ _ ( 8 ) ;
/* harmony import */ var _pg _patterns _core _switch _switch _js _ _WEBPACK _IMPORTED _MODULE _8 _ _ = _ _webpack _require _ _ ( 9 ) ;
/* harmony import */ var _pg _patterns _core _switch _switch _js _ _WEBPACK _IMPORTED _MODULE _8 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _pg _patterns _core _switch _switch _js _ _WEBPACK _IMPORTED _MODULE _8 _ _ ) ;
/* harmony import */ var _pg _patterns _core _tabs _tabs _js _ _WEBPACK _IMPORTED _MODULE _9 _ _ = _ _webpack _require _ _ ( 10 ) ;
// core and prism
// import pattern stuff.
2025-01-30 22:57:18 -05:00
// init c
2024-07-14 16:18:52 -04:00
_core _core _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . init ( {
2024-09-16 16:29:32 -04:00
success : function success ( a ) {
2025-01-30 22:57:18 -05:00
_pg _patterns _core _tabs _tabs _js _ _WEBPACK _IMPORTED _MODULE _9 _ _ . init ( a , true , {
shiftModifier : _core _core _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . getTabPath
} ) ;
2024-09-16 16:29:32 -04:00
_pg _patterns _core _switch _switch _js _ _WEBPACK _IMPORTED _MODULE _8 _ _ . init ( a ) ;
_pg _patterns _core _sticky _note _sticky _note _js _ _WEBPACK _IMPORTED _MODULE _7 _ _ . init ( a ) ;
} ,
notFound : function notFound ( a , path ) {
a . innerHTML = "" . concat ( a . innerHTML , "<div class='notification-box error'><p>This pattern appears to be missing.<br><small>(" ) . concat ( path , " returned http status 404)</small></p></div>" ) ;
}
2024-07-14 16:18:52 -04:00
} ) ;
// deprecated switch handler
2024-09-16 16:29:32 -04:00
var flipInfoSwitch = function flipInfoSwitch ( e ) {
var s = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : e . currentTarget ;
switch ( s . getAttribute ( "id" ) ) {
case "deprecated" :
_core _core _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . cookie . set ( "show-deprecated" , s . getAttribute ( "aria-checked" ) , 30 , "/" ) ;
document . querySelector ( "main" ) . querySelectorAll ( "article[data-status=deprecated]" ) . forEach ( function ( a ) {
a . classList [ s . getAttribute ( "aria-checked" ) == "true" ? "add" : "remove" ] ( "show-deprecated" ) ;
} ) ;
break ;
case "breakpoints" :
_core _core _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . cookie . set ( "show-breakpoints" , s . getAttribute ( "aria-checked" ) , 30 , "/" ) ;
document . querySelector ( "html" ) . classList [ s . getAttribute ( "aria-checked" ) == "true" ? "add" : "remove" ] ( "show-breakpoints" ) ;
break ;
}
} ;
2024-07-14 16:18:52 -04:00
// create a pure JS mouse click event
2024-09-16 16:29:32 -04:00
var click = new MouseEvent ( 'click' , {
view : window ,
bubbles : false ,
cancelable : true
2024-07-14 16:18:52 -04:00
} ) ;
// get the switch, initialize it and add the handler
2024-09-16 16:29:32 -04:00
var switches = document . querySelector ( ".info-switches" ) ;
2024-07-16 03:44:48 -04:00
_pg _patterns _core _switch _switch _js _ _WEBPACK _IMPORTED _MODULE _8 _ _ . init ( switches ) ;
2024-09-16 16:29:32 -04:00
var deprecated = document . querySelector ( "#deprecated" ) ;
var breakpoints = document . querySelector ( "#breakpoints" ) ;
2024-07-16 03:44:48 -04:00
deprecated . onclick = flipInfoSwitch ;
deprecated . keypress = flipInfoSwitch ;
breakpoints . onclick = flipInfoSwitch ;
breakpoints . keypress = flipInfoSwitch ;
2024-07-14 16:18:52 -04:00
// check a cookie to get the switch's state
if ( _core _core _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . cookie . get ( "show-deprecated" ) == "true" ) {
2024-09-16 16:29:32 -04:00
deprecated . dispatchEvent ( click ) ;
2024-07-14 16:18:52 -04:00
}
2024-07-16 03:44:48 -04:00
if ( _core _core _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . cookie . get ( "show-breakpoints" ) == "true" ) {
2024-09-16 16:29:32 -04:00
breakpoints . dispatchEvent ( click ) ;
2024-07-16 03:44:48 -04:00
}
2024-07-14 16:18:52 -04:00
// just for fun... We'll show deprecated if they match the path
// document.querySelector(`#${core.url.p.replace(/\//g, "-")}`).classList.add("show-deprecated");
} ( ) ;
/******/ } ) ( )
;