mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-01-13 22:41:32 -05:00
2305329041
* Smoother animations * Removed blurring in Chrome temporarily * Centering is now done in CSS (the height is calculated in JS to work in FF and Opera) * Modals now need close: true to be set to enable the close icon and shortcuts for closing (ESC key, background clicking)
151 lines
No EOL
5.8 KiB
JavaScript
151 lines
No EOL
5.8 KiB
JavaScript
// # Surrounds given text with Markdown syntax
|
|
|
|
/*global $, window, CodeMirror, Showdown, moment */
|
|
(function () {
|
|
"use strict";
|
|
var Markdown = {
|
|
init : function (options, elem) {
|
|
var self = this;
|
|
self.elem = elem;
|
|
|
|
self.style = (typeof options === 'string') ? options : options.style;
|
|
|
|
self.options = $.extend({}, CodeMirror.prototype.addMarkdown.options, options);
|
|
|
|
self.replace();
|
|
},
|
|
replace: function () {
|
|
var text = this.elem.getSelection(), pass = true, md, cursor, line, word, letterCount, converter;
|
|
switch (this.style) {
|
|
case "h1":
|
|
cursor = this.elem.getCursor();
|
|
line = this.elem.getLine(cursor.line);
|
|
this.elem.setLine(cursor.line, "# " + line);
|
|
this.elem.setCursor(cursor.line, cursor.ch + 2);
|
|
pass = false;
|
|
break;
|
|
case "h2":
|
|
cursor = this.elem.getCursor();
|
|
line = this.elem.getLine(cursor.line);
|
|
this.elem.setLine(cursor.line, "## " + line);
|
|
this.elem.setCursor(cursor.line, cursor.ch + 3);
|
|
pass = false;
|
|
break;
|
|
case "h3":
|
|
cursor = this.elem.getCursor();
|
|
line = this.elem.getLine(cursor.line);
|
|
this.elem.setLine(cursor.line, "### " + line);
|
|
this.elem.setCursor(cursor.line, cursor.ch + 4);
|
|
pass = false;
|
|
break;
|
|
case "h4":
|
|
cursor = this.elem.getCursor();
|
|
line = this.elem.getLine(cursor.line);
|
|
this.elem.setLine(cursor.line, "#### " + line);
|
|
this.elem.setCursor(cursor.line, cursor.ch + 5);
|
|
pass = false;
|
|
break;
|
|
case "h5":
|
|
cursor = this.elem.getCursor();
|
|
line = this.elem.getLine(cursor.line);
|
|
this.elem.setLine(cursor.line, "##### " + line);
|
|
this.elem.setCursor(cursor.line, cursor.ch + 6);
|
|
pass = false;
|
|
break;
|
|
case "h6":
|
|
cursor = this.elem.getCursor();
|
|
line = this.elem.getLine(cursor.line);
|
|
this.elem.setLine(cursor.line, "###### " + line);
|
|
this.elem.setCursor(cursor.line, cursor.ch + 7);
|
|
pass = false;
|
|
break;
|
|
case "link":
|
|
md = this.options.syntax.link.replace('$1', text);
|
|
this.elem.replaceSelection(md, "end");
|
|
cursor = this.elem.getCursor();
|
|
this.elem.setSelection({line: cursor.line, ch: cursor.ch - 8}, {line: cursor.line, ch: cursor.ch - 1});
|
|
pass = false;
|
|
break;
|
|
case "image":
|
|
cursor = this.elem.getCursor();
|
|
md = this.options.syntax.image.replace('$1', text);
|
|
if (this.elem.getLine(cursor.line) !== "") {
|
|
md = "\n\n" + md;
|
|
}
|
|
this.elem.replaceSelection(md, "end");
|
|
cursor = this.elem.getCursor();
|
|
this.elem.setSelection({line: cursor.line, ch: cursor.ch - 8}, {line: cursor.line, ch: cursor.ch - 1});
|
|
pass = false;
|
|
break;
|
|
case "uppercase":
|
|
md = text.toLocaleUpperCase();
|
|
break;
|
|
case "lowercase":
|
|
md = text.toLocaleLowerCase();
|
|
break;
|
|
case "titlecase":
|
|
md = text.toTitleCase();
|
|
break;
|
|
case "selectword":
|
|
cursor = this.elem.getCursor();
|
|
word = this.elem.getTokenAt(cursor);
|
|
if (!/\w$/g.test(word.string)) {
|
|
this.elem.setSelection({line: cursor.line, ch: word.start}, {line: cursor.line, ch: word.end - 1});
|
|
} else {
|
|
this.elem.setSelection({line: cursor.line, ch: word.start}, {line: cursor.line, ch: word.end});
|
|
}
|
|
break;
|
|
case "copyHTML":
|
|
converter = new Showdown.converter();
|
|
if (text) {
|
|
md = converter.makeHtml(text);
|
|
} else {
|
|
md = converter.makeHtml(this.elem.getValue());
|
|
}
|
|
|
|
$(".modal-copyToHTML-content").text(md).selectText();
|
|
pass = false;
|
|
break;
|
|
case "list":
|
|
md = text.replace(/^(\s*)(\w\W*)/gm, "$1* $2");
|
|
this.elem.replaceSelection(md, "end");
|
|
pass = false;
|
|
break;
|
|
case "currentDate":
|
|
md = moment(new Date()).format("D MMMM YYYY");
|
|
break;
|
|
default:
|
|
if (this.options.syntax[this.style]) {
|
|
md = this.options.syntax[this.style].replace('$1', text);
|
|
}
|
|
}
|
|
if (pass && md) {
|
|
this.elem.replaceSelection(md, "end");
|
|
if (!text) {
|
|
letterCount = md.length;
|
|
cursor = this.elem.getCursor();
|
|
this.elem.setCursor({line: cursor.line, ch: cursor.ch - (letterCount / 2)});
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
CodeMirror.prototype.addMarkdown = function (options) {
|
|
var markdown = Object.create(Markdown);
|
|
markdown.init(options, this);
|
|
};
|
|
|
|
CodeMirror.prototype.addMarkdown.options = {
|
|
style: null,
|
|
syntax: {
|
|
bold: "**$1**",
|
|
italic: "*$1*",
|
|
strike: "~~$1~~",
|
|
code: "`$1`",
|
|
link: "[$1](http://)",
|
|
image: "![$1](http://)",
|
|
blockquote: "> $1"
|
|
}
|
|
};
|
|
|
|
}()); |