diff --git a/.eslintignore b/.eslintignore index c279076..6237c4e 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,5 @@ node_modules/** **/*.css **/*.html +dist/** +webpack.* diff --git a/.eslintrc b/.eslintrc index 5964789..3611841 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,6 +1,9 @@ { - "parser": "babel-eslint", - "extends": "airbnb", + "parser": "@babel/eslint-parser", + "extends": [ + "@standardnotes/eslint-config-extensions", + "plugin:react/recommended" + ], "env": { "browser": true, "node": true @@ -12,10 +15,6 @@ "jsx": true } }, - "globals": { - "window": true, - "document": true - }, "rules": { "arrow-parens": 0, "class-methods-use-this": 0, diff --git a/README.md b/README.md index 047622a..88e0a5e 100644 --- a/README.md +++ b/README.md @@ -123,12 +123,12 @@ The instructions for local setup can be found [here](https://docs.standardnotes. 1. Fork the [repository](https://github.com/sn-extensions/markdown-basic) on GitHub 2. [Clone](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) your fork of the repository 3. Type `cd markdown-basic` -4. Run `npm install` to locally install the packages in `package.json` +4. Run `yarn` to locally install the packages in `package.json` 5. Create `ext.json` as shown [here](https://docs.standardnotes.org/extensions/local-setup) with `url: "http://localhost:8004/dist/index.html"`. Optionally, create your `ext.json` as a copy of `ext.json.sample`. -6. Install http-server using `sudo npm install -g http-server` -7. Start the server at `http://localhost:8004` using `npm run server` +6. Install `http-server` using `yarn global add http-server` or `npm install -g http-server` +7. Start the server at `http://localhost:8004` using `http-server . --cors -p 8004` 8. Import the extension into the [web](https://app.standardnotes.org) or [desktop](https://standardnotes.org/download) app with `http://localhost:8004/ext.json`. -9. To build the editor, open another command window and run `npm run build`. For live builds, use `npm run watch`. You can also run `npm run start` and open the editor at `http://localhost:8080`. +9. To build the editor, open another command window and run `yarn build` or `npm run build`. For live builds, use `yarn watch` or `npm run watch`. You can also run `yarn start` or `npm run start` and open the editor at `http://localhost:8080`. ## Further Resources diff --git a/app/components/Home.js b/app/components/Home.js index 54f2184..1387031 100644 --- a/app/components/Home.js +++ b/app/components/Home.js @@ -1,5 +1,5 @@ import React from 'react'; -import ComponentManager from 'sn-components-api'; +import ComponentRelay from '@standardnotes/component-relay'; const MarkdownIt = require('markdown-it'); const EditMode = 0; @@ -12,18 +12,18 @@ export default class Home extends React.Component { super(props); this.modes = [ - { mode: EditMode, label: "Edit", css: "edit" }, - { mode: SplitMode, label: "Split", css: "split" }, - { mode: PreviewMode, label: "Preview", css: "preview" }, + { mode: EditMode, label: 'Edit', css: 'edit' }, + { mode: SplitMode, label: 'Split', css: 'split' }, + { mode: PreviewMode, label: 'Preview', css: 'preview' }, ]; this.state = { mode: this.modes[0] }; } componentDidMount() { - this.simpleMarkdown = document.getElementById("simple-markdown"); - this.editor = document.getElementById("editor"); - this.preview = document.getElementById("preview"); + this.simpleMarkdown = document.getElementById('simple-markdown'); + this.editor = document.getElementById('editor'); + this.preview = document.getElementById('preview'); this.configureMarkdown(); this.connectToBridge(); @@ -40,9 +40,9 @@ export default class Home extends React.Component { ]; } - componentWillUpdate(nextProps, nextState) { - var prevMode = this.state.mode.mode; - var nextMode = nextState.mode.mode; + UNSAFE_componentWillUpdate(nextProps, nextState) { + let prevMode = this.state.mode.mode; + let nextMode = nextState.mode.mode; // If we changed to Split mode we add the scroll listeners if (prevMode !== nextMode) { @@ -55,7 +55,7 @@ export default class Home extends React.Component { } setModeFromModeValue(value) { - for (var mode of this.modes) { + for (let mode of this.modes) { if (mode.mode == value) { this.setState({ mode: mode }); return; @@ -66,7 +66,7 @@ export default class Home extends React.Component { changeMode(mode) { this.setState({ mode: mode }); if (this.note) { - this.componentManager.setComponentDataValueForKey("mode", mode.mode); + this.componentRelay.setComponentDataValueForKey('mode', mode.mode); } } @@ -82,13 +82,13 @@ export default class Home extends React.Component { .use(require('markdown-it-highlightjs')); // Remember old renderer, if overriden, or proxy to default renderer - const defaultRender = this.markdown.renderer.rules.link_open || function (tokens, idx, options, env, self) { + const defaultRender = this.markdown.renderer.rules.link_open || ((tokens, idx, options, env, self) => { return self.renderToken(tokens, idx, options); - }; + }); - this.markdown.renderer.rules.link_open = function (tokens, idx, options, env, self) { + this.markdown.renderer.rules.link_open = ((tokens, idx, options, env, self) => { // If you are sure other plugins can't add `target` - drop check below - var aIndex = tokens[idx].attrIndex('target'); + const aIndex = tokens[idx].attrIndex('target'); if (aIndex < 0) { tokens[idx].attrPush(['target', '_blank']); // add new attribute @@ -98,28 +98,30 @@ export default class Home extends React.Component { // pass token to default renderer. return defaultRender(tokens, idx, options, env, self); - }; + }); } connectToBridge() { - var permissions = [ + const initialPermissions = [ { - name: "stream-context-item" + name: 'stream-context-item' } - ] + ]; - this.componentManager = new ComponentManager(permissions, () => { - var savedMode = this.componentManager.componentDataValueForKey("mode"); - if (savedMode) { - this.setModeFromModeValue(savedMode); - } + this.componentRelay = new ComponentRelay({ + initialPermissions, + targetWindow: window, + onReady: () => { + const savedMode = this.componentRelay.getComponentDataValueForKey('mode'); + if (savedMode) { + this.setModeFromModeValue(savedMode); + } - this.setState({ platform: this.componentManager.platform }); + this.setState({ platform: this.componentRelay.platform }); + } }); - // this.componentManager.loggingEnabled = true; - - this.componentManager.streamContextItem((note) => { + this.componentRelay.streamContextItem((note) => { this.note = note; // Only update UI on non-metadata updates. @@ -130,7 +132,6 @@ export default class Home extends React.Component { this.editor.value = note.content.text; this.preview.innerHTML = this.markdown.render(note.content.text); }); - } truncateString(string, limit = 80) { @@ -140,31 +141,31 @@ export default class Home extends React.Component { if (string.length <= limit) { return string; } else { - return string.substring(0, limit) + "..."; + return string.substring(0, limit) + '...'; } } updatePreviewText() { - var text = this.editor.value || ""; + const text = this.editor.value || ''; this.preview.innerHTML = this.markdown.render(text); return text; } addChangeListener() { - document.getElementById("editor").addEventListener("input", (event) => { + document.getElementById('editor').addEventListener('input', () => { if (this.note) { // Be sure to capture this object as a variable, as this.note may be reassigned in `streamContextItem`, so by the time // you modify it in the presave block, it may not be the same object anymore, so the presave values will not be applied to // the right object, and it will save incorrectly. let note = this.note; - this.componentManager.saveItemWithPresave(note, () => { + this.componentRelay.saveItemWithPresave(note, () => { note.content.text = this.updatePreviewText(); note.content.preview_plain = this.truncateString(this.preview.textContent || this.preview.innerText); note.content.preview_html = null; }); } - }) + }); } addScrollListeners() { @@ -176,7 +177,7 @@ export default class Home extends React.Component { } scrollHandler = (source, destination) => { - var frameRequested; + let frameRequested; return (event) => { // Avoid the cascading effect by not handling the event if it was triggered initially by this element @@ -193,15 +194,15 @@ export default class Home extends React.Component { frameRequested = true; window.requestAnimationFrame(() => { - var target = event.target - var height = target.scrollHeight - target.clientHeight; - var ratio = parseFloat(target.scrollTop) / height; - var move = (destination.scrollHeight - destination.clientHeight) * ratio; + let target = event.target; + let height = target.scrollHeight - target.clientHeight; + let ratio = parseFloat(target.scrollTop) / height; + let move = (destination.scrollHeight - destination.clientHeight) * ratio; destination.scrollTop = move; frameRequested = false; }); - } + }; } removeSelection() { @@ -213,63 +214,57 @@ export default class Home extends React.Component { } configureResizer() { - var pressed = false; - var startWidth = this.editor.offsetWidth; - var startX; - var lastDownX; - - var columnResizer = document.getElementById("column-resizer"); - var resizerWidth = columnResizer.offsetWidth; - - var safetyOffset = 15; + let pressed = false; + const columnResizer = document.getElementById('column-resizer'); + const resizerWidth = columnResizer.offsetWidth; + const safetyOffset = 15; - columnResizer.addEventListener("mousedown", (event) => { + columnResizer.addEventListener('mousedown', () => { pressed = true; - lastDownX = event.clientX; - columnResizer.classList.add("dragging"); - this.editor.classList.add("no-selection"); - }) + columnResizer.classList.add('dragging'); + this.editor.classList.add('no-selection'); + }); - document.addEventListener("mousemove", (event) => { + document.addEventListener('mousemove', (event) => { if (!pressed) { return; } - var x = event.clientX; + let x = event.clientX; if (x < resizerWidth / 2 + safetyOffset) { x = resizerWidth / 2 + safetyOffset; } else if (x > this.simpleMarkdown.offsetWidth - resizerWidth - safetyOffset) { x = this.simpleMarkdown.offsetWidth - resizerWidth - safetyOffset; } - var colLeft = x - resizerWidth / 2; - columnResizer.style.left = colLeft + "px"; - this.editor.style.width = (colLeft - safetyOffset) + "px"; + const colLeft = x - resizerWidth / 2; + columnResizer.style.left = colLeft + 'px'; + this.editor.style.width = (colLeft - safetyOffset) + 'px'; this.removeSelection(); - }) + }); - document.addEventListener("mouseup", (event) => { + document.addEventListener('mouseup', () => { if (pressed) { pressed = false; - columnResizer.classList.remove("dragging"); - this.editor.classList.remove("no-selection"); + columnResizer.classList.remove('dragging'); + this.editor.classList.remove('no-selection'); } - }) + }); } addTabHandler() { // Tab handler - this.editor.addEventListener('keydown', function (event) { + this.editor.addEventListener('keydown', (event) => { if (!event.shiftKey && event.which == 9) { event.preventDefault(); // Using document.execCommand gives us undo support - if (!document.execCommand("insertText", false, "\t")) { + if (!document.execCommand('insertText', false, '\t')) { // document.execCommand works great on Chrome/Safari but not Firefox - var start = this.selectionStart; - var end = this.selectionEnd; - var spaces = " "; + const start = this.selectionStart; + const end = this.selectionEnd; + const spaces = ' '; // Insert 4 spaces this.value = this.value.substring(0, start) @@ -285,12 +280,12 @@ export default class Home extends React.Component { render() { return ( -
"+i(e[t].content)+"\n"},o.fence=function(e,t,n,r,o){var s,l,c,_,d=e[t],u=d.info?a(d.info).trim():"",p="";return u&&(p=u.split(/\s+/g)[0]),0===(s=n.highlight&&n.highlight(d.content,p)||i(d.content)).indexOf(""+s+"\n"):""+s+"\n"},o.image=function(e,t,n,r,a){var i=e[t];return i.attrs[i.attrIndex("alt")][1]=a.renderInlineAsText(i.children,n,r),a.renderToken(e,t,n)},o.hardbreak=function(e,t,n){return n.xhtmlOut?"=0;t--)"inline"===e.tokens[t].type&&o.test(e.tokens[t].content)&&c(e.tokens[t].children,e)}},function(e,t,n){"use strict";var r=n(9);function a(e,t,n){this.src=e,this.env=n,this.tokens=[],this.inlineMode=!1,this.md=t}a.prototype.Token=r,e.exports=a},function(e,t,n){"use strict";var r=n(8),a=[["table",n(53),["paragraph","reference"]],["code",n(54)],["fence",n(55),["paragraph","reference","blockquote","list"]],["blockquote",n(56),["paragraph","reference","blockquote","list"]],["hr",n(57),["paragraph","reference","blockquote","list"]],["list",n(58),["paragraph","reference","blockquote"]],["reference",n(59)],["heading",n(60),["paragraph","reference","blockquote"]],["lheading",n(61)],["html_block",n(62),["paragraph","reference","blockquote"]],["paragraph",n(64)]];function i(){this.ruler=new r;for(var e=0;e =4))break;a=++r}return e.line=a,(i=e.push("code_block","code",0)).content=e.getLines(t,a,4+e.blkIndent,!0),i.map=[t,e.line],!0}},function(e,t,n){"use strict";e.exports=function(e,t,n,r){var a,i,o,s,l,c,_,d=!1,u=e.bMarks[t]+e.tShift[t],p=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4)return!1;if(u+3>p)return!1;if(126!==(a=e.src.charCodeAt(u))&&96!==a)return!1;if(l=u,(i=(u=e.skipChars(u,a))-l)<3)return!1;if(_=e.src.slice(l,u),o=e.src.slice(u,p),96===a&&o.indexOf(String.fromCharCode(a))>=0)return!1;if(r)return!0;for(s=t;!(++s>=n)&&!((u=l=e.bMarks[s]+e.tShift[s])<(p=e.eMarks[s])&&e.sCount[s]=3&&":"===e[t-3]||t>=3&&"/"===e[t-3]?0:r.match(n.re.no_http)[0].length:0}},"mailto:":{validate:function(e,t,n){var r=e.slice(t);return n.re.mailto||(n.re.mailto=new RegExp("^"+n.re.src_email_name+"@"+n.re.src_host_strict,"i")),n.re.mailto.test(r)?r.match(n.re.mailto)[0].length:0}}},c="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф".split("|");function _(e){var t=e.re=n(80)(e.__opts__),r=e.__tlds__.slice();function s(e){return e.replace("%TLDS%",t.src_tlds)}e.onCompile(),e.__tlds_replaced__||r.push("a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]"),r.push(t.src_xn),t.src_tlds=r.join("|"),t.email_fuzzy=RegExp(s(t.tpl_email_fuzzy),"i"),t.link_fuzzy=RegExp(s(t.tpl_link_fuzzy),"i"),t.link_no_ip_fuzzy=RegExp(s(t.tpl_link_no_ip_fuzzy),"i"),t.host_fuzzy_test=RegExp(s(t.tpl_host_fuzzy_test),"i");var l=[];function c(e,t){throw new Error('(LinkifyIt) Invalid schema "'+e+'": '+t)}e.__compiled__={},Object.keys(e.__schemas__).forEach((function(t){var n=e.__schemas__[t];if(null!==n){var r={validate:null,link:null};if(e.__compiled__[t]=r,"[object Object]"===a(n))return!function(e){return"[object RegExp]"===a(e)}(n.validate)?i(n.validate)?r.validate=n.validate:c(t,n):r.validate=function(e){return function(t,n){var r=t.slice(n);return e.test(r)?r.match(e)[0].length:0}}(n.validate),void(i(n.normalize)?r.normalize=n.normalize:n.normalize?c(t,n):r.normalize=function(e,t){t.normalize(e)});!function(e){return"[object String]"===a(e)}(n)?c(t,n):l.push(t)}})),l.forEach((function(t){e.__compiled__[e.__schemas__[t]]&&(e.__compiled__[t].validate=e.__compiled__[e.__schemas__[t]].validate,e.__compiled__[t].normalize=e.__compiled__[e.__schemas__[t]].normalize)})),e.__compiled__[""]={validate:null,normalize:function(e,t){t.normalize(e)}};var _=Object.keys(e.__compiled__).filter((function(t){return t.length>0&&e.__compiled__[t]})).map(o).join("|");e.re.schema_test=RegExp("(^|(?!_)(?:[><|]|"+t.src_ZPCc+"))("+_+")","i"),e.re.schema_search=RegExp("(^|(?!_)(?:[><|]|"+t.src_ZPCc+"))("+_+")","ig"),e.re.pretest=RegExp("("+e.re.schema_test.source+")|("+e.re.host_fuzzy_test.source+")|@","i"),function(e){e.__index__=-1,e.__text_cache__=""}(e)}function d(e,t){var n=e.__index__,r=e.__last_index__,a=e.__text_cache__.slice(n,r);this.schema=e.__schema__.toLowerCase(),this.index=n+t,this.lastIndex=r+t,this.raw=a,this.text=a,this.url=a}function u(e,t){var n=new d(e,t);return e.__compiled__[n.schema].normalize(n,e),n}function p(e,t){if(!(this instanceof p))return new p(e,t);var n;t||(n=e,Object.keys(n||{}).reduce((function(e,t){return e||s.hasOwnProperty(t)}),!1)&&(t=e,e={})),this.__opts__=r({},s,t),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=r({},l,e),this.__compiled__={},this.__tlds__=c,this.__tlds_replaced__=!1,this.re={},_(this)}p.prototype.add=function(e,t){return this.__schemas__[e]=t,_(this),this},p.prototype.set=function(e){return this.__opts__=r(this.__opts__,e),this},p.prototype.test=function(e){if(this.__text_cache__=e,this.__index__=-1,!e.length)return!1;var t,n,r,a,i,o,s,l;if(this.re.schema_test.test(e))for((s=this.re.schema_search).lastIndex=0;null!==(t=s.exec(e));)if(a=this.testSchemaAt(e,t[2],s.lastIndex)){this.__schema__=t[2],this.__index__=t.index+t[1].length,this.__last_index__=t.index+t[0].length+a;break}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(l=e.search(this.re.host_fuzzy_test))>=0&&(this.__index__<0||lp((l-n)/(S=r+1))&&g("overflow"),n+=(s-t)*S,t=s,o=0;o
\n':'
\n')+'\n'}function s(){return"
\n=S||58!==e.src.charCodeAt(++c))return!1;if(a)return!0;for(c++,e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.refs||(e.env.footnotes.refs={}),_=e.src.slice(E+2,c-2),e.env.footnotes.refs[":"+_]=-1,(d=new e.Token("footnote_reference_open","",1)).meta={label:_},d.level=e.level++,e.tokens.push(d),i=e.bMarks[t],o=e.tShift[t],s=e.sCount[t],l=e.parentType,g=c,u=p=e.sCount[t]+c-(e.bMarks[t]+e.tShift[t]);c=s)&&(94===e.src.charCodeAt(l)&&(91===e.src.charCodeAt(l+1)&&(r=l+2,!((a=t(e,l+1))<0)&&(n||(e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.list||(e.env.footnotes.list=[]),i=e.env.footnotes.list.length,e.md.inline.parse(e.src.slice(r,a),e.md,e.env,o=[]),e.push("footnote_ref","",0).meta={id:i},e.env.footnotes.list[i]={content:e.src.slice(r,a),tokens:o}),e.pos=a+1,e.posMax=s,!0))))})),e.inline.ruler.after("footnote_inline","footnote_ref",(function(e,t){var n,r,a,i,o=e.posMax,s=e.pos;if(s+3>o)return!1;if(!e.env.footnotes||!e.env.footnotes.refs)return!1;if(91!==e.src.charCodeAt(s))return!1;if(94!==e.src.charCodeAt(s+1))return!1;for(r=s+2;r",'')};function l(e,t,n){const r=e[t],a=e[t+1];let i;if(a&&"text"===a.type){const e=/^{:?\.([^}]+)}/.exec(a.content);e&&(i=e[1],a.content=a.content.slice(e[0].length))}return`${n.highlight(r.content,i)}`}const c=(e,t)=>{var n;t=Object.assign({},c.defaults,t),(n=t.register)&&Object.entries(n).map(([e,t])=>{r.registerLanguage(e,t)}),e.options.highlight=t.auto?o:i,e.renderer.rules.fence=s(e.renderer.rules.fence),t.code&&(e.renderer.rules.code_block=s(e.renderer.rules.code_block)),t.inline&&(e.renderer.rules.code_inline=l)};c.defaults={auto:!0,code:!0,inline:!1},e.exports=c},function(e,t,n){var r=n(91);r.registerLanguage("1c",n(92)),r.registerLanguage("abnf",n(93)),r.registerLanguage("accesslog",n(94)),r.registerLanguage("actionscript",n(95)),r.registerLanguage("ada",n(96)),r.registerLanguage("angelscript",n(97)),r.registerLanguage("apache",n(98)),r.registerLanguage("applescript",n(99)),r.registerLanguage("arcade",n(100)),r.registerLanguage("cpp",n(101)),r.registerLanguage("arduino",n(102)),r.registerLanguage("armasm",n(103)),r.registerLanguage("xml",n(104)),r.registerLanguage("asciidoc",n(105)),r.registerLanguage("aspectj",n(106)),r.registerLanguage("autohotkey",n(107)),r.registerLanguage("autoit",n(108)),r.registerLanguage("avrasm",n(109)),r.registerLanguage("awk",n(110)),r.registerLanguage("axapta",n(111)),r.registerLanguage("bash",n(112)),r.registerLanguage("basic",n(113)),r.registerLanguage("bnf",n(114)),r.registerLanguage("brainfuck",n(115)),r.registerLanguage("cal",n(116)),r.registerLanguage("capnproto",n(117)),r.registerLanguage("ceylon",n(118)),r.registerLanguage("clean",n(119)),r.registerLanguage("clojure",n(120)),r.registerLanguage("clojure-repl",n(121)),r.registerLanguage("cmake",n(122)),r.registerLanguage("coffeescript",n(123)),r.registerLanguage("coq",n(124)),r.registerLanguage("cos",n(125)),r.registerLanguage("crmsh",n(126)),r.registerLanguage("crystal",n(127)),r.registerLanguage("cs",n(128)),r.registerLanguage("csp",n(129)),r.registerLanguage("css",n(130)),r.registerLanguage("d",n(131)),r.registerLanguage("markdown",n(132)),r.registerLanguage("dart",n(133)),r.registerLanguage("delphi",n(134)),r.registerLanguage("diff",n(135)),r.registerLanguage("django",n(136)),r.registerLanguage("dns",n(137)),r.registerLanguage("dockerfile",n(138)),r.registerLanguage("dos",n(139)),r.registerLanguage("dsconfig",n(140)),r.registerLanguage("dts",n(141)),r.registerLanguage("dust",n(142)),r.registerLanguage("ebnf",n(143)),r.registerLanguage("elixir",n(144)),r.registerLanguage("elm",n(145)),r.registerLanguage("ruby",n(146)),r.registerLanguage("erb",n(147)),r.registerLanguage("erlang-repl",n(148)),r.registerLanguage("erlang",n(149)),r.registerLanguage("excel",n(150)),r.registerLanguage("fix",n(151)),r.registerLanguage("flix",n(152)),r.registerLanguage("fortran",n(153)),r.registerLanguage("fsharp",n(154)),r.registerLanguage("gams",n(155)),r.registerLanguage("gauss",n(156)),r.registerLanguage("gcode",n(157)),r.registerLanguage("gherkin",n(158)),r.registerLanguage("glsl",n(159)),r.registerLanguage("gml",n(160)),r.registerLanguage("go",n(161)),r.registerLanguage("golo",n(162)),r.registerLanguage("gradle",n(163)),r.registerLanguage("groovy",n(164)),r.registerLanguage("haml",n(165)),r.registerLanguage("handlebars",n(166)),r.registerLanguage("haskell",n(167)),r.registerLanguage("haxe",n(168)),r.registerLanguage("hsp",n(169)),r.registerLanguage("htmlbars",n(170)),r.registerLanguage("http",n(171)),r.registerLanguage("hy",n(172)),r.registerLanguage("inform7",n(173)),r.registerLanguage("ini",n(174)),r.registerLanguage("irpf90",n(175)),r.registerLanguage("isbl",n(176)),r.registerLanguage("java",n(177)),r.registerLanguage("javascript",n(178)),r.registerLanguage("jboss-cli",n(179)),r.registerLanguage("json",n(180)),r.registerLanguage("julia",n(181)),r.registerLanguage("julia-repl",n(182)),r.registerLanguage("kotlin",n(183)),r.registerLanguage("lasso",n(184)),r.registerLanguage("ldif",n(185)),r.registerLanguage("leaf",n(186)),r.registerLanguage("less",n(187)),r.registerLanguage("lisp",n(188)),r.registerLanguage("livecodeserver",n(189)),r.registerLanguage("livescript",n(190)),r.registerLanguage("llvm",n(191)),r.registerLanguage("lsl",n(192)),r.registerLanguage("lua",n(193)),r.registerLanguage("makefile",n(194)),r.registerLanguage("mathematica",n(195)),r.registerLanguage("matlab",n(196)),r.registerLanguage("maxima",n(197)),r.registerLanguage("mel",n(198)),r.registerLanguage("mercury",n(199)),r.registerLanguage("mipsasm",n(200)),r.registerLanguage("mizar",n(201)),r.registerLanguage("perl",n(202)),r.registerLanguage("mojolicious",n(203)),r.registerLanguage("monkey",n(204)),r.registerLanguage("moonscript",n(205)),r.registerLanguage("n1ql",n(206)),r.registerLanguage("nginx",n(207)),r.registerLanguage("nimrod",n(208)),r.registerLanguage("nix",n(209)),r.registerLanguage("nsis",n(210)),r.registerLanguage("objectivec",n(211)),r.registerLanguage("ocaml",n(212)),r.registerLanguage("openscad",n(213)),r.registerLanguage("oxygene",n(214)),r.registerLanguage("parser3",n(215)),r.registerLanguage("pf",n(216)),r.registerLanguage("pgsql",n(217)),r.registerLanguage("php",n(218)),r.registerLanguage("plaintext",n(219)),r.registerLanguage("pony",n(220)),r.registerLanguage("powershell",n(221)),r.registerLanguage("processing",n(222)),r.registerLanguage("profile",n(223)),r.registerLanguage("prolog",n(224)),r.registerLanguage("properties",n(225)),r.registerLanguage("protobuf",n(226)),r.registerLanguage("puppet",n(227)),r.registerLanguage("purebasic",n(228)),r.registerLanguage("python",n(229)),r.registerLanguage("q",n(230)),r.registerLanguage("qml",n(231)),r.registerLanguage("r",n(232)),r.registerLanguage("reasonml",n(233)),r.registerLanguage("rib",n(234)),r.registerLanguage("roboconf",n(235)),r.registerLanguage("routeros",n(236)),r.registerLanguage("rsl",n(237)),r.registerLanguage("ruleslanguage",n(238)),r.registerLanguage("rust",n(239)),r.registerLanguage("sas",n(240)),r.registerLanguage("scala",n(241)),r.registerLanguage("scheme",n(242)),r.registerLanguage("scilab",n(243)),r.registerLanguage("scss",n(244)),r.registerLanguage("shell",n(245)),r.registerLanguage("smali",n(246)),r.registerLanguage("smalltalk",n(247)),r.registerLanguage("sml",n(248)),r.registerLanguage("sqf",n(249)),r.registerLanguage("sql",n(250)),r.registerLanguage("stan",n(251)),r.registerLanguage("stata",n(252)),r.registerLanguage("step21",n(253)),r.registerLanguage("stylus",n(254)),r.registerLanguage("subunit",n(255)),r.registerLanguage("swift",n(256)),r.registerLanguage("taggerscript",n(257)),r.registerLanguage("yaml",n(258)),r.registerLanguage("tap",n(259)),r.registerLanguage("tcl",n(260)),r.registerLanguage("tex",n(261)),r.registerLanguage("thrift",n(262)),r.registerLanguage("tp",n(263)),r.registerLanguage("twig",n(264)),r.registerLanguage("typescript",n(265)),r.registerLanguage("vala",n(266)),r.registerLanguage("vbnet",n(267)),r.registerLanguage("vbscript",n(268)),r.registerLanguage("vbscript-html",n(269)),r.registerLanguage("verilog",n(270)),r.registerLanguage("vhdl",n(271)),r.registerLanguage("vim",n(272)),r.registerLanguage("x86asm",n(273)),r.registerLanguage("xl",n(274)),r.registerLanguage("xquery",n(275)),r.registerLanguage("zephir",n(276)),e.exports=r},function(e,t,n){var r,a,i;a=function(e){var t=[],n=Object.keys,r=Object.create(null),a=Object.create(null),i=!0,o=/^(no-?highlight|plain|text)$/i,s=/\blang(?:uage)?-([\w-]+)\b/i,l=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,c="Could not find the language '{}', did you forget to load/include a language module?",_={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},d="of and for in not or if then".split(" ");function u(e){return e.replace(/&/g,"&").replace(/
":_.tabReplace?t.replace(/\t/g,_.tabReplace):""})):e}function v(e){var n,r,i,o,l,d=function(e){var t,n,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",n=s.exec(i)){var o=O(n[1]);return o||(console.warn(c.replace("{}",n[1])),console.warn("Falling back to no-highlight mode for this block.",e)),o?n[1]:"no-highlight"}for(t=0,r=(i=i.split(/\s+/)).length;t