/**
* jQuery.Markdown.js v0.0.10
* Author: taknakamu
* Git: https://github.com/taknakamu/jquery-markdown
*
* Copyright (c) 2013 Kosuke Nakamuta
* Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
*/
(function($) {
$.fn.extend({
markdown: function(options) {
var defaults = {
target_form : $(this).selector
}
options = $.extend(defaults, options);
function markdownConvert(art_body) {
var md = {
options : {
empty_mark : "\n" // "\n" or "
"
},
vs : {},
variable : {
editbody : null,
stack : {
tag : [],
text : []
},
text : "",
html : ""
},
convert : {
tags : {
hr : {
default_ : function() { return "
"; }
},
a : {
default_ : function(href, v) { return '' + v + ''; },
title : function(href, v, title) { return '' + v + ''; },
target_blank : function(href, v) { return '' + v + ''; }
},
img : {
default_ : function(src, alt) { return ''; },
title : function(src, alt, title) { return ''; }
},
pre : {
default_ : function(lang, v) { return '' + v + '
'; }
},
empty : {
default_ : function() { return md.options.empty_mark; }
},
th : {
default_ : function(v) { return '' + v + ' | '; },
center : function(v) { return '' + v + ' | '; },
left : function(v) { return '' + v + ' | '; },
right : function(v) { return '' + v + ' | '; }
},
td : {
default_ : function(v) { return '' + v + ' | '; },
center : function(v) { return '' + v + ' | '; },
left : function(v) { return '' + v + ' | '; },
right : function(v) { return '' + v + ' | '; }
},
notag : {
default_ : function(tag, v) { return '<' + tag + '>' + v + '' + tag + '>'; }
}
},
replacer : {
strong : ["__([^_]+)__", "\\\*\\\*([^*]+)\\\*\\\*"],
em : ["_([^_]+)_", "\\\*([^*]+)\\\*"],
del : ["~~([^~]+)~~"],
code : ["`([^`]+)`"]
},
push : function(tag, text) {
if (!md.convert.inStack(tag)) {
md.variable.stack.tag.push(tag);
}
if (!md.variable.stack.text[tag]) {
md.variable.stack.text[tag] = [];
}
if (typeof text !== 'undefined') {
md.variable.stack.text[tag].push(text);
}
return this;
},
pushest : function(text) {
if (md.convert.inStack()) {
var maxi = md.variable.stack.tag.length - 1;
var tag = md.variable.stack.tag[maxi];
return md.convert.push(tag, text);
}
return this;
},
pop : function(called, arguments_) {
if (md.convert.inStack()) {
var tag = md.variable.stack.tag.pop();
var text = innerHtml = "";
var args = (arguments_ || []);
while (typeof (text = md.variable.stack.text[tag].shift()) !== 'undefined') {
if (tag === "pre" && args.length === 0) {
args.push(text);
continue;
}
md.convert.text(md.convert.text() + text);
if (tag === "pre" || tag === "blockquote") {
md.convert.text(md.convert.text() + md.options.empty_mark);
}
}
if (tag === "blockquote") {
md.convert.text(markdownConvert(md.convert.text()));
}
if (typeof called === 'undefined') {
called = 'default_';
}
if (args.length === 0 && !md.convert.tags[tag]) {
args.push(tag);
tag = "notag";
}
args.push(md.convert.text());
innerHtml = md.convert.tags[tag][called].apply(this, args);
$.each(md.convert.replacer, function(rep, regs) {
$(regs).each(function(i, exp) {
var regexp = new RegExp(exp, "g");
innerHtml = innerHtml.replace(regexp, '<' + rep + '>$1' + rep + '>');
});
});
if (!md.convert.inStack()) {
md.convert.html(innerHtml);
}
md.convert.text("");
return innerHtml;
}
return this;
},
_string : function(variable, string) {
if (typeof string === 'undefined') {
return md.variable[variable];
} else {
md.variable[variable] = string;
return this;
}
},
text : function(text) { return md.convert._string("text", text); },
html : function(html) { return md.convert._string("html", html); },
inStack : function(tag) {
if (typeof tag === 'undefined') {
return (md.variable.stack.tag.length !== 0) ? true : false;
}
if (tag === "h" && md.convert.inStack()) {
var maxi = md.variable.stack.tag.length - 1;
if (md.variable.stack.tag[maxi].match(/^h[1-6]/)) {
return true;
}
}
return ($.inArray(tag, md.variable.stack.tag) !== -1) ? true : false;
}
},
check : {
init : function() {
md.vs = {};
},
valid : function(callmethod) {
if ('' !== md.convert.html()) {
return false;
}
if (md.convert.inStack() && !md.convert.inStack(callmethod)) {
return false;
}
return true;
},
_pre : function(i, v) {
return {
"nowv" : v,
"prev" : md.variable.editbody[i-1],
"nexv" : md.variable.editbody[i+1],
"tag" : "",
"args" : false
};
},
isset : function(v) {
return (md.options.empty_mark !== v && "" !== v) ? true : false;
},
wrapper : function(callmethod, args) {
md.check.init();
if (md.check.valid(callmethod)) {
md.vs = md.check._pre.apply(this, args);
} else {
return false;
}
md.check.tags[callmethod].apply(this);
if (typeof md.vs.nexv === 'undefined') {
while (md.convert.inStack()) {
md.convert.pushest(md.convert.pop());
}
}
},
tags : {
h : function(args) {
/**
* # H1 Text - ###### H6 Text
*/
if (null !== md.vs.nowv.match(/^#{1,6}\s/)) {
var tag = "h" + md.vs.nowv.match(/^#{1,6}/)[0].length;
var text = md.vs.nowv.replace(/^#{1,6}\s/, "")
md.convert.push(tag, text).pop();
} else if (md.check.isset(md.vs.nowv) && md.vs.nexv) {
if (md.convert.inStack("h")) {
md.convert.pop();
}
/**
* H1 Text
* ================
*/
if (md.vs.nexv.match(/^=+$/)) {
md.convert.push("h1", md.vs.nowv);
}
/**
* H2 Text
* ----------------
*/
if (md.vs.nexv.match(/^\-+$/)) {
md.convert.push("h2", md.vs.nowv);
}
} else if (md.convert.inStack("h")) {
md.convert.pop();
}
},
hr : function() {
var checker = function(mark) {
if (md.vs.nowv.indexOf(mark) === 0) {
var regexp = new RegExp(((mark === "*") ? "\\" + mark : mark), "g");
if ("" === md.vs.nowv.replace(regexp, "")) {
md.convert.push("hr").pop();
}
}
}
checker("-");
checker("*");
checker("_");
},
empty : function() {
if ("" === md.vs.nowv || md.vs.nowv.match(/^!?\[.*\]:.*/)) {
md.convert.push("empty").pop();
}
},
pre : function() {
if (md.vs.nowv.indexOf("```") !== -1) {
(!md.convert.inStack("pre")) ?
md.convert.push("pre", md.vs.nowv.replace(/`/g, "")):
md.convert.pop();
} else if (md.convert.inStack("pre")) {
md.convert.pushest(md.vs.nowv);
}
},
blockquote : function(args) {
if (md.vs.nowv.match(/^(\s{1,3})?>\s?/)) {
md.vs.nowv = md.vs.nowv.replace(/^(\s{1,3})?>\s?/, "");
md.convert.push("blockquote", md.vs.nowv);
} else if (!md.check.isset(md.vs.nowv)) {
if (typeof md.vs.nexv !== 'undefined' && md.check.isset(md.vs.nexv)) {
if (!md.vs.nexv.match(/^(\s{1,3})?>/)) {
md.convert.pop();
}
}
} else if (md.convert.inStack("blockquote")) {
md.convert.pushest(md.vs.nowv);
}
},
ol : function() {
var nv = md.vs.nowv;
var nn = md.vs.nexv;
if (nv.match(/^(\s{0,7})?[0-9]+[.]\s/)) {
if (!md.convert.inStack("ol")) {
md.convert.push("ol");
nv = nv.replace(/^\s+/g, "");
}
}
if (md.convert.inStack("ol")) {
if (nv.match(/^[0-9]+[.]\s/) || nv.match(/^[\*\+\-]\s/)) {
lipop();
md.convert.push("li", nv.replace(/^\s{0,7}?[0-9]+[.]\s(.*)/, "$1")
.replace(/^[\*\+\-]\s(.*)/, "$1"));
} else if (nv.match(/^\s+/)) {
nv = nv.replace(/^\s+/g, "");
if (nv.match(/^[\*\+\-]\s/)) {
md.convert.pushest(nv);
if (nn.match(/^[0-9]+[.]\s/)) {
lipop();
}
} else if (nv.match(/^.*/)) {
md.convert.pushest(nv);
} else if (!md.check.isset(nv)) {
md.convert.pushest(nv);
}
} else if (!md.check.isset(nv)) {
if (!md.check.isset(nn)) {
md.convert.pushest(nv);
return true;
}
if (nn && nn.match(/^\s+/)) {
if (!nn.match(/^\s{1,7}?[\*\+\-]\s/)) {
md.convert.pushest(nv);
return true;
}
} else if (nn) {
if (nn.match(/^[0-9]+[.]\s/)) {
md.convert.pushest(nv);
return true;
}
}
lipop();
md.convert.pop();
md.addP = false;
} else {
md.convert.pushest(nv);
}
}
},
ul : function() {
var nv = md.vs.nowv;
var nn = md.vs.nexv;
if (nv.match(/^(\s{0,7})?[\*\+\-]\s/)) {
if (!md.convert.inStack("ul")) {
md.convert.push("ul");
nv = nv.replace(/^\s+/g, "");
}
}
if (md.convert.inStack("ul")) {
if (nv.match(/^[0-9]+[.]\s/) || nv.match(/^[\*\+\-]\s/)) {
lipop();
md.convert.push("li", nv.replace(/^\s{0,7}?[0-9]+[.]\s(.*)/, "$1")
.replace(/^[\*\+\-]\s(.*)/, "$1"));
} else if (nv.match(/^\s+/)) {
nv = nv.replace(/^\s+/g, "");
if (nv.match(/^[0-9]+[.]\s/)) {
md.convert.pushest(nv);
if (nn.match(/^[\*\+\-]\s/)) {
lipop();
}
} else if (nv.match(/^.*/)) {
md.convert.pushest(nv);
} else if (!md.check.isset(nv)) {
md.convert.pushest(nv);
}
} else if (!md.check.isset(nv)) {
if (!md.check.isset(nn)) {
md.convert.pushest(nv);
return true;
}
if (nn && nn.match(/^\s+/)) {
if (!nn.match(/^\s{1,7}?[0-9]+[.]\s/)) {
md.convert.pushest(nv);
return true;
}
} else if (nn) {
if (nn.match(/^[\*\+\-]\s/)) {
md.convert.pushest(nv);
return true;
}
}
lipop();
md.convert.pop();
md.addP = false;
} else {
md.convert.pushest(nv);
}
}
},
table : function() {
var nv = md.vs.nowv;
var nn = md.vs.nexv;
if (nn && nv.match(/\|/) && nn.match(/:?-+:?[\s+]?\|/)) {
if (!md.convert.inStack("table")) {
md.convert.push("table").push("thead").push("tr");
var trs = nn.replace(/^\|(.*)\|$/, "$1").split("|");
md.aligns = [];
$(trs).each(function(i, v) {
var repv = v.replace(/^\s+|\s+$/g, "");
if (repv.match(/^:.*:$/)) {
md.aligns[i] = "center";
} else if (repv.match(/^:/)) {
md.aligns[i] = "left";
} else if (repv.match(/:$/)) {
md.aligns[i] = "right";
} else {
md.aligns[i] = "default_";
}
});
var ths = nv.replace(/^\|(.*)\|$/, "$1").split("|");
$(ths).each(function(i, v) {
md.convert.pushest(
md.convert.push("th", v.replace(/^\s+|\s+$/g, "")).pop(md.aligns[i])
);
});
md.convert.pushest((md.convert.pop()));
md.convert.pushest((md.convert.pop()));
}
} else if (nn && nv.match(/\|/)) {
if (!md.convert.inStack("tbody")) {
md.convert.push("tbody");
} else {
md.convert.push("tr");
var tds = nv.replace(/^\|(.*)\|$/, "$1").split("|");
$(tds).each(function(i, v) {
md.convert.pushest(
md.convert.push("td", v.replace(/^\s+|\s+$/g, "")).pop(md.aligns[i])
);
});
md.convert.pushest((md.convert.pop()));
}
} else if (md.convert.inStack("table")) {
md.convert.pushest((md.convert.pop()));
md.convert.pop();
}
},
p : function() {
if ((!md.vs.nowv.match(/^\s*?) && md.vs.nowv !== "\n")) {
if (!md.vs.nowv.match(/^\s*?)) {
if (!md.convert.inStack("p")) {
md.convert.push("p");
}
var getTitle = function(src) {
src = src.replace(/\\/g, "\\\\")
.replace(/\*/g, "\\*")
.replace(/\(/g, "\\(")
.replace(/\)/g, "\\)")
.replace(/\[/g, "\\[")
.replace(/\]/g, "\\]")
.replace(/\^/g, "\\^")
.replace(/\$/g, "\\$")
.replace(/\-/g, "\\-")
.replace(/\|/g, "\\|")
.replace(/\//g, "\\/");
var title = null;
var matches = new RegExp("\\[" + src + "\\]:", "i");
$.each(md.variable.editbody, function(i, v) {
if (v.match(matches)) {
if ((uri = v.match(/\[.*\]:(.*)/))) {
uri = uri[1].replace(/^\s+/, "");
src = uri.split(" ")[0];
title = uri.match(/.*"(.*)"/);
title = (title) ? title[1] : null;
}
}
});
return [src, title];
}
var createtags = function(src, alt, title) {
if (null !== md.vs.nowv.match(/!/)) {
var img = md.convert.push("img").pop((title ? "title" : "default_"), [src, alt, title]);
var a = md.convert.push("a").pushest(img).pop("target_blank", [src]);
} else {
a = md.convert.push("a").pop((title ? "title" : "default_"), [src, alt, title]);
}
return a;
}
while (null !== md.vs.nowv.match(/!?\[.*?\]\(.*?\)/)) {
var a_match = md.vs.nowv.match(/\[(.*?)\]\((.*?)\)/);
var src_title = a_match[2].split(" ");
var title = src_title[1] && src_title[1].replace(/"/g, "");
var a = createtags(src_title[0], a_match[1], title);
md.vs.nowv = md.vs.nowv.replace(a_match[0], a);
}
if (null !== md.vs.nowv.match(/!?\[.*\]\[.*\]/)) {
var alt = md.vs.nowv.replace(/!?\[(.*)\]\[.*\]/, "$1");
var src = md.vs.nowv.replace(/!?\[.*\]\[(.*)\]/, "$1");
var title_matches = getTitle(src);
src = title_matches[0];
title = title_matches[1];
md.vs.nowv = createtags(src, alt, title);
}
if (null !== md.vs.nowv.match(/!?\[.*\]/)) {
var alt = src = md.vs.nowv.replace(/^.*?!?\[(.*)\].*?/, "$1");
var title_matches = getTitle(src);
src = title_matches[0];
title = title_matches[1];
var a = createtags(src, alt, title);
md.vs.nowv = md.vs.nowv.replace(/^(.*)?!?\[(.*)\](.*)?/, "$1" + a + "$3");
}
if (typeof md.vs.nexv !== 'undefined') {
if (md.convert.inStack("p")) {
if (md.vs.nexv.match(/^=+$/)) {
md.convert.pop();
md.convert.push("h1", md.vs.nowv);
return true;
}
if (md.vs.nexv.match(/^\-+$/)) {
md.convert.pop();
md.convert.push("h2", md.vs.nowv);
return true;
}
}
var convertedtext = markdownConvert(md.vs.nexv);
if ("" !== convertedtext && "" !== convertedtext.substr(0,3)) {
md.convert.pushest(md.vs.nowv).pop();
}
}
if (typeof md.vs.nexv === 'undefined') {
md.convert.pushest(md.vs.nowv).pop();
} else {
md.convert.pushest(md.vs.nowv + '
');
}
}
}
},
etc : function() {
var innerHtml = md.vs.nowv;
/*
$.each(md.convert.replacer, function(rep, regs) {
$(regs).each(function(i, exp) {
var regexp = new RegExp(exp, "g");
innerHtml = innerHtml.replace(regexp, '<' + rep + '>$1' + rep + '>');
});
});
*/
md.convert.html(innerHtml);
}
}
}
};
var lipop = function() {
var tag = "li";
if (md.convert.inStack(tag)) {
var textlength = getTextLength();
var textlengthAddSpace = getTextLength(true);
var converttext = getConvertText();
if (textlength !== 1 && textlength !== textlengthAddSpace) {
md.addP = true;
}
md.convert.pop();
var poped = markdownConvert(converttext);
if (!md.addP) {
poped = poped.replace("
", "").replace("
", "");
}
md.convert.push(tag, poped);
md.convert.pushest(md.convert.pop());
}
};
var getConvertText = function(mode_length) {
var tag = "li";
var textlength = 0;
var converttext = "";
$(md.variable.stack.text[tag]).each(function(i, v) {
if ("" !== v) {
textlength++;
}
converttext += v + md.options.empty_mark;
});
return ((mode_length) ? textlength : converttext);
};
var getTextLength = function(isset_) {
tag = "li";
return ((isset_) ? getConvertText(true) : md.variable.stack.text[tag].length);
};
md.variable.editbody = art_body.split(/\n/);
var md_format = "";
$.each(md.variable.editbody, function() {
var args = arguments;
$.each(md.check.tags, function(tagname) {
md.check.wrapper(tagname, args);
})
md_format += md.convert.html();
md.convert.html("");
});
return md_format;
}
return this.each(function() {
var markdownconvert = "";
$.each($(this), function(i, v) {
var v = ($(v).val() || $(v).html());
markdownconvert += markdownConvert.apply(this, [v]);
});
$(this).addClass("markdown-body").html(markdownconvert);
});
}
});
})(jQuery);