diff options
Diffstat (limited to 'node_modules/markdown-it-container')
| -rw-r--r-- | node_modules/markdown-it-container/CHANGELOG.md | 10 | ||||
| -rw-r--r-- | node_modules/markdown-it-container/LICENSE | 22 | ||||
| -rw-r--r-- | node_modules/markdown-it-container/README.md | 95 | ||||
| -rw-r--r-- | node_modules/markdown-it-container/bower.json | 26 | ||||
| -rw-r--r-- | node_modules/markdown-it-container/dist/markdown-it-container.js | 147 | ||||
| -rw-r--r-- | node_modules/markdown-it-container/dist/markdown-it-container.min.js | 2 | ||||
| -rw-r--r-- | node_modules/markdown-it-container/index.js | 143 | ||||
| -rw-r--r-- | node_modules/markdown-it-container/package.json | 26 |
8 files changed, 471 insertions, 0 deletions
diff --git a/node_modules/markdown-it-container/CHANGELOG.md b/node_modules/markdown-it-container/CHANGELOG.md new file mode 100644 index 00000000..438d6c2c --- /dev/null +++ b/node_modules/markdown-it-container/CHANGELOG.md @@ -0,0 +1,10 @@ +2.0.0 / 2015-10-05 +------------------ + +- Markdown-it 5.0.0 support. Use 1.x version for 4.x. + + +1.0.0 / 2015-03-13 +------------------ + +- First release. diff --git a/node_modules/markdown-it-container/LICENSE b/node_modules/markdown-it-container/LICENSE new file mode 100644 index 00000000..e6c32306 --- /dev/null +++ b/node_modules/markdown-it-container/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2015 Vitaly Puzrin, Alex Kocharin. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/markdown-it-container/README.md b/node_modules/markdown-it-container/README.md new file mode 100644 index 00000000..a0c163c0 --- /dev/null +++ b/node_modules/markdown-it-container/README.md @@ -0,0 +1,95 @@ +# markdown-it-container + +[](https://travis-ci.org/markdown-it/markdown-it-container) +[](https://www.npmjs.org/package/markdown-it-container) +[](https://coveralls.io/r/markdown-it/markdown-it-container?branch=master) + +> Plugin for creating block-level custom containers for [markdown-it](https://github.com/markdown-it/markdown-it) markdown parser. + +__v2.+ requires `markdown-it` v5.+, see changelog.__ + +With this plugin you can create block containers like: + +``` +::: warning +*here be dragons* +::: +``` + +.... and specify how they should be rendered. If no renderer defined, `<div>` with +container name class will be created: + +```html +<div class="warning"> +<em>here be dragons</em> +</div> +``` + +Markup is the same as for [fenced code blocks](http://spec.commonmark.org/0.18/#fenced-code-blocks). +Difference is, that marker use another character and content is rendered as markdown markup. + + +## Installation + +node.js, browser: + +```bash +$ npm install markdown-it-container --save +$ bower install markdown-it-container --save +``` + + +## API + +```js +var md = require('markdown-it')() + .use(require('markdown-it-container'), name [, options]); +``` + +Params: + +- __name__ - container name (mandatory) +- __options:__ + - __validate__ - optional, function to validate tail after opening marker, should + return `true` on success. + - __render__ - optional, renderer function for opening/closing tokens. + - __marker__ - optional (`:`), character to use in delimiter. + + +## Example + +```js +var md = require('markdown-it')(); + +md.use(require('markdown-it-container'), 'spoiler', { + + validate: function(params) { + return params.trim().match(/^spoiler\s+(.*)$/); + }, + + render: function (tokens, idx) { + var m = tokens[idx].info.trim().match(/^spoiler\s+(.*)$/); + + if (tokens[idx].nesting === 1) { + // opening tag + return '<details><summary>' + m[1] + '</summary>\n'; + + } else { + // closing tag + return '</details>\n'; + } + } +}); + +console.log(md.render('::: spoiler click me\n*content*\n:::\n')); + +// Output: +// +// <details><summary>click me</summary> +// <p><em>content</em></p> +// </details> +``` + +## License + +[MIT](https://github.com/markdown-it/markdown-it-container/blob/master/LICENSE) diff --git a/node_modules/markdown-it-container/bower.json b/node_modules/markdown-it-container/bower.json new file mode 100644 index 00000000..c26acefb --- /dev/null +++ b/node_modules/markdown-it-container/bower.json @@ -0,0 +1,26 @@ +{ + "name": "markdown-it-container", + "main": "dist/markdown-it-container.js", + "homepage": "https://github.com/markdown-it/markdown-it-container", + "description": "Plugin to create block-level custom containers for markdown-it markdown parser", + "keywords": [ + "markdown-it-plugin", + "markdown-it", + "markdown" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "benchmark", + "bower_components", + "coverage", + "demo", + "docs", + "lib", + "node_modules", + "support", + "test", + "Makefile", + "index*" + ] +} diff --git a/node_modules/markdown-it-container/dist/markdown-it-container.js b/node_modules/markdown-it-container/dist/markdown-it-container.js new file mode 100644 index 00000000..3dfdb99e --- /dev/null +++ b/node_modules/markdown-it-container/dist/markdown-it-container.js @@ -0,0 +1,147 @@ +/*! markdown-it-container 2.0.0 https://github.com//markdown-it/markdown-it-container @license MIT */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.markdownitContainer = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ +// Process block-level custom containers +// +'use strict'; + + +module.exports = function container_plugin(md, name, options) { + + function validateDefault(params) { + return params.trim().split(' ', 2)[0] === name; + } + + function renderDefault(tokens, idx, _options, env, self) { + + // add a class to the opening tag + if (tokens[idx].nesting === 1) { + tokens[idx].attrPush([ 'class', name ]); + } + + return self.renderToken(tokens, idx, _options, env, self); + } + + options = options || {}; + + var min_markers = 3, + marker_str = options.marker || ':', + marker_char = marker_str.charCodeAt(0), + marker_len = marker_str.length, + validate = options.validate || validateDefault, + render = options.render || renderDefault; + + function container(state, startLine, endLine, silent) { + var pos, nextLine, marker_count, markup, params, token, + old_parent, old_line_max, + auto_closed = false, + start = state.bMarks[startLine] + state.tShift[startLine], + max = state.eMarks[startLine]; + + // Check out the first character quickly, + // this should filter out most of non-containers + // + if (marker_char !== state.src.charCodeAt(start)) { return false; } + + // Check out the rest of the marker string + // + for (pos = start + 1; pos <= max; pos++) { + if (marker_str[(pos - start) % marker_len] !== state.src[pos]) { + break; + } + } + + marker_count = Math.floor((pos - start) / marker_len); + if (marker_count < min_markers) { return false; } + pos -= (pos - start) % marker_len; + + markup = state.src.slice(start, pos); + params = state.src.slice(pos, max); + if (!validate(params)) { return false; } + + // Since start is found, we can report success here in validation mode + // + if (silent) { return true; } + + // Search for the end of the block + // + nextLine = startLine; + + for (;;) { + nextLine++; + if (nextLine >= endLine) { + // unclosed block should be autoclosed by end of document. + // also block seems to be autoclosed by end of parent + break; + } + + start = state.bMarks[nextLine] + state.tShift[nextLine]; + max = state.eMarks[nextLine]; + + if (start < max && state.sCount[nextLine] < state.blkIndent) { + // non-empty line with negative indent should stop the list: + // - ``` + // test + break; + } + + if (marker_char !== state.src.charCodeAt(start)) { continue; } + + if (state.sCount[nextLine] - state.blkIndent >= 4) { + // closing fence should be indented less than 4 spaces + continue; + } + + for (pos = start + 1; pos <= max; pos++) { + if (marker_str[(pos - start) % marker_len] !== state.src[pos]) { + break; + } + } + + // closing code fence must be at least as long as the opening one + if (Math.floor((pos - start) / marker_len) < marker_count) { continue; } + + // make sure tail has spaces only + pos -= (pos - start) % marker_len; + pos = state.skipSpaces(pos); + + if (pos < max) { continue; } + + // found! + auto_closed = true; + break; + } + + old_parent = state.parentType; + old_line_max = state.lineMax; + state.parentType = 'container'; + + // this will prevent lazy continuations from ever going past our end marker + state.lineMax = nextLine; + + token = state.push('container_' + name + '_open', 'div', 1); + token.markup = markup; + token.block = true; + token.info = params; + token.map = [ startLine, nextLine ]; + + state.md.block.tokenize(state, startLine + 1, nextLine); + + token = state.push('container_' + name + '_close', 'div', -1); + token.markup = state.src.slice(start, pos); + token.block = true; + + state.parentType = old_parent; + state.lineMax = old_line_max; + state.line = nextLine + (auto_closed ? 1 : 0); + + return true; + } + + md.block.ruler.before('fence', 'container_' + name, container, { + alt: [ 'paragraph', 'reference', 'blockquote', 'list' ] + }); + md.renderer.rules['container_' + name + '_open'] = render; + md.renderer.rules['container_' + name + '_close'] = render; +}; + +},{}]},{},[1])(1) +});
\ No newline at end of file diff --git a/node_modules/markdown-it-container/dist/markdown-it-container.min.js b/node_modules/markdown-it-container/dist/markdown-it-container.min.js new file mode 100644 index 00000000..cbbe1a25 --- /dev/null +++ b/node_modules/markdown-it-container/dist/markdown-it-container.min.js @@ -0,0 +1,2 @@ +/*! markdown-it-container 2.0.0 https://github.com//markdown-it/markdown-it-container @license MIT */ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var r;r="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,r.markdownitContainer=e()}}(function(){return function e(r,n,t){function o(f,a){if(!n[f]){if(!r[f]){var u="function"==typeof require&&require;if(!a&&u)return u(f,!0);if(i)return i(f,!0);var c=new Error("Cannot find module '"+f+"'");throw c.code="MODULE_NOT_FOUND",c}var s=n[f]={exports:{}};r[f][0].call(s.exports,function(e){var n=r[f][1][e];return o(n?n:e)},s,s.exports,e,r,n,t)}return n[f].exports}for(var i="function"==typeof require&&require,f=0;f<t.length;f++)o(t[f]);return o}({1:[function(e,r,n){"use strict";r.exports=function(e,r,n){function t(e){return e.trim().split(" ",2)[0]===r}function o(e,n,t,o,i){return 1===e[n].nesting&&e[n].attrPush(["class",r]),i.renderToken(e,n,t,o,i)}function i(e,n,t,o){var i,l,d,p,k,h,b,m,v=!1,y=e.bMarks[n]+e.tShift[n],_=e.eMarks[n];if(u!==e.src.charCodeAt(y))return!1;for(i=y+1;_>=i&&a[(i-y)%c]===e.src[i];i++);if(d=Math.floor((i-y)/c),f>d)return!1;if(i-=(i-y)%c,p=e.src.slice(y,i),k=e.src.slice(i,_),!s(k))return!1;if(o)return!0;for(l=n;(l++,!(l>=t))&&(y=e.bMarks[l]+e.tShift[l],_=e.eMarks[l],!(_>y&&e.sCount[l]<e.blkIndent));)if(u===e.src.charCodeAt(y)&&!(e.sCount[l]-e.blkIndent>=4)){for(i=y+1;_>=i&&a[(i-y)%c]===e.src[i];i++);if(!(Math.floor((i-y)/c)<d||(i-=(i-y)%c,i=e.skipSpaces(i),_>i))){v=!0;break}}return b=e.parentType,m=e.lineMax,e.parentType="container",e.lineMax=l,h=e.push("container_"+r+"_open","div",1),h.markup=p,h.block=!0,h.info=k,h.map=[n,l],e.md.block.tokenize(e,n+1,l),h=e.push("container_"+r+"_close","div",-1),h.markup=e.src.slice(y,i),h.block=!0,e.parentType=b,e.lineMax=m,e.line=l+(v?1:0),!0}n=n||{};var f=3,a=n.marker||":",u=a.charCodeAt(0),c=a.length,s=n.validate||t,l=n.render||o;e.block.ruler.before("fence","container_"+r,i,{alt:["paragraph","reference","blockquote","list"]}),e.renderer.rules["container_"+r+"_open"]=l,e.renderer.rules["container_"+r+"_close"]=l}},{}]},{},[1])(1)}); diff --git a/node_modules/markdown-it-container/index.js b/node_modules/markdown-it-container/index.js new file mode 100644 index 00000000..f04d2d40 --- /dev/null +++ b/node_modules/markdown-it-container/index.js @@ -0,0 +1,143 @@ +// Process block-level custom containers +// +'use strict'; + + +module.exports = function container_plugin(md, name, options) { + + function validateDefault(params) { + return params.trim().split(' ', 2)[0] === name; + } + + function renderDefault(tokens, idx, _options, env, self) { + + // add a class to the opening tag + if (tokens[idx].nesting === 1) { + tokens[idx].attrPush([ 'class', name ]); + } + + return self.renderToken(tokens, idx, _options, env, self); + } + + options = options || {}; + + var min_markers = 3, + marker_str = options.marker || ':', + marker_char = marker_str.charCodeAt(0), + marker_len = marker_str.length, + validate = options.validate || validateDefault, + render = options.render || renderDefault; + + function container(state, startLine, endLine, silent) { + var pos, nextLine, marker_count, markup, params, token, + old_parent, old_line_max, + auto_closed = false, + start = state.bMarks[startLine] + state.tShift[startLine], + max = state.eMarks[startLine]; + + // Check out the first character quickly, + // this should filter out most of non-containers + // + if (marker_char !== state.src.charCodeAt(start)) { return false; } + + // Check out the rest of the marker string + // + for (pos = start + 1; pos <= max; pos++) { + if (marker_str[(pos - start) % marker_len] !== state.src[pos]) { + break; + } + } + + marker_count = Math.floor((pos - start) / marker_len); + if (marker_count < min_markers) { return false; } + pos -= (pos - start) % marker_len; + + markup = state.src.slice(start, pos); + params = state.src.slice(pos, max); + if (!validate(params)) { return false; } + + // Since start is found, we can report success here in validation mode + // + if (silent) { return true; } + + // Search for the end of the block + // + nextLine = startLine; + + for (;;) { + nextLine++; + if (nextLine >= endLine) { + // unclosed block should be autoclosed by end of document. + // also block seems to be autoclosed by end of parent + break; + } + + start = state.bMarks[nextLine] + state.tShift[nextLine]; + max = state.eMarks[nextLine]; + + if (start < max && state.sCount[nextLine] < state.blkIndent) { + // non-empty line with negative indent should stop the list: + // - ``` + // test + break; + } + + if (marker_char !== state.src.charCodeAt(start)) { continue; } + + if (state.sCount[nextLine] - state.blkIndent >= 4) { + // closing fence should be indented less than 4 spaces + continue; + } + + for (pos = start + 1; pos <= max; pos++) { + if (marker_str[(pos - start) % marker_len] !== state.src[pos]) { + break; + } + } + + // closing code fence must be at least as long as the opening one + if (Math.floor((pos - start) / marker_len) < marker_count) { continue; } + + // make sure tail has spaces only + pos -= (pos - start) % marker_len; + pos = state.skipSpaces(pos); + + if (pos < max) { continue; } + + // found! + auto_closed = true; + break; + } + + old_parent = state.parentType; + old_line_max = state.lineMax; + state.parentType = 'container'; + + // this will prevent lazy continuations from ever going past our end marker + state.lineMax = nextLine; + + token = state.push('container_' + name + '_open', 'div', 1); + token.markup = markup; + token.block = true; + token.info = params; + token.map = [ startLine, nextLine ]; + + state.md.block.tokenize(state, startLine + 1, nextLine); + + token = state.push('container_' + name + '_close', 'div', -1); + token.markup = state.src.slice(start, pos); + token.block = true; + + state.parentType = old_parent; + state.lineMax = old_line_max; + state.line = nextLine + (auto_closed ? 1 : 0); + + return true; + } + + md.block.ruler.before('fence', 'container_' + name, container, { + alt: [ 'paragraph', 'reference', 'blockquote', 'list' ] + }); + md.renderer.rules['container_' + name + '_open'] = render; + md.renderer.rules['container_' + name + '_close'] = render; +}; diff --git a/node_modules/markdown-it-container/package.json b/node_modules/markdown-it-container/package.json new file mode 100644 index 00000000..64b4468f --- /dev/null +++ b/node_modules/markdown-it-container/package.json @@ -0,0 +1,26 @@ +{ + "name": "markdown-it-container", + "version": "2.0.0", + "description": "Plugin to create block-level custom containers for markdown-it markdown parser", + "repository": "markdown-it/markdown-it-container", + "license": "MIT", + "scripts": { + "test": "make test" + }, + "keywords": [ + "markdown-it-plugin", + "markdown-it", + "markdown" + ], + "devDependencies": { + "browserify": "*", + "coveralls": "^2.11.2", + "eslint": "0.13.0", + "eslint-plugin-nodeca": "^1.0.0", + "istanbul": "*", + "markdown-it": "markdown-it/markdown-it", + "markdown-it-testgen": "~0.1.0", + "mocha": "*", + "uglify-js": "*" + } +} |
