Add fork of markdown-it-checkboxes to legacy scripts folder
Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
110
js/legacy/markdown-it-checkbox.js
Normal file
110
js/legacy/markdown-it-checkbox.js
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
var _, checkboxReplace;
|
||||||
|
|
||||||
|
_ = require('underscore');
|
||||||
|
|
||||||
|
checkboxReplace = function(md, options, Token) {
|
||||||
|
"use strict";
|
||||||
|
var arrayReplaceAt, createTokens, defaults, lastId, pattern, splitTextToken;
|
||||||
|
arrayReplaceAt = md.utils.arrayReplaceAt;
|
||||||
|
lastId = 0;
|
||||||
|
defaults = {
|
||||||
|
divWrap: false,
|
||||||
|
divClass: 'checkbox',
|
||||||
|
idPrefix: 'checkbox'
|
||||||
|
};
|
||||||
|
options = _.extend(defaults, options);
|
||||||
|
pattern = /\[(X|\s|\_|\-)\]\s(.*)/i;
|
||||||
|
createTokens = function(checked, label, Token) {
|
||||||
|
var id, idNumeric, nodes, token;
|
||||||
|
nodes = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <div class="checkbox">
|
||||||
|
*/
|
||||||
|
if (options.divWrap) {
|
||||||
|
token = new Token("checkbox_open", "div", 1);
|
||||||
|
token.attrs = [["class", options.divClass]];
|
||||||
|
nodes.push(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <input type="checkbox" id="checkbox{n}" checked="true">
|
||||||
|
*/
|
||||||
|
id = options.idPrefix + lastId;
|
||||||
|
idNumeric = lastId;
|
||||||
|
lastId += 1;
|
||||||
|
token = new Token("checkbox_input", "input", 0);
|
||||||
|
token.attrs = [["type", "checkbox"], ["id", id], ["data-id", idNumeric]];
|
||||||
|
if (checked === true) {
|
||||||
|
token.attrs.push(["checked", "true"]);
|
||||||
|
}
|
||||||
|
nodes.push(token);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <label for="checkbox{n}">
|
||||||
|
*/
|
||||||
|
token = new Token("label_open", "label", 1);
|
||||||
|
token.attrs = [["for", id], ["data-id", idNumeric]];
|
||||||
|
nodes.push(token);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* content of label tag
|
||||||
|
*/
|
||||||
|
token = new Token("text", "", 0);
|
||||||
|
token.content = label;
|
||||||
|
nodes.push(token);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* closing tags
|
||||||
|
*/
|
||||||
|
nodes.push(new Token("label_close", "label", -1));
|
||||||
|
if (options.divWrap) {
|
||||||
|
nodes.push(new Token("checkbox_close", "div", -1));
|
||||||
|
}
|
||||||
|
return nodes;
|
||||||
|
};
|
||||||
|
splitTextToken = function(original, Token) {
|
||||||
|
var checked, label, matches, text, value;
|
||||||
|
text = original.content;
|
||||||
|
matches = text.match(pattern);
|
||||||
|
if (matches === null) {
|
||||||
|
return original;
|
||||||
|
}
|
||||||
|
checked = false;
|
||||||
|
value = matches[1];
|
||||||
|
label = matches[2];
|
||||||
|
if (value === "X" || value === "x") {
|
||||||
|
checked = true;
|
||||||
|
}
|
||||||
|
return createTokens(checked, label, Token);
|
||||||
|
};
|
||||||
|
return function(state) {
|
||||||
|
lastId = 0;
|
||||||
|
var blockTokens, i, j, l, token, tokens;
|
||||||
|
blockTokens = state.tokens;
|
||||||
|
j = 0;
|
||||||
|
l = blockTokens.length;
|
||||||
|
while (j < l) {
|
||||||
|
if (blockTokens[j].type !== "inline") {
|
||||||
|
j++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
tokens = blockTokens[j].children;
|
||||||
|
i = tokens.length - 1;
|
||||||
|
while (i >= 0) {
|
||||||
|
token = tokens[i];
|
||||||
|
blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, splitTextToken(token, state.Token));
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*global module */
|
||||||
|
|
||||||
|
module.exports = function(md, options) {
|
||||||
|
"use strict";
|
||||||
|
md.core.ruler.push("checkbox", checkboxReplace(md, options));
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user