|
|
- /**
- * 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 "<br>"
- },
- vs : {},
- variable : {
- editbody : null,
- stack : {
- tag : [],
- text : []
- },
- text : "",
- html : ""
- },
- convert : {
- tags : {
- hr : {
- default_ : function() { return "<hr />"; }
- },
- a : {
- default_ : function(href, v) { return '<a href="' + href + '">' + v + '</a>'; },
- title : function(href, v, title) { return '<a href="' + href + '" title="' + title + '" target="_blank">' + v + '</a>'; },
- target_blank : function(href, v) { return '<a href="' + href + '" target="_blank">' + v + '</a>'; }
- },
- img : {
- default_ : function(src, alt) { return '<img class="img-frame" style="max-width:100%;" src="' + src + '" alt="' + alt + '"/>'; },
- title : function(src, alt, title) { return '<img title="' + title + '" class="img-frame" style="max-width:100%;" src="' + src + '" alt="' + alt + '"/>'; }
- },
- pre : {
- default_ : function(lang, v) { return '<pre class="brush: ' + lang.toLowerCase() + ';">' + v + '</pre>'; }
- },
- empty : {
- default_ : function() { return md.options.empty_mark; }
- },
- th : {
- default_ : function(v) { return '<th>' + v + '</th>'; },
- center : function(v) { return '<th align="center">' + v + '</th>'; },
- left : function(v) { return '<th align="left">' + v + '</th>'; },
- right : function(v) { return '<th align="right">' + v + '</th>'; }
- },
- td : {
- default_ : function(v) { return '<td>' + v + '</td>'; },
- center : function(v) { return '<td align="center">' + v + '</td>'; },
- left : function(v) { return '<td align="left">' + v + '</td>'; },
- right : function(v) { return '<td align="right">' + v + '</td>'; }
- },
- 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 && "<p>" !== 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 + '<br>');
- }
- }
- }
- },
- 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("<p>", "").replace("</p>", "");
- }
-
- 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);
|