From ecd7a89402bd942e91d417fe00c534b14262f6bd Mon Sep 17 00:00:00 2001 From: Yaroslav Date: Mon, 5 Apr 2021 23:16:36 +0300 Subject: [PATCH] removed shit added beautiful editor yolo --- .gitignore | 1 + Dockerfile | 11 + Makefile | 5 +- assets/markdown/TOS.md | 76 - assets/public/editor/Markdown.Converter.js | 1631 ++++++++++++ assets/public/editor/Markdown.Editor.js | 2245 +++++++++++++++++ assets/public/editor/Markdown.Extra.js | 874 +++++++ assets/public/editor/Markdown.Sanitizer.js | 108 + assets/public/editor/cmunrb.otf | Bin 0 -> 216080 bytes assets/public/editor/cmunrm.otf | Bin 0 -> 330492 bytes assets/public/editor/index.html | 358 +++ .../public/editor/mathjax-editing_writing.js | 375 +++ assets/public/index.html | 28 +- assets/public/new.js | 23 +- assets/public/note.js | 13 +- assets/public/robots.txt | 5 +- assets/public/style.css | 50 +- assets/templates/form.html | 21 +- assets/templates/list.html | 23 + assets/templates/note.html | 2 - docker-compose.yml | 11 + email.go | 16 - render.go | 1 + server.go | 80 +- stats.go | 4 +- storage.go | 42 +- test/main.go | 377 --- 27 files changed, 5748 insertions(+), 632 deletions(-) create mode 100644 Dockerfile delete mode 100644 assets/markdown/TOS.md create mode 100644 assets/public/editor/Markdown.Converter.js create mode 100644 assets/public/editor/Markdown.Editor.js create mode 100644 assets/public/editor/Markdown.Extra.js create mode 100644 assets/public/editor/Markdown.Sanitizer.js create mode 100644 assets/public/editor/cmunrb.otf create mode 100644 assets/public/editor/cmunrm.otf create mode 100644 assets/public/editor/index.html create mode 100644 assets/public/editor/mathjax-editing_writing.js create mode 100644 assets/templates/list.html create mode 100644 docker-compose.yml delete mode 100644 email.go delete mode 100644 test/main.go diff --git a/.gitignore b/.gitignore index 78c3518..4548843 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ database.sqlite-journal vendor database.sqlite notehub +.idea \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b5c781f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM golang:1.14.3-alpine +WORKDIR /go/src/app +RUN apk --no-cache add curl make sqlite gcc musl-dev git + +RUN curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh +COPY . . +RUN dep ensure + +RUN make db +EXPOSE 3000 +CMD ["make", "run"] \ No newline at end of file diff --git a/Makefile b/Makefile index 8329abd..f4dfc70 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,9 @@ run: - TEST_MODE=1 go run *.go + go run *.go tests: go run test/main.go db: - echo 'CREATE TABLE "notes" (`id` VARCHAR(6) UNIQUE PRIMARY KEY, `text` TEXT, `published` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `edited` TIMESTAMP DEFAULT NULL, `password` VARCHAR(16), `views` INTEGER DEFAULT 0);' | sqlite3 database.sqlite + mkdir data + echo 'CREATE TABLE "notes" (`id` VARCHAR(6) UNIQUE PRIMARY KEY, `text` TEXT, `published` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `edited` TIMESTAMP DEFAULT NULL, `password` VARCHAR(16), `views` INTEGER DEFAULT 0);' | sqlite3 data/database.sqlite diff --git a/assets/markdown/TOS.md b/assets/markdown/TOS.md deleted file mode 100644 index aee7647..0000000 --- a/assets/markdown/TOS.md +++ /dev/null @@ -1,76 +0,0 @@ -# Terms of Service - -### 1. Terms - -By accessing the web site at https://notehub.org, you are agreeing to be -bound by these web site Terms and Conditions of Use, all applicable laws and -regulations, and agree that you are responsible for compliance with any -applicable local laws. If you do not agree with any of these terms, you are -prohibited from using or accessing this site. The materials contained in this -web site are protected by applicable copyright and trademark law. - -### 2. Use License - -a. Under this license you may not: - 1. attempt to __modify, manipulate__ or __extend__ any software contained on NoteHub's web site; - 2. create _any_ kind of content unlawful to __possess__, __produce__ or __distribute__ under your local law; - 3. create 'hop' notes containing a collection of links to external resources; - -b. This license shall automatically terminate if you violate any of these -restrictions and may be terminated by NoteHub at any time. Upon terminating -your viewing of these materials or upon the termination of this license, you -must destroy any downloaded materials in your possession whether in electronic -or printed format. - -### 3. Disclaimer - -a. The materials on NoteHub's web site are provided "as is". NoteHub makes no -warranties, expressed or implied, and hereby disclaims and negates all other -warranties, including without limitation, implied warranties or conditions of -merchantability, fitness for a particular purpose, or non-infringement of -intellectual property or other violation of rights. - -Further, NoteHub does not warrant or make any representations concerning the -accuracy, likely results, or reliability of the use of the materials on its -Internet web site or otherwise relating to such materials or on any sites -linked to this site. - -### 4. Limitations - -In no event shall NoteHub or its suppliers be liable for any damages -(including, without limitation, damages for loss of data or profit, or due to -business interruption,) arising out of the use or inability to use the -materials on NoteHub's Internet site, even if NoteHub or a NoteHub authorized -representative has been notified orally or in writing of the possibility of -such damage. Because some jurisdictions do not allow limitations on implied -warranties, or limitations of liability for consequential or incidental -damages, these limitations may not apply to you. - -### 5. Revisions and Errata - -The materials appearing on NoteHub's web site could include technical, -typographical, or photographic errors. NoteHub does not warrant that any of the -materials on its web site are accurate, complete, or current. NoteHub may make -changes to the materials contained on its web site at any time without notice. -NoteHub does not, however, make any commitment to update the materials. - -### 6. Links - -NoteHub has not reviewed all of the sites linked to its Internet web site and -is not responsible for the contents of any such linked site. The inclusion of -any link does not imply endorsement by NoteHub of the site. Use of any such -linked web site is at the user's own risk. - -### 7. Site Terms of Use Modifications - -NoteHub may revise these terms of use for its web site at any time without -notice. By using this web site you are agreeing to be bound by the then -current version of these Terms and Conditions of Use. - -### 8. Governing Law - -Any claim relating to NoteHub's web site shall be governed by the laws of -Germany without regard to its conflict of law provisions. - -General Terms and Conditions applicable to Use of a Web Site. - diff --git a/assets/public/editor/Markdown.Converter.js b/assets/public/editor/Markdown.Converter.js new file mode 100644 index 0000000..47fe636 --- /dev/null +++ b/assets/public/editor/Markdown.Converter.js @@ -0,0 +1,1631 @@ +//modification JB: \pagebreak + +"use strict"; +var Markdown; + +if (typeof exports === "object" && typeof require === "function") // we're in a CommonJS (e.g. Node.js) module + Markdown = exports; +else + Markdown = {}; + +// The following text is included for historical reasons, but should +// be taken with a pinch of salt; it's not all true anymore. + +// +// Wherever possible, Showdown is a straight, line-by-line port +// of the Perl version of Markdown. +// +// This is not a normal parser design; it's basically just a +// series of string substitutions. It's hard to read and +// maintain this way, but keeping Showdown close to the original +// design makes it easier to port new features. +// +// More importantly, Showdown behaves like markdown.pl in most +// edge cases. So web applications can do client-side preview +// in Javascript, and then build identical HTML on the server. +// +// This port needs the new RegExp functionality of ECMA 262, +// 3rd Edition (i.e. Javascript 1.5). Most modern web browsers +// should do fine. Even with the new regular expression features, +// We do a lot of work to emulate Perl's regex functionality. +// The tricky changes in this file mostly have the "attacklab:" +// label. Major or self-explanatory changes don't. +// +// Smart diff tools like Araxis Merge will be able to match up +// this file with markdown.pl in a useful way. A little tweaking +// helps: in a copy of markdown.pl, replace "#" with "//" and +// replace "$text" with "text". Be sure to ignore whitespace +// and line endings. +// + + +// +// Usage: +// +// var text = "Markdown *rocks*."; +// +// var converter = new Markdown.Converter(); +// var html = converter.makeHtml(text); +// +// alert(html); +// +// Note: move the sample code to the bottom of this +// file before uncommenting it. +// + +(function () { + + function identity(x) { return x; } + function returnFalse(x) { return false; } + + function HookCollection() { } + + HookCollection.prototype = { + + chain: function (hookname, func) { + var original = this[hookname]; + if (!original) + throw new Error("unknown hook " + hookname); + + if (original === identity) + this[hookname] = func; + else + this[hookname] = function (text) { + var args = Array.prototype.slice.call(arguments, 0); + args[0] = original.apply(null, args); + return func.apply(null, args); + }; + }, + set: function (hookname, func) { + if (!this[hookname]) + throw new Error("unknown hook " + hookname); + this[hookname] = func; + }, + addNoop: function (hookname) { + this[hookname] = identity; + }, + addFalse: function (hookname) { + this[hookname] = returnFalse; + } + }; + + Markdown.HookCollection = HookCollection; + + // g_urls and g_titles allow arbitrary user-entered strings as keys. This + // caused an exception (and hence stopped the rendering) when the user entered + // e.g. [push] or [__proto__]. Adding a prefix to the actual key prevents this + // (since no builtin property starts with "s_"). See + // http://meta.stackexchange.com/questions/64655/strange-wmd-bug + // (granted, switching from Array() to Object() alone would have left only __proto__ + // to be a problem) + function SaveHash() { } + SaveHash.prototype = { + set: function (key, value) { + this["s_" + key] = value; + }, + get: function (key) { + return this["s_" + key]; + } + }; + + Markdown.Converter = function (OPTIONS) { + var pluginHooks = this.hooks = new HookCollection(); + + // given a URL that was encountered by itself (without markup), should return the link text that's to be given to this link + pluginHooks.addNoop("plainLinkText"); + + // called with the orignal text as given to makeHtml. The result of this plugin hook is the actual markdown source that will be cooked + pluginHooks.addNoop("preConversion"); + + // called with the text once all normalizations have been completed (tabs to spaces, line endings, etc.), but before any conversions have + pluginHooks.addNoop("postNormalization"); + + // Called with the text before / after creating block elements like code blocks and lists. Note that this is called recursively + // with inner content, e.g. it's called with the full text, and then only with the content of a blockquote. The inner + // call will receive outdented text. + pluginHooks.addNoop("preBlockGamut"); + pluginHooks.addNoop("postBlockGamut"); + + // called with the text of a single block element before / after the span-level conversions (bold, code spans, etc.) have been made + pluginHooks.addNoop("preSpanGamut"); + pluginHooks.addNoop("postSpanGamut"); + + // called with the final cooked HTML code. The result of this plugin hook is the actual output of makeHtml + pluginHooks.addNoop("postConversion"); + + // + // Private state of the converter instance: + // + + // Global hashes, used by various utility routines + var g_urls; + var g_titles; + var g_html_blocks; + + // Used to track when we're inside an ordered or unordered list + // (see _ProcessListItems() for details): + var g_list_level; + + OPTIONS = OPTIONS || {}; + var asciify = identity, deasciify = identity; + if (OPTIONS.nonAsciiLetters) { + + /* In JavaScript regular expressions, \w only denotes [a-zA-Z0-9_]. + * That's why there's inconsistent handling e.g. with intra-word bolding + * of Japanese words. That's why we do the following if OPTIONS.nonAsciiLetters + * is true: + * + * Before doing bold and italics, we find every instance + * of a unicode word character in the Markdown source that is not + * matched by \w, and the letter "Q". We take the character's code point + * and encode it in base 51, using the "digits" + * + * A, B, ..., P, R, ..., Y, Z, a, b, ..., y, z + * + * delimiting it with "Q" on both sides. For example, the source + * + * > In Chinese, the smurfs are called 藍精靈, meaning "blue spirits". + * + * turns into + * + * > In Chinese, the smurfs are called QNIhQQMOIQQOuUQ, meaning "blue spirits". + * + * Since everything that is a letter in Unicode is now a letter (or + * several letters) in ASCII, \w and \b should always do the right thing. + * + * After the bold/italic conversion, we decode again; since "Q" was encoded + * alongside all non-ascii characters (as "QBfQ"), and the conversion + * will not generate "Q", the only instances of that letter should be our + * encoded characters. And since the conversion will not break words, the + * "Q...Q" should all still be in one piece. + * + * We're using "Q" as the delimiter because it's probably one of the + * rarest characters, and also because I can't think of any special behavior + * that would ever be triggered by this letter (to use a silly example, if we + * delimited with "H" on the left and "P" on the right, then "Ψ" would be + * encoded as "HTTP", which may cause special behavior). The latter would not + * actually be a huge issue for bold/italic, but may be if we later use it + * in other places as well. + * */ + (function () { + var lettersThatJavaScriptDoesNotKnowAndQ = /[Q\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376-\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0523\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0621-\u064a\u0660-\u0669\u066e-\u066f\u0671-\u06d3\u06d5\u06e5-\u06e6\u06ee-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07c0-\u07ea\u07f4-\u07f5\u07fa\u0904-\u0939\u093d\u0950\u0958-\u0961\u0966-\u096f\u0971-\u0972\u097b-\u097f\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc-\u09dd\u09df-\u09e1\u09e6-\u09f1\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a59-\u0a5c\u0a5e\u0a66-\u0a6f\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0-\u0ae1\u0ae6-\u0aef\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b66-\u0b6f\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0be6-\u0bef\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58-\u0c59\u0c60-\u0c61\u0c66-\u0c6f\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0-\u0ce1\u0ce6-\u0cef\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d28\u0d2a-\u0d39\u0d3d\u0d60-\u0d61\u0d66-\u0d6f\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32-\u0e33\u0e40-\u0e46\u0e50-\u0e59\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb0\u0eb2-\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0ed0-\u0ed9\u0edc-\u0edd\u0f00\u0f20-\u0f29\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8b\u1000-\u102a\u103f-\u1049\u1050-\u1055\u105a-\u105d\u1061\u1065-\u1066\u106e-\u1070\u1075-\u1081\u108e\u1090-\u1099\u10a0-\u10c5\u10d0-\u10fa\u10fc\u1100-\u1159\u115f-\u11a2\u11a8-\u11f9\u1200-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u1676\u1681-\u169a\u16a0-\u16ea\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u17e0-\u17e9\u1810-\u1819\u1820-\u1877\u1880-\u18a8\u18aa\u1900-\u191c\u1946-\u196d\u1970-\u1974\u1980-\u19a9\u19c1-\u19c7\u19d0-\u19d9\u1a00-\u1a16\u1b05-\u1b33\u1b45-\u1b4b\u1b50-\u1b59\u1b83-\u1ba0\u1bae-\u1bb9\u1c00-\u1c23\u1c40-\u1c49\u1c4d-\u1c7d\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u203f-\u2040\u2054\u2071\u207f\u2090-\u2094\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2183-\u2184\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2c6f\u2c71-\u2c7d\u2c80-\u2ce4\u2d00-\u2d25\u2d30-\u2d65\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3006\u3031-\u3035\u303b-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31b7\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fc3\ua000-\ua48c\ua500-\ua60c\ua610-\ua62b\ua640-\ua65f\ua662-\ua66e\ua67f-\ua697\ua717-\ua71f\ua722-\ua788\ua78b-\ua78c\ua7fb-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8d0-\ua8d9\ua900-\ua925\ua930-\ua946\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa50-\uaa59\uac00-\ud7a3\uf900-\ufa2d\ufa30-\ufa6a\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe33-\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]/g; + var cp_Q = "Q".charCodeAt(0); + var cp_A = "A".charCodeAt(0); + var cp_Z = "Z".charCodeAt(0); + var dist_Za = "a".charCodeAt(0) - cp_Z - 1; + + asciify = function(text) { + return text.replace(lettersThatJavaScriptDoesNotKnowAndQ, function (m) { + var c = m.charCodeAt(0); + var s = ""; + var v; + while (c > 0) { + v = (c % 51) + cp_A; + if (v >= cp_Q) + v++; + if (v > cp_Z) + v += dist_Za; + s = String.fromCharCode(v) + s; + c = c / 51 | 0; + } + return "Q" + s + "Q"; + }) + }; + + deasciify = function(text) { + return text.replace(/Q([A-PR-Za-z]{1,3})Q/g, function (m, s) { + var c = 0; + var v; + for (var i = 0; i < s.length; i++) { + v = s.charCodeAt(i); + if (v > cp_Z) + v -= dist_Za; + if (v > cp_Q) + v--; + v -= cp_A; + c = (c * 51) + v; + } + return String.fromCharCode(c); + }) + } + })(); + } + + var _DoItalicsAndBold = OPTIONS.asteriskIntraWordEmphasis ? _DoItalicsAndBold_AllowIntrawordWithAsterisk : _DoItalicsAndBoldStrict; + + this.makeHtml = function (text) { + + // + // Main function. The order in which other subs are called here is + // essential. Link and image substitutions need to happen before + // _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the + // and tags get encoded. + // + + // This will only happen if makeHtml on the same converter instance is called from a plugin hook. + // Don't do that. + if (g_urls) + throw new Error("Recursive call to converter.makeHtml"); + + // Create the private state objects. + g_urls = new SaveHash(); + g_titles = new SaveHash(); + g_html_blocks = []; + g_list_level = 0; + + text = pluginHooks.preConversion(text); + + // attacklab: Replace ~ with ~T + // This lets us use tilde as an escape char to avoid md5 hashes + // The choice of character is arbitray; anything that isn't + // magic in Markdown will work. + text = text.replace(/~/g, "~T"); + + // attacklab: Replace $ with ~D + // RegExp interprets $ as a special character + // when it's in a replacement string + text = text.replace(/\$/g, "~D"); + + // Standardize line endings + text = text.replace(/\r\n/g, "\n"); // DOS to Unix + text = text.replace(/\r/g, "\n"); // Mac to Unix + + // Make sure text begins and ends with a couple of newlines: + text = "\n\n" + text + "\n\n"; + + // Convert all tabs to spaces. + text = _Detab(text); + + // Strip any lines consisting only of spaces and tabs. + // This makes subsequent regexen easier to write, because we can + // match consecutive blank lines with /\n+/ instead of something + // contorted like /[ \t]*\n+/ . + text = text.replace(/^[ \t]+$/mg, ""); + + text = pluginHooks.postNormalization(text); + + // Turn block-level HTML blocks into hash entries + text = _HashHTMLBlocks(text); + + // Strip link definitions, store in hashes. + text = _StripLinkDefinitions(text); + + text = _RunBlockGamut(text); + + text = _UnescapeSpecialChars(text); + + // attacklab: Restore dollar signs + text = text.replace(/~D/g, "$$"); + + // attacklab: Restore tildes + text = text.replace(/~T/g, "~"); + + text = pluginHooks.postConversion(text); + + text = text.replace(/\\pagebreak/g, '
'); + + g_html_blocks = g_titles = g_urls = null; + + return text; + }; + + function _StripLinkDefinitions(text) { + // + // Strips link definitions from text, stores the URLs and titles in + // hash references. + // + + // Link defs are in the form: ^[id]: url "optional title" + + /* + text = text.replace(/ + ^[ ]{0,3}\[([^\[\]]+)\]: // id = $1 attacklab: g_tab_width - 1 + [ \t]* + \n? // maybe *one* newline + [ \t]* + ? // url = $2 + (?=\s|$) // lookahead for whitespace instead of the lookbehind removed below + [ \t]* + \n? // maybe one newline + [ \t]* + ( // (potential) title = $3 + (\n*) // any lines skipped = $4 attacklab: lookbehind removed + [ \t]+ + ["(] + (.+?) // title = $5 + [")] + [ \t]* + )? // title is optional + (?:\n+|$) + /gm, function(){...}); + */ + + text = text.replace(/^[ ]{0,3}\[([^\[\]]+)\]:[ \t]*\n?[ \t]*?(?=\s|$)[ \t]*\n?[ \t]*((\n*)["(](.+?)[")][ \t]*)?(?:\n+)/gm, + function (wholeMatch, m1, m2, m3, m4, m5) { + m1 = m1.toLowerCase(); + g_urls.set(m1, _EncodeAmpsAndAngles(m2)); // Link IDs are case-insensitive + if (m4) { + // Oops, found blank lines, so it's not a title. + // Put back the parenthetical statement we stole. + return m3; + } else if (m5) { + g_titles.set(m1, m5.replace(/"/g, """)); + } + + // Completely remove the definition from the text + return ""; + } + ); + + return text; + } + + function _HashHTMLBlocks(text) { + + // Hashify HTML blocks: + // We only want to do this for block-level HTML tags, such as headers, + // lists, and tables. That's because we still want to wrap

s around + // "paragraphs" that are wrapped in non-block-level tags, such as anchors, + // phrase emphasis, and spans. The list of tags we're looking for is + // hard-coded: + var block_tags_a = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del" + var block_tags_b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math" + + // First, look for nested blocks, e.g.: + //

+ //
+ // tags for inner block must be indented. + //
+ //
+ // + // The outermost tags must start at the left margin for this to match, and + // the inner nested divs must be indented. + // We need to do this before the next, more liberal match, because the next + // match will start at the first `
` and stop at the first `
`. + + // attacklab: This regex can be expensive when it fails. + + /* + text = text.replace(/ + ( // save in $1 + ^ // start of line (with /m) + <($block_tags_a) // start tag = $2 + \b // word break + // attacklab: hack around khtml/pcre bug... + [^\r]*?\n // any number of lines, minimally matching + // the matching end tag + [ \t]* // trailing spaces/tabs + (?=\n+) // followed by a newline + ) // attacklab: there are sentinel newlines at end of document + /gm,function(){...}}; + */ + text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm, hashMatch); + + // + // Now match more liberally, simply from `\n` to `\n` + // + + /* + text = text.replace(/ + ( // save in $1 + ^ // start of line (with /m) + <($block_tags_b) // start tag = $2 + \b // word break + // attacklab: hack around khtml/pcre bug... + [^\r]*? // any number of lines, minimally matching + .* // the matching end tag + [ \t]* // trailing spaces/tabs + (?=\n+) // followed by a newline + ) // attacklab: there are sentinel newlines at end of document + /gm,function(){...}}; + */ + text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm, hashMatch); + + // Special case just for
. It was easier to make a special case than + // to make the other regex more complicated. + + /* + text = text.replace(/ + \n // Starting after a blank line + [ ]{0,3} + ( // save in $1 + (<(hr) // start tag = $2 + \b // word break + ([^<>])*? + \/?>) // the matching end tag + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashMatch); + */ + text = text.replace(/\n[ ]{0,3}((<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, hashMatch); + + // Special case for standalone HTML comments: + + /* + text = text.replace(/ + \n\n // Starting after a blank line + [ ]{0,3} // attacklab: g_tab_width - 1 + ( // save in $1 + -]|-[^>])(?:[^-]|-[^-])*)--) // see http://www.w3.org/TR/html-markup/syntax.html#comments and http://meta.stackexchange.com/q/95256 + > + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashMatch); + */ + text = text.replace(/\n\n[ ]{0,3}(-]|-[^>])(?:[^-]|-[^-])*)--)>[ \t]*(?=\n{2,}))/g, hashMatch); + + // PHP and ASP-style processor instructions ( and <%...%>) + + /* + text = text.replace(/ + (?: + \n\n // Starting after a blank line + ) + ( // save in $1 + [ ]{0,3} // attacklab: g_tab_width - 1 + (?: + <([?%]) // $2 + [^\r]*? + \2> + ) + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashMatch); + */ + text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, hashMatch); + + return text; + } + + function hashBlock(text) { + text = text.replace(/(^\n+|\n+$)/g, ""); + // Replace the element text with a marker ("~KxK" where x is its key) + return "\n\n~K" + (g_html_blocks.push(text) - 1) + "K\n\n"; + } + + function hashMatch(wholeMatch, m1) { + return hashBlock(m1); + } + + var blockGamutHookCallback = function (t) { return _RunBlockGamut(t); } + + function _RunBlockGamut(text, doNotUnhash) { + // + // These are all the transformations that form block-level + // tags like paragraphs, headers, and list items. + // + + text = pluginHooks.preBlockGamut(text, blockGamutHookCallback); + + text = _DoHeaders(text); + + // Do Horizontal Rules: + var replacement = "
\n"; + text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm, replacement); + text = text.replace(/^[ ]{0,2}([ ]?-[ ]?){3,}[ \t]*$/gm, replacement); + text = text.replace(/^[ ]{0,2}([ ]?_[ ]?){3,}[ \t]*$/gm, replacement); + + text = _DoLists(text); + text = _DoCodeBlocks(text); + text = _DoBlockQuotes(text); + + text = pluginHooks.postBlockGamut(text, blockGamutHookCallback); + + // We already ran _HashHTMLBlocks() before, in Markdown(), but that + // was to escape raw HTML in the original Markdown source. This time, + // we're escaping the markup we've just created, so that we don't wrap + //

tags around block-level tags. + text = _HashHTMLBlocks(text); + text = _FormParagraphs(text, doNotUnhash); + + return text; + } + + function _RunSpanGamut(text) { + // + // These are all the transformations that occur *within* block-level + // tags like paragraphs, headers, and list items. + // + + text = pluginHooks.preSpanGamut(text); + + text = _DoCodeSpans(text); + text = _EscapeSpecialCharsWithinTagAttributes(text); + text = _EncodeBackslashEscapes(text); + + // Process anchor and image tags. Images must come first, + // because ![foo][f] looks like an anchor. + text = _DoImages(text); + text = _DoAnchors(text); + + // Make links out of things like `` + // Must come after _DoAnchors(), because you can use < and > + // delimiters in inline links like [this](). + text = _DoAutoLinks(text); + + text = text.replace(/~P/g, "://"); // put in place to prevent autolinking; reset now + + text = _EncodeAmpsAndAngles(text); + text = _DoItalicsAndBold(text); + + // Do hard breaks: + text = text.replace(/ +\n/g, "
\n"); + + text = pluginHooks.postSpanGamut(text); + + return text; + } + + function _EscapeSpecialCharsWithinTagAttributes(text) { + // + // Within tags -- meaning between < and > -- encode [\ ` * _] so they + // don't conflict with their use in Markdown for code, italics and strong. + // + + // Build a regex to find HTML tags and comments. See Friedl's + // "Mastering Regular Expressions", 2nd Ed., pp. 200-201. + + // SE: changed the comment part of the regex + + var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|-]|-[^>])(?:[^-]|-[^-])*)--)>)/gi; + + text = text.replace(regex, function (wholeMatch) { + var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g, "$1`"); + tag = escapeCharacters(tag, wholeMatch.charAt(1) == "!" ? "\\`*_/" : "\\`*_"); // also escape slashes in comments to prevent autolinking there -- http://meta.stackexchange.com/questions/95987 + return tag; + }); + + return text; + } + + function _DoAnchors(text) { + + if (text.indexOf("[") === -1) + return text; + + // + // Turn Markdown link shortcuts into XHTML
tags. + // + // + // First, handle reference-style links: [link text] [id] + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ( + (?: + \[[^\]]*\] // allow brackets nested one level + | + [^\[] // or anything else + )* + ) + \] + + [ ]? // one optional space + (?:\n[ ]*)? // one optional newline followed by spaces + + \[ + (.*?) // id = $3 + \] + ) + ()()()() // pad remaining backreferences + /g, writeAnchorTag); + */ + text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeAnchorTag); + + // + // Next, inline-style links: [link text](url "optional title") + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ( + (?: + \[[^\]]*\] // allow brackets nested one level + | + [^\[\]] // or anything else + )* + ) + \] + \( // literal paren + [ \t]* + () // no id, so leave $3 empty + ? + [ \t]* + ( // $5 + (['"]) // quote char = $6 + (.*?) // Title = $7 + \6 // matching quote + [ \t]* // ignore any spaces/tabs between closing quote and ) + )? // title is optional + \) + ) + /g, writeAnchorTag); + */ + + text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeAnchorTag); + + // + // Last, handle reference-style shortcuts: [link text] + // These must come last in case you've also got [link test][1] + // or [link test](/foo) + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ([^\[\]]+) // link text = $2; can't contain '[' or ']' + \] + ) + ()()()()() // pad rest of backreferences + /g, writeAnchorTag); + */ + text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag); + + return text; + } + + function writeAnchorTag(wholeMatch, m1, m2, m3, m4, m5, m6, m7) { + if (m7 == undefined) m7 = ""; + var whole_match = m1; + var link_text = m2.replace(/:\/\//g, "~P"); // to prevent auto-linking withing the link. will be converted back after the auto-linker runs + var link_id = m3.toLowerCase(); + var url = m4; + var title = m7; + + if (url == "") { + if (link_id == "") { + // lower-case and turn embedded newlines into spaces + link_id = link_text.toLowerCase().replace(/ ?\n/g, " "); + } + url = "#" + link_id; + + if (g_urls.get(link_id) != undefined) { + url = g_urls.get(link_id); + if (g_titles.get(link_id) != undefined) { + title = g_titles.get(link_id); + } + } + else { + if (whole_match.search(/\(\s*\)$/m) > -1) { + // Special case for explicit empty url + url = ""; + } else { + return whole_match; + } + } + } + url = attributeSafeUrl(url); + + var result = ""; + + return result; + } + + function _DoImages(text) { + + if (text.indexOf("![") === -1) + return text; + + // + // Turn Markdown image shortcuts into tags. + // + + // + // First, handle reference-style labeled images: ![alt text][id] + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + !\[ + (.*?) // alt text = $2 + \] + + [ ]? // one optional space + (?:\n[ ]*)? // one optional newline followed by spaces + + \[ + (.*?) // id = $3 + \] + ) + ()()()() // pad rest of backreferences + /g, writeImageTag); + */ + text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeImageTag); + + // + // Next, handle inline images: ![alt text](url "optional title") + // Don't forget: encode * and _ + + /* + text = text.replace(/ + ( // wrap whole match in $1 + !\[ + (.*?) // alt text = $2 + \] + \s? // One optional whitespace character + \( // literal paren + [ \t]* + () // no id, so leave $3 empty + ? // src url = $4 + [ \t]* + ( // $5 + (['"]) // quote char = $6 + (.*?) // title = $7 + \6 // matching quote + [ \t]* + )? // title is optional + \) + ) + /g, writeImageTag); + */ + text = text.replace(/(!\[(.*?)\]\s?\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeImageTag); + + return text; + } + + function attributeEncode(text) { + // unconditionally replace angle brackets here -- what ends up in an attribute (e.g. alt or title) + // never makes sense to have verbatim HTML in it (and the sanitizer would totally break it) + return text.replace(/>/g, ">").replace(/" + _RunSpanGamut(m1) + "\n\n"; } + ); + + text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm, + function (matchFound, m1) { return "

" + _RunSpanGamut(m1) + "

\n\n"; } + ); + + // atx-style headers: + // # Header 1 + // ## Header 2 + // ## Header 2 with closing hashes ## + // ... + // ###### Header 6 + // + + /* + text = text.replace(/ + ^(\#{1,6}) // $1 = string of #'s + [ \t]* + (.+?) // $2 = Header text + [ \t]* + \#* // optional closing #'s (not counted) + \n+ + /gm, function() {...}); + */ + + text = text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm, + function (wholeMatch, m1, m2) { + var h_level = m1.length; + return "" + _RunSpanGamut(m2) + "\n\n"; + } + ); + + return text; + } + + function _DoLists(text, isInsideParagraphlessListItem) { + // + // Form HTML ordered (numbered) and unordered (bulleted) lists. + // + + // attacklab: add sentinel to hack around khtml/safari bug: + // http://bugs.webkit.org/show_bug.cgi?id=11231 + text += "~0"; + + // Re-usable pattern to match any entirel ul or ol list: + + /* + var whole_list = / + ( // $1 = whole list + ( // $2 + [ ]{0,3} // attacklab: g_tab_width - 1 + ([*+-]|\d+[.]) // $3 = first list item marker + [ \t]+ + ) + [^\r]+? + ( // $4 + ~0 // sentinel for workaround; should be $ + | + \n{2,} + (?=\S) + (?! // Negative lookahead for another list item marker + [ \t]* + (?:[*+-]|\d+[.])[ \t]+ + ) + ) + ) + /g + */ + var whole_list = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; + if (g_list_level) { + text = text.replace(whole_list, function (wholeMatch, m1, m2) { + var list = m1; + var list_type = (m2.search(/[*+-]/g) > -1) ? "ul" : "ol"; + var first_number; + if (list_type === "ol") + first_number = parseInt(m2, 10) + + var result = _ProcessListItems(list, list_type, isInsideParagraphlessListItem); + + // Trim any trailing whitespace, to put the closing `` + // up on the preceding line, to get it past the current stupid + // HTML block parser. This is a hack to work around the terrible + // hack that is the HTML block parser. + result = result.replace(/\s+$/, ""); + var opening = "<" + list_type; + if (first_number && first_number !== 1) + opening += " start=\"" + first_number + "\""; + result = opening + ">" + result + "\n"; + return result; + }); + } else { + whole_list = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g; + text = text.replace(whole_list, function (wholeMatch, m1, m2, m3) { + var runup = m1; + var list = m2; + + var list_type = (m3.search(/[*+-]/g) > -1) ? "ul" : "ol"; + + var first_number; + if (list_type === "ol") + first_number = parseInt(m3, 10) + + var result = _ProcessListItems(list, list_type); + var opening = "<" + list_type; + if (first_number && first_number !== 1) + opening += " start=\"" + first_number + "\""; + + result = runup + opening + ">\n" + result + "\n"; + return result; + }); + } + + // attacklab: strip sentinel + text = text.replace(/~0/, ""); + + return text; + } + + var _listItemMarkers = { ol: "\\d+[.]", ul: "[*+-]" }; + + function _ProcessListItems(list_str, list_type, isInsideParagraphlessListItem) { + // + // Process the contents of a single ordered or unordered list, splitting it + // into individual list items. + // + // list_type is either "ul" or "ol". + + // The $g_list_level global keeps track of when we're inside a list. + // Each time we enter a list, we increment it; when we leave a list, + // we decrement. If it's zero, we're not in a list anymore. + // + // We do this because when we're not inside a list, we want to treat + // something like this: + // + // I recommend upgrading to version + // 8. Oops, now this line is treated + // as a sub-list. + // + // As a single paragraph, despite the fact that the second line starts + // with a digit-period-space sequence. + // + // Whereas when we're inside a list (or sub-list), that line will be + // treated as the start of a sub-list. What a kludge, huh? This is + // an aspect of Markdown's syntax that's hard to parse perfectly + // without resorting to mind-reading. Perhaps the solution is to + // change the syntax rules such that sub-lists must start with a + // starting cardinal number; e.g. "1." or "a.". + + g_list_level++; + + // trim trailing blank lines: + list_str = list_str.replace(/\n{2,}$/, "\n"); + + // attacklab: add sentinel to emulate \z + list_str += "~0"; + + // In the original attacklab showdown, list_type was not given to this function, and anything + // that matched /[*+-]|\d+[.]/ would just create the next
  • , causing this mismatch: + // + // Markdown rendered by WMD rendered by MarkdownSharp + // ------------------------------------------------------------------ + // 1. first 1. first 1. first + // 2. second 2. second 2. second + // - third 3. third * third + // + // We changed this to behave identical to MarkdownSharp. This is the constructed RegEx, + // with {MARKER} being one of \d+[.] or [*+-], depending on list_type: + + /* + list_str = list_str.replace(/ + (^[ \t]*) // leading whitespace = $1 + ({MARKER}) [ \t]+ // list marker = $2 + ([^\r]+? // list item text = $3 + (\n+) + ) + (?= + (~0 | \2 ({MARKER}) [ \t]+) + ) + /gm, function(){...}); + */ + + var marker = _listItemMarkers[list_type]; + var re = new RegExp("(^[ \\t]*)(" + marker + ")[ \\t]+([^\\r]+?(\\n+))(?=(~0|\\1(" + marker + ")[ \\t]+))", "gm"); + var last_item_had_a_double_newline = false; + list_str = list_str.replace(re, + function (wholeMatch, m1, m2, m3) { + var item = m3; + var leading_space = m1; + var ends_with_double_newline = /\n\n$/.test(item); + var contains_double_newline = ends_with_double_newline || item.search(/\n{2,}/) > -1; + + if (contains_double_newline || last_item_had_a_double_newline) { + item = _RunBlockGamut(_Outdent(item), /* doNotUnhash = */true); + } + else { + // Recursion for sub-lists: + item = _DoLists(_Outdent(item), /* isInsideParagraphlessListItem= */ true); + item = item.replace(/\n$/, ""); // chomp(item) + if (!isInsideParagraphlessListItem) // only the outer-most item should run this, otherwise it's run multiple times for the inner ones + item = _RunSpanGamut(item); + } + last_item_had_a_double_newline = ends_with_double_newline; + return "
  • " + item + "
  • \n"; + } + ); + + // attacklab: strip sentinel + list_str = list_str.replace(/~0/g, ""); + + g_list_level--; + return list_str; + } + + function _DoCodeBlocks(text) { + // + // Process Markdown `
    ` blocks.
    +            //  
    +
    +            /*
    +            text = text.replace(/
    +                (?:\n\n|^)
    +                (                               // $1 = the code block -- one or more lines, starting with a space/tab
    +                    (?:
    +                        (?:[ ]{4}|\t)           // Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
    +                        .*\n+
    +                    )+
    +                )
    +                (\n*[ ]{0,3}[^ \t\n]|(?=~0))    // attacklab: g_tab_width
    +            /g ,function(){...});
    +            */
    +
    +            // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
    +            text += "~0";
    +
    +            text = text.replace(/(?:\n\n|^\n?)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,
    +                function (wholeMatch, m1, m2) {
    +                    var codeblock = m1;
    +                    var nextChar = m2;
    +
    +                    codeblock = _EncodeCode(_Outdent(codeblock));
    +                    codeblock = _Detab(codeblock);
    +                    codeblock = codeblock.replace(/^\n+/g, ""); // trim leading newlines
    +                    codeblock = codeblock.replace(/\n+$/g, ""); // trim trailing whitespace
    +
    +                    codeblock = "
    " + codeblock + "\n
    "; + + return "\n\n" + codeblock + "\n\n" + nextChar; + } + ); + + // attacklab: strip sentinel + text = text.replace(/~0/, ""); + + return text; + } + + function _DoCodeSpans(text) { + // + // * Backtick quotes are used for spans. + // + // * You can use multiple backticks as the delimiters if you want to + // include literal backticks in the code span. So, this input: + // + // Just type ``foo `bar` baz`` at the prompt. + // + // Will translate to: + // + //

    Just type foo `bar` baz at the prompt.

    + // + // There's no arbitrary limit to the number of backticks you + // can use as delimters. If you need three consecutive backticks + // in your code, use four for delimiters, etc. + // + // * You can use spaces to get literal backticks at the edges: + // + // ... type `` `bar` `` ... + // + // Turns to: + // + // ... type `bar` ... + // + + /* + text = text.replace(/ + (^|[^\\`]) // Character before opening ` can't be a backslash or backtick + (`+) // $2 = Opening run of ` + (?!`) // and no more backticks -- match the full run + ( // $3 = The code block + [^\r]*? + [^`] // attacklab: work around lack of lookbehind + ) + \2 // Matching closer + (?!`) + /gm, function(){...}); + */ + + text = text.replace(/(^|[^\\`])(`+)(?!`)([^\r]*?[^`])\2(?!`)/gm, + function (wholeMatch, m1, m2, m3, m4) { + var c = m3; + c = c.replace(/^([ \t]*)/g, ""); // leading whitespace + c = c.replace(/[ \t]*$/g, ""); // trailing whitespace + c = _EncodeCode(c); + c = c.replace(/:\/\//g, "~P"); // to prevent auto-linking. Not necessary in code *blocks*, but in code spans. Will be converted back after the auto-linker runs. + return m1 + "" + c + ""; + } + ); + + return text; + } + + function _EncodeCode(text) { + // + // Encode/escape certain characters inside Markdown code runs. + // The point is that in code, these characters are literals, + // and lose their special Markdown meanings. + // + // Encode all ampersands; HTML entities are not + // entities within a Markdown code span. + text = text.replace(/&/g, "&"); + + // Do the angle bracket song and dance: + text = text.replace(//g, ">"); + + // Now, escape characters that are magic in Markdown: + text = escapeCharacters(text, "\*_{}[]\\", false); + + // jj the line above breaks this: + //--- + + //* Item + + // 1. Subitem + + // special char: * + //--- + + return text; + } + + function _DoItalicsAndBoldStrict(text) { + + if (text.indexOf("*") === -1 && text.indexOf("_") === - 1) + return text; + + text = asciify(text); + + // must go first: + + // (^|[\W_]) Start with a non-letter or beginning of string. Store in \1. + // (?:(?!\1)|(?=^)) Either the next character is *not* the same as the previous, + // or we started at the end of the string (in which case the previous + // group had zero width, so we're still there). Because the next + // character is the marker, this means that if there are e.g. multiple + // underscores in a row, we can only match the left-most ones (which + // prevents foo___bar__ from getting bolded) + // (\*|_) The marker character itself, asterisk or underscore. Store in \2. + // \2 The marker again, since bold needs two. + // (?=\S) The first bolded character cannot be a space. + // ([^\r]*?\S) The actual bolded string. At least one character, and it cannot *end* + // with a space either. Note that like in many other places, [^\r] is + // just a workaround for JS' lack of single-line regexes; it's equivalent + // to a . in an /s regex, because the string cannot contain any \r (they + // are removed in the normalizing step). + // \2\2 The marker character, twice -- end of bold. + // (?!\2) Not followed by another marker character (ensuring that we match the + // rightmost two in a longer row)... + // (?=[\W_]|$) ...but by any other non-word character or the end of string. + text = text.replace(/(^|[\W_])(?:(?!\1)|(?=^))(\*|_)\2(?=\S)([^\r]*?\S)\2\2(?!\2)(?=[\W_]|$)/g, + "$1$3"); + + // This is almost identical to the regex, except 1) there's obviously just one marker + // character, and 2) the italicized string cannot contain the marker character. + text = text.replace(/(^|[\W_])(?:(?!\1)|(?=^))(\*|_)(?=\S)((?:(?!\2)[^\r])*?\S)\2(?!\2)(?=[\W_]|$)/g, + "$1$3"); + + return deasciify(text); + } + + function _DoItalicsAndBold_AllowIntrawordWithAsterisk(text) { + + if (text.indexOf("*") === -1 && text.indexOf("_") === - 1) + return text; + + text = asciify(text); + + // must go first: + // (?=[^\r][*_]|[*_]) Optimization only, to find potentially relevant text portions faster. Minimally slower in Chrome, but much faster in IE. + // ( Store in \1. This is the last character before the delimiter + // ^ Either we're at the start of the string (i.e. there is no last character)... + // | ... or we allow one of the following: + // (?= (lookahead; we're not capturing this, just listing legal possibilities) + // \W__ If the delimiter is __, then this last character must be non-word non-underscore (extra-word emphasis only) + // | + // (?!\*)[\W_]\*\* If the delimiter is **, then this last character can be non-word non-asterisk (extra-word emphasis)... + // | + // \w\*\*\w ...or it can be word/underscore, but only if the first bolded character is such a character as well (intra-word emphasis) + // ) + // [^\r] actually capture the character (can't use `.` since it could be \n) + // ) + // (\*\*|__) Store in \2: the actual delimiter + // (?!\2) not followed by the delimiter again (at most one more asterisk/underscore is allowed) + // (?=\S) the first bolded character can't be a space + // ( Store in \3: the bolded string + // + // (?:| Look at all bolded characters except for the last one. Either that's empty, meaning only a single character was bolded... + // [^\r]*? ... otherwise take arbitrary characters, minimally matching; that's all bolded characters except for the last *two* + // (?!\2) the last two characters cannot be the delimiter itself (because that would mean four underscores/asterisks in a row) + // [^\r] capture the next-to-last bolded character + // ) + // (?= lookahead at the very last bolded char and what comes after + // \S_ for underscore-bolding, it can be any non-space + // | + // \w for asterisk-bolding (otherwise the previous alternative would've matched, since \w implies \S), either the last char is word/underscore... + // | + // \S\*\*(?:[\W_]|$) ... or it's any other non-space, but in that case the character *after* the delimiter may not be a word character + // ) + // . actually capture the last character (can use `.` this time because the lookahead ensures \S in all cases) + // ) + // (?= lookahead; list the legal possibilities for the closing delimiter and its following character + // __(?:\W|$) for underscore-bolding, the following character (if any) must be non-word non-underscore + // | + // \*\*(?:[^*]|$) for asterisk-bolding, any non-asterisk is allowed (note we already ensured above that it's not a word character if the last bolded character wasn't one) + // ) + // \2 actually capture the closing delimiter (and make sure that it matches the opening one) + + text = text.replace(/(?=[^\r][*_]|[*_])(^|(?=\W__|(?!\*)[\W_]\*\*|\w\*\*\w)[^\r])(\*\*|__)(?!\2)(?=\S)((?:|[^\r]*?(?!\2)[^\r])(?=\S_|\w|\S\*\*(?:[\W_]|$)).)(?=__(?:\W|$)|\*\*(?:[^*]|$))\2/g, + "$1$3"); + + // now : + // (?=[^\r][*_]|[*_]) Optimization, see above. + // ( Store in \1. This is the last character before the delimiter + // ^ Either we're at the start of the string (i.e. there is no last character)... + // | ... or we allow one of the following: + // (?= (lookahead; we're not capturing this, just listing legal possibilities) + // \W_ If the delimiter is _, then this last character must be non-word non-underscore (extra-word emphasis only) + // | + // (?!\*) otherwise, we list two possiblities for * as the delimiter; in either case, the last characters cannot be an asterisk itself + // (?: + // [\W_]\* this last character can be non-word (extra-word emphasis)... + // | + // \D\*(?=\w)\D ...or it can be word (otherwise the first alternative would've matched), but only if + // a) the first italicized character is such a character as well (intra-word emphasis), and + // b) neither character on either side of the asterisk is a digit + // ) + // ) + // [^\r] actually capture the character (can't use `.` since it could be \n) + // ) + // (\*|_) Store in \2: the actual delimiter + // (?!\2\2\2) not followed by more than two more instances of the delimiter + // (?=\S) the first italicized character can't be a space + // ( Store in \3: the italicized string + // (?:(?!\2)[^\r])*? arbitrary characters except for the delimiter itself, minimally matching + // (?= lookahead at the very last italicized char and what comes after + // [^\s_]_ for underscore-italicizing, it can be any non-space non-underscore + // | + // (?=\w)\D\*\D for asterisk-italicizing, either the last char is word/underscore *and* neither character on either side of the asterisk is a digit... + // | + // [^\s*]\*(?:[\W_]|$) ... or that last char is any other non-space non-asterisk, but then the character after the delimiter (if any) must be non-word + // ) + // . actually capture the last character (can use `.` this time because the lookahead ensures \S in all cases) + // ) + // (?= lookahead; list the legal possibilities for the closing delimiter and its following character + // _(?:\W|$) for underscore-italicizing, the following character (if any) must be non-word non-underscore + // | + // \*(?:[^*]|$) for asterisk-italicizing, any non-asterisk is allowed; all other restrictions have already been ensured in the previous lookahead + // ) + // \2 actually capture the closing delimiter (and make sure that it matches the opening one) + + text = text.replace(/(?=[^\r][*_]|[*_])(^|(?=\W_|(?!\*)(?:[\W_]\*|\D\*(?=\w)\D))[^\r])(\*|_)(?!\2\2\2)(?=\S)((?:(?!\2)[^\r])*?(?=[^\s_]_|(?=\w)\D\*\D|[^\s*]\*(?:[\W_]|$)).)(?=_(?:\W|$)|\*(?:[^*]|$))\2/g, + "$1$3"); + + return deasciify(text); + } + + + function _DoBlockQuotes(text) { + + /* + text = text.replace(/ + ( // Wrap whole match in $1 + ( + ^[ \t]*>[ \t]? // '>' at the start of a line + .+\n // rest of the first line + (.+\n)* // subsequent consecutive lines + \n* // blanks + )+ + ) + /gm, function(){...}); + */ + + text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm, + function (wholeMatch, m1) { + var bq = m1; + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + + bq = bq.replace(/^[ \t]*>[ \t]?/gm, "~0"); // trim one level of quoting + + // attacklab: clean up hack + bq = bq.replace(/~0/g, ""); + + bq = bq.replace(/^[ \t]+$/gm, ""); // trim whitespace-only lines + bq = _RunBlockGamut(bq); // recurse + + bq = bq.replace(/(^|\n)/g, "$1 "); + // These leading spaces screw with
     content, so we need to fix that:
    +                    bq = bq.replace(
    +                            /(\s*
    [^\r]+?<\/pre>)/gm,
    +                        function (wholeMatch, m1) {
    +                            var pre = m1;
    +                            // attacklab: hack around Konqueror 3.5.4 bug:
    +                            pre = pre.replace(/^  /mg, "~0");
    +                            pre = pre.replace(/~0/g, "");
    +                            return pre;
    +                        });
    +
    +                    return hashBlock("
    \n" + bq + "\n
    "); + } + ); + return text; + } + + function _FormParagraphs(text, doNotUnhash) { + // + // Params: + // $text - string to process with html

    tags + // + + // Strip leading and trailing lines: + text = text.replace(/^\n+/g, ""); + text = text.replace(/\n+$/g, ""); + + var grafs = text.split(/\n{2,}/g); + var grafsOut = []; + + var markerRe = /~K(\d+)K/; + + // + // Wrap

    tags. + // + var end = grafs.length; + for (var i = 0; i < end; i++) { + var str = grafs[i]; + + // if this is an HTML marker, copy it + if (markerRe.test(str)) { + grafsOut.push(str); + } + else if (/\S/.test(str)) { + str = _RunSpanGamut(str); + str = str.replace(/^([ \t]*)/g, "

    "); + str += "

    " + grafsOut.push(str); + } + + } + // + // Unhashify HTML blocks + // + if (!doNotUnhash) { + end = grafsOut.length; + for (var i = 0; i < end; i++) { + var foundAny = true; + while (foundAny) { // we may need several runs, since the data may be nested + foundAny = false; + grafsOut[i] = grafsOut[i].replace(/~K(\d+)K/g, function (wholeMatch, id) { + foundAny = true; + return g_html_blocks[id]; + }); + } + } + } + return grafsOut.join("\n\n"); + } + + function _EncodeAmpsAndAngles(text) { + // Smart processing for ampersands and angle brackets that need to be encoded. + + // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin: + // http://bumppo.net/projects/amputator/ + text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, "&"); + + // Encode naked <'s + text = text.replace(/<(?![a-z\/?!]|~D)/gi, "<"); + + return text; + } + + function _EncodeBackslashEscapes(text) { + // + // Parameter: String. + // Returns: The string, with after processing the following backslash + // escape sequences. + // + + // attacklab: The polite way to do this is with the new + // escapeCharacters() function: + // + // text = escapeCharacters(text,"\\",true); + // text = escapeCharacters(text,"`*_{}[]()>#+-.!",true); + // + // ...but we're sidestepping its use of the (slow) RegExp constructor + // as an optimization for Firefox. This function gets called a LOT. + + text = text.replace(/\\(\\)/g, escapeCharacters_callback); + text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g, escapeCharacters_callback); + return text; + } + + var charInsideUrl = "[-A-Z0-9+&@#/%?=~_|[\\]()!:,.;]", + charEndingUrl = "[-A-Z0-9+&@#/%=~_|[\\])]", + autoLinkRegex = new RegExp("(=\"|<)?\\b(https?|ftp)(://" + charInsideUrl + "*" + charEndingUrl + ")(?=$|\\W)", "gi"), + endCharRegex = new RegExp(charEndingUrl, "i"); + + function handleTrailingParens(wholeMatch, lookbehind, protocol, link) { + if (lookbehind) + return wholeMatch; + if (link.charAt(link.length - 1) !== ")") + return "<" + protocol + link + ">"; + var parens = link.match(/[()]/g); + var level = 0; + for (var i = 0; i < parens.length; i++) { + if (parens[i] === "(") { + if (level <= 0) + level = 1; + else + level++; + } + else { + level--; + } + } + var tail = ""; + if (level < 0) { + var re = new RegExp("\\){1," + (-level) + "}$"); + link = link.replace(re, function (trailingParens) { + tail = trailingParens; + return ""; + }); + } + if (tail) { + var lastChar = link.charAt(link.length - 1); + if (!endCharRegex.test(lastChar)) { + tail = lastChar + tail; + link = link.substr(0, link.length - 1); + } + } + return "<" + protocol + link + ">" + tail; + } + + function _DoAutoLinks(text) { + + // note that at this point, all other URL in the text are already hyperlinked as
    + // *except* for the case + + // automatically add < and > around unadorned raw hyperlinks + // must be preceded by a non-word character (and not by =" or <) and followed by non-word/EOF character + // simulating the lookbehind in a consuming way is okay here, since a URL can neither and with a " nor + // with a <, so there is no risk of overlapping matches. + text = text.replace(autoLinkRegex, handleTrailingParens); + + // autolink anything like + + + var replacer = function (wholematch, m1) { + var url = attributeSafeUrl(m1); + + return "" + pluginHooks.plainLinkText(m1) + ""; + }; + text = text.replace(/<((https?|ftp):[^'">\s]+)>/gi, replacer); + + // Email addresses: + /* + text = text.replace(/ + < + (?:mailto:)? + ( + [-.\w]+ + \@ + [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+ + ) + > + /gi, _DoAutoLinks_callback()); + */ + + /* disabling email autolinking, since we don't do that on the server, either + text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi, + function(wholeMatch,m1) { + return _EncodeEmailAddress( _UnescapeSpecialChars(m1) ); + } + ); + */ + return text; + } + + function _UnescapeSpecialChars(text) { + // + // Swap back in all the special characters we've hidden. + // + text = text.replace(/~E(\d+)E/g, + function (wholeMatch, m1) { + var charCodeToReplace = parseInt(m1); + return String.fromCharCode(charCodeToReplace); + } + ); + return text; + } + + function _Outdent(text) { + // + // Remove one level of line-leading tabs or spaces + // + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + + text = text.replace(/^(\t|[ ]{1,4})/gm, "~0"); // attacklab: g_tab_width + + // attacklab: clean up hack + text = text.replace(/~0/g, "") + + return text; + } + + function _Detab(text) { + if (!/\t/.test(text)) + return text; + + var spaces = [" ", " ", " ", " "], + skew = 0, + v; + + return text.replace(/[\n\t]/g, function (match, offset) { + if (match === "\n") { + skew = offset + 1; + return match; + } + v = (offset - skew) % 4; + skew = offset + 1; + return spaces[v]; + }); + } + + // + // attacklab: Utility functions + // + + function attributeSafeUrl(url) { + url = attributeEncode(url); + url = escapeCharacters(url, "*_:()[]") + return url; + } + + function escapeCharacters(text, charsToEscape, afterBackslash) { + // First we have to escape the escape characters so that + // we can build a character class out of them + var regexString = "([" + charsToEscape.replace(/([\[\]\\])/g, "\\$1") + "])"; + + if (afterBackslash) { + regexString = "\\\\" + regexString; + } + + var regex = new RegExp(regexString, "g"); + text = text.replace(regex, escapeCharacters_callback); + + return text; + } + + + function escapeCharacters_callback(wholeMatch, m1) { + var charCodeToEscape = m1.charCodeAt(0); + return "~E" + charCodeToEscape + "E"; + } + + }; // end of the Markdown.Converter constructor + +})(); \ No newline at end of file diff --git a/assets/public/editor/Markdown.Editor.js b/assets/public/editor/Markdown.Editor.js new file mode 100644 index 0000000..59df829 --- /dev/null +++ b/assets/public/editor/Markdown.Editor.js @@ -0,0 +1,2245 @@ +//modification JB: CTRL+L + CTRL+U disabled: //doClick(buttons.link); doClick(buttons.ulist); + +// needs Markdown.Converter.js at the moment + +(function () { + + var util = {}, + position = {}, + ui = {}, + doc = window.document, + re = window.RegExp, + nav = window.navigator, + SETTINGS = { lineLength: 72 }, + + // Used to work around some browser bugs where we can't use feature testing. + uaSniffed = { + isIE: /msie/.test(nav.userAgent.toLowerCase()), + isIE_5or6: /msie 6/.test(nav.userAgent.toLowerCase()) || /msie 5/.test(nav.userAgent.toLowerCase()), + isOpera: /opera/.test(nav.userAgent.toLowerCase()) + }; + + var defaultsStrings = { + bold: "Strong Ctrl+B", + boldexample: "strong text", + + italic: "Emphasis Ctrl+I", + italicexample: "emphasized text", + + link: "Hyperlink Ctrl+L", + linkdescription: "enter link description here", + linkdialog: "

    Insert Hyperlink

    http://example.com/ \"optional title\"

    ", + + quote: "Blockquote
    Ctrl+Q", + quoteexample: "Blockquote", + + code: "Code Sample
     Ctrl+K",
    +        codeexample: "enter code here",
    +
    +        image: "Image  Ctrl+G",
    +        imagedescription: "enter image description here",
    +        imagedialog: "

    Insert Image

    http://example.com/images/diagram.jpg \"optional title\"

    Need
    free image hosting?

    ", + + olist: "Numbered List
      Ctrl+O", + ulist: "Bulleted List
        Ctrl+U", + litem: "List item", + + heading: "Heading

        /

        Ctrl+H", + headingexample: "Heading", + + hr: "Horizontal Rule
        Ctrl+R", + + undo: "Undo - Ctrl+Z", + redo: "Redo - Ctrl+Y", + redomac: "Redo - Ctrl+Shift+Z", + + help: "Markdown Editing Help" + }; + + + // ------------------------------------------------------------------- + // YOUR CHANGES GO HERE + // + // I've tried to localize the things you are likely to change to + // this area. + // ------------------------------------------------------------------- + + // The default text that appears in the dialog input box when entering + // links. + var imageDefaultText = "http://"; + var linkDefaultText = "http://"; + + // ------------------------------------------------------------------- + // END OF YOUR CHANGES + // ------------------------------------------------------------------- + + // options, if given, can have the following properties: + // options.helpButton = { handler: yourEventHandler } + // options.strings = { italicexample: "slanted text" } + // `yourEventHandler` is the click handler for the help button. + // If `options.helpButton` isn't given, not help button is created. + // `options.strings` can have any or all of the same properties as + // `defaultStrings` above, so you can just override some string displayed + // to the user on a case-by-case basis, or translate all strings to + // a different language. + // + // For backwards compatibility reasons, the `options` argument can also + // be just the `helpButton` object, and `strings.help` can also be set via + // `helpButton.title`. This should be considered legacy. + // + // The constructed editor object has the methods: + // - getConverter() returns the markdown converter object that was passed to the constructor + // - run() actually starts the editor; should be called after all necessary plugins are registered. Calling this more than once is a no-op. + // - refreshPreview() forces the preview to be updated. This method is only available after run() was called. + Markdown.Editor = function (markdownConverter, idPostfix, options) { + + options = options || {}; + + if (typeof options.handler === "function") { //backwards compatible behavior + options = { helpButton: options }; + } + options.strings = options.strings || {}; + if (options.helpButton) { + options.strings.help = options.strings.help || options.helpButton.title; + } + var getString = function (identifier) { return options.strings[identifier] || defaultsStrings[identifier]; } + + idPostfix = idPostfix || ""; + + var hooks = this.hooks = new Markdown.HookCollection(); + hooks.addNoop("onPreviewRefresh"); // called with no arguments after the preview has been refreshed + hooks.addNoop("postBlockquoteCreation"); // called with the user's selection *after* the blockquote was created; should return the actual to-be-inserted text + hooks.addFalse("insertImageDialog"); /* called with one parameter: a callback to be called with the URL of the image. If the application creates + * its own image insertion dialog, this hook should return true, and the callback should be called with the chosen + * image url (or null if the user cancelled). If this hook returns false, the default dialog will be used. + */ + + this.getConverter = function () { return markdownConverter; } + + var that = this, + panels; + + this.run = function () { + if (panels) + return; // already initialized + + panels = new PanelCollection(idPostfix); + var commandManager = new CommandManager(hooks, getString); + var previewManager = new PreviewManager(markdownConverter, panels, function () { hooks.onPreviewRefresh(); }); + var undoManager, uiManager; + + if (!/\?noundo/.test(doc.location.href)) { + undoManager = new UndoManager(function () { + previewManager.refresh(); + if (uiManager) // not available on the first call + uiManager.setUndoRedoButtonStates(); + }, panels); + this.textOperation = function (f) { + undoManager.setCommandMode(); + f(); + that.refreshPreview(); + } + } + + uiManager = new UIManager(idPostfix, panels, undoManager, previewManager, commandManager, options.helpButton, getString); + uiManager.setUndoRedoButtonStates(); + + var forceRefresh = that.refreshPreview = function () { previewManager.refresh(true); }; + + forceRefresh(); + }; + + } + + // before: contains all the text in the input box BEFORE the selection. + // after: contains all the text in the input box AFTER the selection. + function Chunks() { } + + // startRegex: a regular expression to find the start tag + // endRegex: a regular expresssion to find the end tag + Chunks.prototype.findTags = function (startRegex, endRegex) { + + var chunkObj = this; + var regex; + + if (startRegex) { + + regex = util.extendRegExp(startRegex, "", "$"); + + this.before = this.before.replace(regex, + function (match) { + chunkObj.startTag = chunkObj.startTag + match; + return ""; + }); + + regex = util.extendRegExp(startRegex, "^", ""); + + this.selection = this.selection.replace(regex, + function (match) { + chunkObj.startTag = chunkObj.startTag + match; + return ""; + }); + } + + if (endRegex) { + + regex = util.extendRegExp(endRegex, "", "$"); + + this.selection = this.selection.replace(regex, + function (match) { + chunkObj.endTag = match + chunkObj.endTag; + return ""; + }); + + regex = util.extendRegExp(endRegex, "^", ""); + + this.after = this.after.replace(regex, + function (match) { + chunkObj.endTag = match + chunkObj.endTag; + return ""; + }); + } + }; + + // If remove is false, the whitespace is transferred + // to the before/after regions. + // + // If remove is true, the whitespace disappears. + Chunks.prototype.trimWhitespace = function (remove) { + var beforeReplacer, afterReplacer, that = this; + if (remove) { + beforeReplacer = afterReplacer = ""; + } else { + beforeReplacer = function (s) { that.before += s; return ""; } + afterReplacer = function (s) { that.after = s + that.after; return ""; } + } + + this.selection = this.selection.replace(/^(\s*)/, beforeReplacer).replace(/(\s*)$/, afterReplacer); + }; + + + Chunks.prototype.skipLines = function (nLinesBefore, nLinesAfter, findExtraNewlines) { + + if (nLinesBefore === undefined) { + nLinesBefore = 1; + } + + if (nLinesAfter === undefined) { + nLinesAfter = 1; + } + + nLinesBefore++; + nLinesAfter++; + + var regexText; + var replacementText; + + // chrome bug ... documented at: http://meta.stackexchange.com/questions/63307/blockquote-glitch-in-editor-in-chrome-6-and-7/65985#65985 + if (navigator.userAgent.match(/Chrome/)) { + "X".match(/()./); + } + + this.selection = this.selection.replace(/(^\n*)/, ""); + + this.startTag = this.startTag + re.$1; + + this.selection = this.selection.replace(/(\n*$)/, ""); + this.endTag = this.endTag + re.$1; + this.startTag = this.startTag.replace(/(^\n*)/, ""); + this.before = this.before + re.$1; + this.endTag = this.endTag.replace(/(\n*$)/, ""); + this.after = this.after + re.$1; + + if (this.before) { + + regexText = replacementText = ""; + + while (nLinesBefore--) { + regexText += "\\n?"; + replacementText += "\n"; + } + + if (findExtraNewlines) { + regexText = "\\n*"; + } + this.before = this.before.replace(new re(regexText + "$", ""), replacementText); + } + + if (this.after) { + + regexText = replacementText = ""; + + while (nLinesAfter--) { + regexText += "\\n?"; + replacementText += "\n"; + } + if (findExtraNewlines) { + regexText = "\\n*"; + } + + this.after = this.after.replace(new re(regexText, ""), replacementText); + } + }; + + // end of Chunks + + // A collection of the important regions on the page. + // Cached so we don't have to keep traversing the DOM. + // Also holds ieCachedRange and ieCachedScrollTop, where necessary; working around + // this issue: + // Internet explorer has problems with CSS sprite buttons that use HTML + // lists. When you click on the background image "button", IE will + // select the non-existent link text and discard the selection in the + // textarea. The solution to this is to cache the textarea selection + // on the button's mousedown event and set a flag. In the part of the + // code where we need to grab the selection, we check for the flag + // and, if it's set, use the cached area instead of querying the + // textarea. + // + // This ONLY affects Internet Explorer (tested on versions 6, 7 + // and 8) and ONLY on button clicks. Keyboard shortcuts work + // normally since the focus never leaves the textarea. + function PanelCollection(postfix) { + this.buttonBar = doc.getElementById("wmd-button-bar" + postfix); + this.preview = doc.getElementById("wmd-preview" + postfix); + this.input = doc.getElementById("wmd-input" + postfix); + }; + + // Returns true if the DOM element is visible, false if it's hidden. + // Checks if display is anything other than none. + util.isVisible = function (elem) { + + if (window.getComputedStyle) { + // Most browsers + return window.getComputedStyle(elem, null).getPropertyValue("display") !== "none"; + } + else if (elem.currentStyle) { + // IE + return elem.currentStyle["display"] !== "none"; + } + }; + + + // Adds a listener callback to a DOM element which is fired on a specified + // event. + util.addEvent = function (elem, event, listener) { + if (elem.attachEvent) { + // IE only. The "on" is mandatory. + elem.attachEvent("on" + event, listener); + } + else { + // Other browsers. + elem.addEventListener(event, listener, false); + } + }; + + + // Removes a listener callback from a DOM element which is fired on a specified + // event. + util.removeEvent = function (elem, event, listener) { + if (elem.detachEvent) { + // IE only. The "on" is mandatory. + elem.detachEvent("on" + event, listener); + } + else { + // Other browsers. + elem.removeEventListener(event, listener, false); + } + }; + + // Converts \r\n and \r to \n. + util.fixEolChars = function (text) { + text = text.replace(/\r\n/g, "\n"); + text = text.replace(/\r/g, "\n"); + return text; + }; + + // Extends a regular expression. Returns a new RegExp + // using pre + regex + post as the expression. + // Used in a few functions where we have a base + // expression and we want to pre- or append some + // conditions to it (e.g. adding "$" to the end). + // The flags are unchanged. + // + // regex is a RegExp, pre and post are strings. + util.extendRegExp = function (regex, pre, post) { + + if (pre === null || pre === undefined) { + pre = ""; + } + if (post === null || post === undefined) { + post = ""; + } + + var pattern = regex.toString(); + var flags; + + // Replace the flags with empty space and store them. + pattern = pattern.replace(/\/([gim]*)$/, function (wholeMatch, flagsPart) { + flags = flagsPart; + return ""; + }); + + // Remove the slash delimiters on the regular expression. + pattern = pattern.replace(/(^\/|\/$)/g, ""); + pattern = pre + pattern + post; + + return new re(pattern, flags); + } + + // UNFINISHED + // The assignment in the while loop makes jslint cranky. + // I'll change it to a better loop later. + position.getTop = function (elem, isInner) { + var result = elem.offsetTop; + if (!isInner) { + while (elem = elem.offsetParent) { + result += elem.offsetTop; + } + } + return result; + }; + + position.getHeight = function (elem) { + return elem.offsetHeight || elem.scrollHeight; + }; + + position.getWidth = function (elem) { + return elem.offsetWidth || elem.scrollWidth; + }; + + position.getPageSize = function () { + + var scrollWidth, scrollHeight; + var innerWidth, innerHeight; + + // It's not very clear which blocks work with which browsers. + if (self.innerHeight && self.scrollMaxY) { + scrollWidth = doc.body.scrollWidth; + scrollHeight = self.innerHeight + self.scrollMaxY; + } + else if (doc.body.scrollHeight > doc.body.offsetHeight) { + scrollWidth = doc.body.scrollWidth; + scrollHeight = doc.body.scrollHeight; + } + else { + scrollWidth = doc.body.offsetWidth; + scrollHeight = doc.body.offsetHeight; + } + + if (self.innerHeight) { + // Non-IE browser + innerWidth = self.innerWidth; + innerHeight = self.innerHeight; + } + else if (doc.documentElement && doc.documentElement.clientHeight) { + // Some versions of IE (IE 6 w/ a DOCTYPE declaration) + innerWidth = doc.documentElement.clientWidth; + innerHeight = doc.documentElement.clientHeight; + } + else if (doc.body) { + // Other versions of IE + innerWidth = doc.body.clientWidth; + innerHeight = doc.body.clientHeight; + } + + var maxWidth = Math.max(scrollWidth, innerWidth); + var maxHeight = Math.max(scrollHeight, innerHeight); + return [maxWidth, maxHeight, innerWidth, innerHeight]; + }; + + // Handles pushing and popping TextareaStates for undo/redo commands. + // I should rename the stack variables to list. + function UndoManager(callback, panels) { + + var undoObj = this; + var undoStack = []; // A stack of undo states + var stackPtr = 0; // The index of the current state + var mode = "none"; + var lastState; // The last state + var timer; // The setTimeout handle for cancelling the timer + var inputStateObj; + + // Set the mode for later logic steps. + var setMode = function (newMode, noSave) { + if (mode != newMode) { + mode = newMode; + if (!noSave) { + saveState(); + } + } + + if (!uaSniffed.isIE || mode != "moving") { + timer = setTimeout(refreshState, 1); + } + else { + inputStateObj = null; + } + }; + + var refreshState = function (isInitialState) { + inputStateObj = new TextareaState(panels, isInitialState); + timer = undefined; + }; + + this.setCommandMode = function () { + mode = "command"; + saveState(); + timer = setTimeout(refreshState, 0); + }; + + this.canUndo = function () { + return stackPtr > 1; + }; + + this.canRedo = function () { + if (undoStack[stackPtr + 1]) { + return true; + } + return false; + }; + + // Removes the last state and restores it. + this.undo = function () { + + if (undoObj.canUndo()) { + if (lastState) { + // What about setting state -1 to null or checking for undefined? + lastState.restore(); + lastState = null; + } + else { + undoStack[stackPtr] = new TextareaState(panels); + undoStack[--stackPtr].restore(); + + if (callback) { + callback(); + } + } + } + + mode = "none"; + panels.input.focus(); + refreshState(); + }; + + // Redo an action. + this.redo = function () { + + if (undoObj.canRedo()) { + + undoStack[++stackPtr].restore(); + + if (callback) { + callback(); + } + } + + mode = "none"; + panels.input.focus(); + refreshState(); + }; + + // Push the input area state to the stack. + var saveState = function () { + var currState = inputStateObj || new TextareaState(panels); + + if (!currState) { + return false; + } + if (mode == "moving") { + if (!lastState) { + lastState = currState; + } + return; + } + if (lastState) { + if (undoStack[stackPtr - 1].text != lastState.text) { + undoStack[stackPtr++] = lastState; + } + lastState = null; + } + undoStack[stackPtr++] = currState; + undoStack[stackPtr + 1] = null; + if (callback) { + callback(); + } + }; + + var handleCtrlYZ = function (event) { + + var handled = false; + + if ((event.ctrlKey || event.metaKey) && !event.altKey) { + + // IE and Opera do not support charCode. + var keyCode = event.charCode || event.keyCode; + var keyCodeChar = String.fromCharCode(keyCode); + + switch (keyCodeChar.toLowerCase()) { + + case "y": + undoObj.redo(); + handled = true; + break; + + case "z": + if (!event.shiftKey) { + undoObj.undo(); + } + else { + undoObj.redo(); + } + handled = true; + break; + } + } + + if (handled) { + if (event.preventDefault) { + event.preventDefault(); + } + if (window.event) { + window.event.returnValue = false; + } + return; + } + }; + + // Set the mode depending on what is going on in the input area. + var handleModeChange = function (event) { + + if (!event.ctrlKey && !event.metaKey) { + + var keyCode = event.keyCode; + + if ((keyCode >= 33 && keyCode <= 40) || (keyCode >= 63232 && keyCode <= 63235)) { + // 33 - 40: page up/dn and arrow keys + // 63232 - 63235: page up/dn and arrow keys on safari + setMode("moving"); + } + else if (keyCode == 8 || keyCode == 46 || keyCode == 127) { + // 8: backspace + // 46: delete + // 127: delete + setMode("deleting"); + } + else if (keyCode == 13) { + // 13: Enter + setMode("newlines"); + } + else if (keyCode == 27) { + // 27: escape + setMode("escape"); + } + else if ((keyCode < 16 || keyCode > 20) && keyCode != 91) { + // 16-20 are shift, etc. + // 91: left window key + // I think this might be a little messed up since there are + // a lot of nonprinting keys above 20. + setMode("typing"); + } + } + }; + + var setEventHandlers = function () { + util.addEvent(panels.input, "keypress", function (event) { + // keyCode 89: y + // keyCode 90: z + if ((event.ctrlKey || event.metaKey) && !event.altKey && (event.keyCode == 89 || event.keyCode == 90)) { + event.preventDefault(); + } + }); + + var handlePaste = function () { + if (uaSniffed.isIE || (inputStateObj && inputStateObj.text != panels.input.value)) { + if (timer == undefined) { + mode = "paste"; + saveState(); + refreshState(); + } + } + }; + + util.addEvent(panels.input, "keydown", handleCtrlYZ); + util.addEvent(panels.input, "keydown", handleModeChange); + util.addEvent(panels.input, "mousedown", function () { + setMode("moving"); + }); + + panels.input.onpaste = handlePaste; + panels.input.ondrop = handlePaste; + }; + + var init = function () { + setEventHandlers(); + refreshState(true); + saveState(); + }; + + init(); + } + + // end of UndoManager + + // The input textarea state/contents. + // This is used to implement undo/redo by the undo manager. + function TextareaState(panels, isInitialState) { + + // Aliases + var stateObj = this; + var inputArea = panels.input; + this.init = function () { + if (!util.isVisible(inputArea)) { + return; + } + if (!isInitialState && doc.activeElement && doc.activeElement !== inputArea) { // this happens when tabbing out of the input box + return; + } + + this.setInputAreaSelectionStartEnd(); + this.scrollTop = inputArea.scrollTop; + if (!this.text && inputArea.selectionStart || inputArea.selectionStart === 0) { + this.text = inputArea.value; + } + + } + + // Sets the selected text in the input box after we've performed an + // operation. + this.setInputAreaSelection = function () { + + if (!util.isVisible(inputArea)) { + return; + } + + if (inputArea.selectionStart !== undefined && !uaSniffed.isOpera) { + + inputArea.focus(); + inputArea.selectionStart = stateObj.start; + inputArea.selectionEnd = stateObj.end; + inputArea.scrollTop = stateObj.scrollTop; + } + else if (doc.selection) { + + if (doc.activeElement && doc.activeElement !== inputArea) { + return; + } + + inputArea.focus(); + var range = inputArea.createTextRange(); + range.moveStart("character", -inputArea.value.length); + range.moveEnd("character", -inputArea.value.length); + range.moveEnd("character", stateObj.end); + range.moveStart("character", stateObj.start); + range.select(); + } + }; + + this.setInputAreaSelectionStartEnd = function () { + + if (!panels.ieCachedRange && (inputArea.selectionStart || inputArea.selectionStart === 0)) { + + stateObj.start = inputArea.selectionStart; + stateObj.end = inputArea.selectionEnd; + } + else if (doc.selection) { + + stateObj.text = util.fixEolChars(inputArea.value); + + // IE loses the selection in the textarea when buttons are + // clicked. On IE we cache the selection. Here, if something is cached, + // we take it. + var range = panels.ieCachedRange || doc.selection.createRange(); + + var fixedRange = util.fixEolChars(range.text); + var marker = "\x07"; + var markedRange = marker + fixedRange + marker; + range.text = markedRange; + var inputText = util.fixEolChars(inputArea.value); + + range.moveStart("character", -markedRange.length); + range.text = fixedRange; + + stateObj.start = inputText.indexOf(marker); + stateObj.end = inputText.lastIndexOf(marker) - marker.length; + + var len = stateObj.text.length - util.fixEolChars(inputArea.value).length; + + if (len) { + range.moveStart("character", -fixedRange.length); + while (len--) { + fixedRange += "\n"; + stateObj.end += 1; + } + range.text = fixedRange; + } + + if (panels.ieCachedRange) + stateObj.scrollTop = panels.ieCachedScrollTop; // this is set alongside with ieCachedRange + + panels.ieCachedRange = null; + + this.setInputAreaSelection(); + } + }; + + // Restore this state into the input area. + this.restore = function () { + + if (stateObj.text != undefined && stateObj.text != inputArea.value) { + inputArea.value = stateObj.text; + } + this.setInputAreaSelection(); + inputArea.scrollTop = stateObj.scrollTop; + }; + + // Gets a collection of HTML chunks from the inptut textarea. + this.getChunks = function () { + + var chunk = new Chunks(); + chunk.before = util.fixEolChars(stateObj.text.substring(0, stateObj.start)); + chunk.startTag = ""; + chunk.selection = util.fixEolChars(stateObj.text.substring(stateObj.start, stateObj.end)); + chunk.endTag = ""; + chunk.after = util.fixEolChars(stateObj.text.substring(stateObj.end)); + chunk.scrollTop = stateObj.scrollTop; + + return chunk; + }; + + // Sets the TextareaState properties given a chunk of markdown. + this.setChunks = function (chunk) { + + chunk.before = chunk.before + chunk.startTag; + chunk.after = chunk.endTag + chunk.after; + + this.start = chunk.before.length; + this.end = chunk.before.length + chunk.selection.length; + this.text = chunk.before + chunk.selection + chunk.after; + this.scrollTop = chunk.scrollTop; + }; + this.init(); + }; + + function PreviewManager(converter, panels, previewRefreshCallback) { + + var managerObj = this; + var timeout; + var elapsedTime; + var oldInputText; + var maxDelay = 3000; + var startType = "delayed"; // The other legal value is "manual" + + // Adds event listeners to elements + var setupEvents = function (inputElem, listener) { + + util.addEvent(inputElem, "input", listener); + inputElem.onpaste = listener; + inputElem.ondrop = listener; + + util.addEvent(inputElem, "keypress", listener); + util.addEvent(inputElem, "keydown", listener); + }; + + var getDocScrollTop = function () { + + var result = 0; + + if (window.innerHeight) { + result = window.pageYOffset; + } + else + if (doc.documentElement && doc.documentElement.scrollTop) { + result = doc.documentElement.scrollTop; + } + else + if (doc.body) { + result = doc.body.scrollTop; + } + + return result; + }; + + var makePreviewHtml = function () { + + // If there is no registered preview panel + // there is nothing to do. + if (!panels.preview) + return; + + + var text = panels.input.value; + if (text && text == oldInputText) { + return; // Input text hasn't changed. + } + else { + oldInputText = text; + } + + var prevTime = new Date().getTime(); + + text = converter.makeHtml(text); + + // Calculate the processing time of the HTML creation. + // It's used as the delay time in the event listener. + var currTime = new Date().getTime(); + elapsedTime = currTime - prevTime; + + pushPreviewHtml(text); + }; + + // setTimeout is already used. Used as an event listener. + var applyTimeout = function () { + + if (timeout) { + clearTimeout(timeout); + timeout = undefined; + } + + if (startType !== "manual") { + + var delay = 0; + + if (startType === "delayed") { + delay = elapsedTime; + } + + if (delay > maxDelay) { + delay = maxDelay; + } + timeout = setTimeout(makePreviewHtml, delay); + } + }; + + var getScaleFactor = function (panel) { + if (panel.scrollHeight <= panel.clientHeight) { + return 1; + } + return panel.scrollTop / (panel.scrollHeight - panel.clientHeight); + }; + + var setPanelScrollTops = function () { + if (panels.preview) { + panels.preview.scrollTop = (panels.preview.scrollHeight - panels.preview.clientHeight) * getScaleFactor(panels.preview); + } + }; + + this.refresh = function (requiresRefresh) { + + if (requiresRefresh) { + oldInputText = ""; + makePreviewHtml(); + } + else { + applyTimeout(); + } + }; + + this.processingTime = function () { + return elapsedTime; + }; + + var isFirstTimeFilled = true; + + // IE doesn't let you use innerHTML if the element is contained somewhere in a table + // (which is the case for inline editing) -- in that case, detach the element, set the + // value, and reattach. Yes, that *is* ridiculous. + var ieSafePreviewSet = function (text) { + var preview = panels.preview; + var parent = preview.parentNode; + var sibling = preview.nextSibling; + parent.removeChild(preview); + preview.innerHTML = text; + if (!sibling) + parent.appendChild(preview); + else + parent.insertBefore(preview, sibling); + } + + var nonSuckyBrowserPreviewSet = function (text) { + panels.preview.innerHTML = text; + } + + var previewSetter; + + var previewSet = function (text) { + if (previewSetter) + return previewSetter(text); + + try { + nonSuckyBrowserPreviewSet(text); + previewSetter = nonSuckyBrowserPreviewSet; + } catch (e) { + previewSetter = ieSafePreviewSet; + previewSetter(text); + } + }; + + var pushPreviewHtml = function (text) { + + var emptyTop = position.getTop(panels.input) - getDocScrollTop(); + + if (panels.preview) { + previewSet(text); + previewRefreshCallback(); + } + + setPanelScrollTops(); + + if (isFirstTimeFilled) { + isFirstTimeFilled = false; + return; + } + + var fullTop = position.getTop(panels.input) - getDocScrollTop(); + + if (uaSniffed.isIE) { + setTimeout(function () { + window.scrollBy(0, fullTop - emptyTop); + }, 0); + } + else { + window.scrollBy(0, fullTop - emptyTop); + } + }; + + var init = function () { + + setupEvents(panels.input, applyTimeout); + makePreviewHtml(); + + if (panels.preview) { + panels.preview.scrollTop = 0; + } + }; + + init(); + }; + + // Creates the background behind the hyperlink text entry box. + // And download dialog + // Most of this has been moved to CSS but the div creation and + // browser-specific hacks remain here. + ui.createBackground = function () { + + var background = doc.createElement("div"), + style = background.style; + + background.className = "wmd-prompt-background"; + + style.position = "absolute"; + style.top = "0"; + + style.zIndex = "1000"; + + if (uaSniffed.isIE) { + style.filter = "alpha(opacity=50)"; + } + else { + style.opacity = "0.5"; + } + + var pageSize = position.getPageSize(); + style.height = pageSize[1] + "px"; + + if (uaSniffed.isIE) { + style.left = doc.documentElement.scrollLeft; + style.width = doc.documentElement.clientWidth; + } + else { + style.left = "0"; + style.width = "100%"; + } + + doc.body.appendChild(background); + return background; + }; + + // This simulates a modal dialog box and asks for the URL when you + // click the hyperlink or image buttons. + // + // text: The html for the input box. + // defaultInputText: The default value that appears in the input box. + // callback: The function which is executed when the prompt is dismissed, either via OK or Cancel. + // It receives a single argument; either the entered text (if OK was chosen) or null (if Cancel + // was chosen). + ui.prompt = function (text, defaultInputText, callback) { + + // These variables need to be declared at this level since they are used + // in multiple functions. + var dialog; // The dialog box. + var input; // The text box where you enter the hyperlink. + + + if (defaultInputText === undefined) { + defaultInputText = ""; + } + + // Used as a keydown event handler. Esc dismisses the prompt. + // Key code 27 is ESC. + var checkEscape = function (key) { + var code = (key.charCode || key.keyCode); + if (code === 27) { + if (key.stopPropagation) key.stopPropagation(); + close(true); + return false; + } + }; + + // Dismisses the hyperlink input box. + // isCancel is true if we don't care about the input text. + // isCancel is false if we are going to keep the text. + var close = function (isCancel) { + util.removeEvent(doc.body, "keyup", checkEscape); + var text = input.value; + + if (isCancel) { + text = null; + } + else { + // Fixes common pasting errors. + text = text.replace(/^http:\/\/(https?|ftp):\/\//, '$1://'); + if (!/^(?:https?|ftp):\/\//.test(text)) + text = 'http://' + text; + } + + dialog.parentNode.removeChild(dialog); + + callback(text); + return false; + }; + + + + // Create the text input box form/window. + var createDialog = function () { + + // The main dialog box. + dialog = doc.createElement("div"); + dialog.className = "wmd-prompt-dialog"; + dialog.style.padding = "10px;"; + dialog.style.position = "fixed"; + dialog.style.width = "400px"; + dialog.style.zIndex = "1001"; + + // The dialog text. + var question = doc.createElement("div"); + question.innerHTML = text; + question.style.padding = "5px"; + dialog.appendChild(question); + + // The web form container for the text box and buttons. + var form = doc.createElement("form"), + style = form.style; + form.onsubmit = function () { return close(false); }; + style.padding = "0"; + style.margin = "0"; + style.cssFloat = "left"; + style.width = "100%"; + style.textAlign = "center"; + style.position = "relative"; + dialog.appendChild(form); + + // The input text box + input = doc.createElement("input"); + input.type = "text"; + input.value = defaultInputText; + style = input.style; + style.display = "block"; + style.width = "80%"; + style.marginLeft = style.marginRight = "auto"; + form.appendChild(input); + + // The ok button + var okButton = doc.createElement("input"); + okButton.type = "button"; + okButton.onclick = function () { return close(false); }; + okButton.value = "OK"; + style = okButton.style; + style.margin = "10px"; + style.display = "inline"; + style.width = "7em"; + + + // The cancel button + var cancelButton = doc.createElement("input"); + cancelButton.type = "button"; + cancelButton.onclick = function () { return close(true); }; + cancelButton.value = "Cancel"; + style = cancelButton.style; + style.margin = "10px"; + style.display = "inline"; + style.width = "7em"; + + form.appendChild(okButton); + form.appendChild(cancelButton); + + util.addEvent(doc.body, "keyup", checkEscape); + dialog.style.top = "50%"; + dialog.style.left = "50%"; + dialog.style.display = "block"; + if (uaSniffed.isIE_5or6) { + dialog.style.position = "absolute"; + dialog.style.top = doc.documentElement.scrollTop + 200 + "px"; + dialog.style.left = "50%"; + } + doc.body.appendChild(dialog); + + // This has to be done AFTER adding the dialog to the form if you + // want it to be centered. + dialog.style.marginTop = -(position.getHeight(dialog) / 2) + "px"; + dialog.style.marginLeft = -(position.getWidth(dialog) / 2) + "px"; + + }; + + // Why is this in a zero-length timeout? + // Is it working around a browser bug? + setTimeout(function () { + + createDialog(); + + var defTextLen = defaultInputText.length; + if (input.selectionStart !== undefined) { + input.selectionStart = 0; + input.selectionEnd = defTextLen; + } + else if (input.createTextRange) { + var range = input.createTextRange(); + range.collapse(false); + range.moveStart("character", -defTextLen); + range.moveEnd("character", defTextLen); + range.select(); + } + + input.focus(); + }, 0); + }; + + function UIManager(postfix, panels, undoManager, previewManager, commandManager, helpOptions, getString) { + + var inputBox = panels.input, + buttons = {}; // buttons.undo, buttons.link, etc. The actual DOM elements. + + makeSpritedButtonRow(); + + var keyEvent = "keydown"; + if (uaSniffed.isOpera) { + keyEvent = "keypress"; + } + + util.addEvent(inputBox, keyEvent, function (key) { + + // Check to see if we have a button key and, if so execute the callback. + if ((key.ctrlKey || key.metaKey) && !key.altKey && !key.shiftKey) { + + var keyCode = key.charCode || key.keyCode; + var keyCodeStr = String.fromCharCode(keyCode).toLowerCase(); + + switch (keyCodeStr) { + case "b": + doClick(buttons.bold); + break; + case "i": + doClick(buttons.italic); + break; + case "l": + //doClick(buttons.link); + break; + case "q": + doClick(buttons.quote); + break; + case "k": + doClick(buttons.code); + break; + case "g": + doClick(buttons.image); + break; + case "o": + doClick(buttons.olist); + break; + case "u": + //doClick(buttons.ulist); + break; + case "h": + doClick(buttons.heading); + break; + case "r": + doClick(buttons.hr); + break; + case "y": + doClick(buttons.redo); + break; + case "z": + if (key.shiftKey) { + doClick(buttons.redo); + } + else { + doClick(buttons.undo); + } + break; + default: + return; + } + + + if (key.preventDefault) { + key.preventDefault(); + } + + if (window.event) { + window.event.returnValue = false; + } + } + }); + + // Auto-indent on shift-enter + util.addEvent(inputBox, "keyup", function (key) { + if (key.shiftKey && !key.ctrlKey && !key.metaKey) { + var keyCode = key.charCode || key.keyCode; + // Character 13 is Enter + if (keyCode === 13) { + var fakeButton = {}; + fakeButton.textOp = bindCommand("doAutoindent"); + doClick(fakeButton); + } + } + }); + + // special handler because IE clears the context of the textbox on ESC + if (uaSniffed.isIE) { + util.addEvent(inputBox, "keydown", function (key) { + var code = key.keyCode; + if (code === 27) { + return false; + } + }); + } + + + // Perform the button's action. + function doClick(button) { + + inputBox.focus(); + + if (button.textOp) { + + if (undoManager) { + undoManager.setCommandMode(); + } + + var state = new TextareaState(panels); + + if (!state) { + return; + } + + var chunks = state.getChunks(); + + // Some commands launch a "modal" prompt dialog. Javascript + // can't really make a modal dialog box and the WMD code + // will continue to execute while the dialog is displayed. + // This prevents the dialog pattern I'm used to and means + // I can't do something like this: + // + // var link = CreateLinkDialog(); + // makeMarkdownLink(link); + // + // Instead of this straightforward method of handling a + // dialog I have to pass any code which would execute + // after the dialog is dismissed (e.g. link creation) + // in a function parameter. + // + // Yes this is awkward and I think it sucks, but there's + // no real workaround. Only the image and link code + // create dialogs and require the function pointers. + var fixupInputArea = function () { + + inputBox.focus(); + + if (chunks) { + state.setChunks(chunks); + } + + state.restore(); + previewManager.refresh(); + }; + + var noCleanup = button.textOp(chunks, fixupInputArea); + + if (!noCleanup) { + fixupInputArea(); + } + + } + + if (button.execute) { + button.execute(undoManager); + } + }; + + function setupButton(button, isEnabled) { + + var normalYShift = "0px"; + var disabledYShift = "-20px"; + var highlightYShift = "-40px"; + var image = button.getElementsByTagName("span")[0]; + if (isEnabled) { + image.style.backgroundPosition = button.XShift + " " + normalYShift; + button.onmouseover = function () { + image.style.backgroundPosition = this.XShift + " " + highlightYShift; + }; + + button.onmouseout = function () { + image.style.backgroundPosition = this.XShift + " " + normalYShift; + }; + + // IE tries to select the background image "button" text (it's + // implemented in a list item) so we have to cache the selection + // on mousedown. + if (uaSniffed.isIE) { + button.onmousedown = function () { + if (doc.activeElement && doc.activeElement !== panels.input) { // we're not even in the input box, so there's no selection + return; + } + panels.ieCachedRange = document.selection.createRange(); + panels.ieCachedScrollTop = panels.input.scrollTop; + }; + } + + if (!button.isHelp) { + button.onclick = function () { + if (this.onmouseout) { + this.onmouseout(); + } + doClick(this); + return false; + } + } + } + else { + image.style.backgroundPosition = button.XShift + " " + disabledYShift; + button.onmouseover = button.onmouseout = button.onclick = function () { }; + } + } + + function bindCommand(method) { + if (typeof method === "string") + method = commandManager[method]; + return function () { method.apply(commandManager, arguments); } + } + + function makeSpritedButtonRow() { + + var buttonBar = panels.buttonBar; + + var normalYShift = "0px"; + var disabledYShift = "-20px"; + var highlightYShift = "-40px"; + + var buttonRow = document.createElement("ul"); + buttonRow.id = "wmd-button-row" + postfix; + buttonRow.className = 'wmd-button-row'; + buttonRow = buttonBar.appendChild(buttonRow); + var xPosition = 0; + var makeButton = function (id, title, XShift, textOp) { + var button = document.createElement("li"); + button.className = "wmd-button"; + button.style.left = xPosition + "px"; + xPosition += 25; + var buttonImage = document.createElement("span"); + button.id = id + postfix; + button.appendChild(buttonImage); + button.title = title; + button.XShift = XShift; + if (textOp) + button.textOp = textOp; + setupButton(button, true); + buttonRow.appendChild(button); + return button; + }; + var makeSpacer = function (num) { + var spacer = document.createElement("li"); + spacer.className = "wmd-spacer wmd-spacer" + num; + spacer.id = "wmd-spacer" + num + postfix; + buttonRow.appendChild(spacer); + xPosition += 25; + } + + buttons.bold = makeButton("wmd-bold-button", getString("bold"), "0px", bindCommand("doBold")); + buttons.italic = makeButton("wmd-italic-button", getString("italic"), "-20px", bindCommand("doItalic")); + makeSpacer(1); + buttons.link = makeButton("wmd-link-button", getString("link"), "-40px", bindCommand(function (chunk, postProcessing) { + return this.doLinkOrImage(chunk, postProcessing, false); + })); + buttons.quote = makeButton("wmd-quote-button", getString("quote"), "-60px", bindCommand("doBlockquote")); + buttons.code = makeButton("wmd-code-button", getString("code"), "-80px", bindCommand("doCode")); + buttons.image = makeButton("wmd-image-button", getString("image"), "-100px", bindCommand(function (chunk, postProcessing) { + return this.doLinkOrImage(chunk, postProcessing, true); + })); + makeSpacer(2); + buttons.olist = makeButton("wmd-olist-button", getString("olist"), "-120px", bindCommand(function (chunk, postProcessing) { + this.doList(chunk, postProcessing, true); + })); + buttons.ulist = makeButton("wmd-ulist-button", getString("ulist"), "-140px", bindCommand(function (chunk, postProcessing) { + this.doList(chunk, postProcessing, false); + })); + buttons.heading = makeButton("wmd-heading-button", getString("heading"), "-160px", bindCommand("doHeading")); + buttons.hr = makeButton("wmd-hr-button", getString("hr"), "-180px", bindCommand("doHorizontalRule")); + makeSpacer(3); + buttons.undo = makeButton("wmd-undo-button", getString("undo"), "-200px", null); + buttons.undo.execute = function (manager) { if (manager) manager.undo(); }; + + var redoTitle = /win/.test(nav.platform.toLowerCase()) ? + getString("redo") : + getString("redomac"); // mac and other non-Windows platforms + + buttons.redo = makeButton("wmd-redo-button", redoTitle, "-220px", null); + buttons.redo.execute = function (manager) { if (manager) manager.redo(); }; + + if (helpOptions) { + var helpButton = document.createElement("li"); + var helpButtonImage = document.createElement("span"); + helpButton.appendChild(helpButtonImage); + helpButton.className = "wmd-button wmd-help-button"; + helpButton.id = "wmd-help-button" + postfix; + helpButton.XShift = "-240px"; + helpButton.isHelp = true; + helpButton.style.right = "0px"; + helpButton.title = getString("help"); + helpButton.onclick = helpOptions.handler; + + setupButton(helpButton, true); + buttonRow.appendChild(helpButton); + buttons.help = helpButton; + } + + setUndoRedoButtonStates(); + } + + function setUndoRedoButtonStates() { + if (undoManager) { + setupButton(buttons.undo, undoManager.canUndo()); + setupButton(buttons.redo, undoManager.canRedo()); + } + }; + + this.setUndoRedoButtonStates = setUndoRedoButtonStates; + + } + + function CommandManager(pluginHooks, getString) { + this.hooks = pluginHooks; + this.getString = getString; + } + + var commandProto = CommandManager.prototype; + + // The markdown symbols - 4 spaces = code, > = blockquote, etc. + commandProto.prefixes = "(?:\\s{4,}|\\s*>|\\s*-\\s+|\\s*\\d+\\.|=|\\+|-|_|\\*|#|\\s*\\[[^\n]]+\\]:)"; + + // Remove markdown symbols from the chunk selection. + commandProto.unwrap = function (chunk) { + var txt = new re("([^\\n])\\n(?!(\\n|" + this.prefixes + "))", "g"); + chunk.selection = chunk.selection.replace(txt, "$1 $2"); + }; + + commandProto.wrap = function (chunk, len) { + this.unwrap(chunk); + var regex = new re("(.{1," + len + "})( +|$\\n?)", "gm"), + that = this; + + chunk.selection = chunk.selection.replace(regex, function (line, marked) { + if (new re("^" + that.prefixes, "").test(line)) { + return line; + } + return marked + "\n"; + }); + + chunk.selection = chunk.selection.replace(/\s+$/, ""); + }; + + commandProto.doBold = function (chunk, postProcessing) { + return this.doBorI(chunk, postProcessing, 2, this.getString("boldexample")); + }; + + commandProto.doItalic = function (chunk, postProcessing) { + return this.doBorI(chunk, postProcessing, 1, this.getString("italicexample")); + }; + + // chunk: The selected region that will be enclosed with */** + // nStars: 1 for italics, 2 for bold + // insertText: If you just click the button without highlighting text, this gets inserted + commandProto.doBorI = function (chunk, postProcessing, nStars, insertText) { + + // Get rid of whitespace and fixup newlines. + chunk.trimWhitespace(); + chunk.selection = chunk.selection.replace(/\n{2,}/g, "\n"); + + // Look for stars before and after. Is the chunk already marked up? + // note that these regex matches cannot fail + var starsBefore = /(\**$)/.exec(chunk.before)[0]; + var starsAfter = /(^\**)/.exec(chunk.after)[0]; + + var prevStars = Math.min(starsBefore.length, starsAfter.length); + + // Remove stars if we have to since the button acts as a toggle. + if ((prevStars >= nStars) && (prevStars != 2 || nStars != 1)) { + chunk.before = chunk.before.replace(re("[*]{" + nStars + "}$", ""), ""); + chunk.after = chunk.after.replace(re("^[*]{" + nStars + "}", ""), ""); + } + else if (!chunk.selection && starsAfter) { + // It's not really clear why this code is necessary. It just moves + // some arbitrary stuff around. + chunk.after = chunk.after.replace(/^([*_]*)/, ""); + chunk.before = chunk.before.replace(/(\s?)$/, ""); + var whitespace = re.$1; + chunk.before = chunk.before + starsAfter + whitespace; + } + else { + + // In most cases, if you don't have any selected text and click the button + // you'll get a selected, marked up region with the default text inserted. + if (!chunk.selection && !starsAfter) { + chunk.selection = insertText; + } + + // Add the true markup. + var markup = nStars <= 1 ? "*" : "**"; // shouldn't the test be = ? + chunk.before = chunk.before + markup; + chunk.after = markup + chunk.after; + } + + return; + }; + + commandProto.stripLinkDefs = function (text, defsToAdd) { + + text = text.replace(/^[ ]{0,3}\[(\d+)\]:[ \t]*\n?[ \t]*?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|$)/gm, + function (totalMatch, id, link, newlines, title) { + defsToAdd[id] = totalMatch.replace(/\s*$/, ""); + if (newlines) { + // Strip the title and return that separately. + defsToAdd[id] = totalMatch.replace(/["(](.+?)[")]$/, ""); + return newlines + title; + } + return ""; + }); + + return text; + }; + + commandProto.addLinkDef = function (chunk, linkDef) { + + var refNumber = 0; // The current reference number + var defsToAdd = {}; // + // Start with a clean slate by removing all previous link definitions. + chunk.before = this.stripLinkDefs(chunk.before, defsToAdd); + chunk.selection = this.stripLinkDefs(chunk.selection, defsToAdd); + chunk.after = this.stripLinkDefs(chunk.after, defsToAdd); + + var defs = ""; + var regex = /(\[)((?:\[[^\]]*\]|[^\[\]])*)(\][ ]?(?:\n[ ]*)?\[)(\d+)(\])/g; + + var addDefNumber = function (def) { + refNumber++; + def = def.replace(/^[ ]{0,3}\[(\d+)\]:/, " [" + refNumber + "]:"); + defs += "\n" + def; + }; + + // note that + // a) the recursive call to getLink cannot go infinite, because by definition + // of regex, inner is always a proper substring of wholeMatch, and + // b) more than one level of nesting is neither supported by the regex + // nor making a lot of sense (the only use case for nesting is a linked image) + var getLink = function (wholeMatch, before, inner, afterInner, id, end) { + inner = inner.replace(regex, getLink); + if (defsToAdd[id]) { + addDefNumber(defsToAdd[id]); + return before + inner + afterInner + refNumber + end; + } + return wholeMatch; + }; + + chunk.before = chunk.before.replace(regex, getLink); + + if (linkDef) { + addDefNumber(linkDef); + } + else { + chunk.selection = chunk.selection.replace(regex, getLink); + } + + var refOut = refNumber; + + chunk.after = chunk.after.replace(regex, getLink); + + if (chunk.after) { + chunk.after = chunk.after.replace(/\n*$/, ""); + } + if (!chunk.after) { + chunk.selection = chunk.selection.replace(/\n*$/, ""); + } + + chunk.after += "\n\n" + defs; + + return refOut; + }; + + // takes the line as entered into the add link/as image dialog and makes + // sure the URL and the optinal title are "nice". + function properlyEncoded(linkdef) { + return linkdef.replace(/^\s*(.*?)(?:\s+"(.+)")?\s*$/, function (wholematch, link, title) { + + var inQueryString = false; + + // Having `[^\w\d-./]` in there is just a shortcut that lets us skip + // the most common characters in URLs. Replacing that it with `.` would not change + // the result, because encodeURI returns those characters unchanged, but it + // would mean lots of unnecessary replacement calls. Having `[` and `]` in that + // section as well means we do *not* enocde square brackets. These characters are + // a strange beast in URLs, but if anything, this causes URLs to be more readable, + // and we leave it to the browser to make sure that these links are handled without + // problems. + link = link.replace(/%(?:[\da-fA-F]{2})|\?|\+|[^\w\d-./[\]]/g, function (match) { + // Valid percent encoding. Could just return it as is, but we follow RFC3986 + // Section 2.1 which says "For consistency, URI producers and normalizers + // should use uppercase hexadecimal digits for all percent-encodings." + // Note that we also handle (illegal) stand-alone percent characters by + // replacing them with "%25" + if (match.length === 3 && match.charAt(0) == "%") { + return match.toUpperCase(); + } + switch (match) { + case "?": + inQueryString = true; + return "?"; + break; + + // In the query string, a plus and a space are identical -- normalize. + // Not strictly necessary, but identical behavior to the previous version + // of this function. + case "+": + if (inQueryString) + return "%20"; + break; + } + return encodeURI(match); + }) + + if (title) { + title = title.trim ? title.trim() : title.replace(/^\s*/, "").replace(/\s*$/, ""); + title = title.replace(/"/g, "quot;").replace(/\(/g, "(").replace(/\)/g, ")").replace(//g, ">"); + } + return title ? link + ' "' + title + '"' : link; + }); + } + + commandProto.doLinkOrImage = function (chunk, postProcessing, isImage) { + + chunk.trimWhitespace(); + chunk.findTags(/\s*!?\[/, /\][ ]?(?:\n[ ]*)?(\[.*?\])?/); + var background; + + if (chunk.endTag.length > 1 && chunk.startTag.length > 0) { + + chunk.startTag = chunk.startTag.replace(/!?\[/, ""); + chunk.endTag = ""; + this.addLinkDef(chunk, null); + + } + else { + + // We're moving start and end tag back into the selection, since (as we're in the else block) we're not + // *removing* a link, but *adding* one, so whatever findTags() found is now back to being part of the + // link text. linkEnteredCallback takes care of escaping any brackets. + chunk.selection = chunk.startTag + chunk.selection + chunk.endTag; + chunk.startTag = chunk.endTag = ""; + + if (/\n\n/.test(chunk.selection)) { + this.addLinkDef(chunk, null); + return; + } + var that = this; + // The function to be executed when you enter a link and press OK or Cancel. + // Marks up the link and adds the ref. + var linkEnteredCallback = function (link) { + + background.parentNode.removeChild(background); + + if (link !== null) { + // ( $1 + // [^\\] anything that's not a backslash + // (?:\\\\)* an even number (this includes zero) of backslashes + // ) + // (?= followed by + // [[\]] an opening or closing bracket + // ) + // + // In other words, a non-escaped bracket. These have to be escaped now to make sure they + // don't count as the end of the link or similar. + // Note that the actual bracket has to be a lookahead, because (in case of to subsequent brackets), + // the bracket in one match may be the "not a backslash" character in the next match, so it + // should not be consumed by the first match. + // The "prepend a space and finally remove it" steps makes sure there is a "not a backslash" at the + // start of the string, so this also works if the selection begins with a bracket. We cannot solve + // this by anchoring with ^, because in the case that the selection starts with two brackets, this + // would mean a zero-width match at the start. Since zero-width matches advance the string position, + // the first bracket could then not act as the "not a backslash" for the second. + chunk.selection = (" " + chunk.selection).replace(/([^\\](?:\\\\)*)(?=[[\]])/g, "$1\\").substr(1); + + var linkDef = " [999]: " + properlyEncoded(link); + + var num = that.addLinkDef(chunk, linkDef); + chunk.startTag = isImage ? "![" : "["; + chunk.endTag = "][" + num + "]"; + + if (!chunk.selection) { + if (isImage) { + chunk.selection = that.getString("imagedescription"); + } + else { + chunk.selection = that.getString("linkdescription"); + } + } + } + postProcessing(); + }; + + background = ui.createBackground(); + + if (isImage) { + if (!this.hooks.insertImageDialog(linkEnteredCallback)) + ui.prompt(this.getString("imagedialog"), imageDefaultText, linkEnteredCallback); + } + else { + ui.prompt(this.getString("linkdialog"), linkDefaultText, linkEnteredCallback); + } + return true; + } + }; + + // When making a list, hitting shift-enter will put your cursor on the next line + // at the current indent level. + commandProto.doAutoindent = function (chunk, postProcessing) { + + var commandMgr = this, + fakeSelection = false; + + chunk.before = chunk.before.replace(/(\n|^)[ ]{0,3}([*+-]|\d+[.])[ \t]*\n$/, "\n\n"); + chunk.before = chunk.before.replace(/(\n|^)[ ]{0,3}>[ \t]*\n$/, "\n\n"); + chunk.before = chunk.before.replace(/(\n|^)[ \t]+\n$/, "\n\n"); + + // There's no selection, end the cursor wasn't at the end of the line: + // The user wants to split the current list item / code line / blockquote line + // (for the latter it doesn't really matter) in two. Temporarily select the + // (rest of the) line to achieve this. + if (!chunk.selection && !/^[ \t]*(?:\n|$)/.test(chunk.after)) { + chunk.after = chunk.after.replace(/^[^\n]*/, function (wholeMatch) { + chunk.selection = wholeMatch; + return ""; + }); + fakeSelection = true; + } + + if (/(\n|^)[ ]{0,3}([*+-]|\d+[.])[ \t]+.*\n$/.test(chunk.before)) { + if (commandMgr.doList) { + commandMgr.doList(chunk); + } + } + if (/(\n|^)[ ]{0,3}>[ \t]+.*\n$/.test(chunk.before)) { + if (commandMgr.doBlockquote) { + commandMgr.doBlockquote(chunk); + } + } + if (/(\n|^)(\t|[ ]{4,}).*\n$/.test(chunk.before)) { + if (commandMgr.doCode) { + commandMgr.doCode(chunk); + } + } + + if (fakeSelection) { + chunk.after = chunk.selection + chunk.after; + chunk.selection = ""; + } + }; + + commandProto.doBlockquote = function (chunk, postProcessing) { + + chunk.selection = chunk.selection.replace(/^(\n*)([^\r]+?)(\n*)$/, + function (totalMatch, newlinesBefore, text, newlinesAfter) { + chunk.before += newlinesBefore; + chunk.after = newlinesAfter + chunk.after; + return text; + }); + + chunk.before = chunk.before.replace(/(>[ \t]*)$/, + function (totalMatch, blankLine) { + chunk.selection = blankLine + chunk.selection; + return ""; + }); + + chunk.selection = chunk.selection.replace(/^(\s|>)+$/, ""); + chunk.selection = chunk.selection || this.getString("quoteexample"); + + // The original code uses a regular expression to find out how much of the + // text *directly before* the selection already was a blockquote: + + /* + if (chunk.before) { + chunk.before = chunk.before.replace(/\n?$/, "\n"); + } + chunk.before = chunk.before.replace(/(((\n|^)(\n[ \t]*)*>(.+\n)*.*)+(\n[ \t]*)*$)/, + function (totalMatch) { + chunk.startTag = totalMatch; + return ""; + }); + */ + + // This comes down to: + // Go backwards as many lines a possible, such that each line + // a) starts with ">", or + // b) is almost empty, except for whitespace, or + // c) is preceeded by an unbroken chain of non-empty lines + // leading up to a line that starts with ">" and at least one more character + // and in addition + // d) at least one line fulfills a) + // + // Since this is essentially a backwards-moving regex, it's susceptible to + // catstrophic backtracking and can cause the browser to hang; + // see e.g. http://meta.stackexchange.com/questions/9807. + // + // Hence we replaced this by a simple state machine that just goes through the + // lines and checks for a), b), and c). + + var match = "", + leftOver = "", + line; + if (chunk.before) { + var lines = chunk.before.replace(/\n$/, "").split("\n"); + var inChain = false; + for (var i = 0; i < lines.length; i++) { + var good = false; + line = lines[i]; + inChain = inChain && line.length > 0; // c) any non-empty line continues the chain + if (/^>/.test(line)) { // a) + good = true; + if (!inChain && line.length > 1) // c) any line that starts with ">" and has at least one more character starts the chain + inChain = true; + } else if (/^[ \t]*$/.test(line)) { // b) + good = true; + } else { + good = inChain; // c) the line is not empty and does not start with ">", so it matches if and only if we're in the chain + } + if (good) { + match += line + "\n"; + } else { + leftOver += match + line; + match = "\n"; + } + } + if (!/(^|\n)>/.test(match)) { // d) + leftOver += match; + match = ""; + } + } + + chunk.startTag = match; + chunk.before = leftOver; + + // end of change + + if (chunk.after) { + chunk.after = chunk.after.replace(/^\n?/, "\n"); + } + + chunk.after = chunk.after.replace(/^(((\n|^)(\n[ \t]*)*>(.+\n)*.*)+(\n[ \t]*)*)/, + function (totalMatch) { + chunk.endTag = totalMatch; + return ""; + } + ); + + var replaceBlanksInTags = function (useBracket) { + + var replacement = useBracket ? "> " : ""; + + if (chunk.startTag) { + chunk.startTag = chunk.startTag.replace(/\n((>|\s)*)\n$/, + function (totalMatch, markdown) { + return "\n" + markdown.replace(/^[ ]{0,3}>?[ \t]*$/gm, replacement) + "\n"; + }); + } + if (chunk.endTag) { + chunk.endTag = chunk.endTag.replace(/^\n((>|\s)*)\n/, + function (totalMatch, markdown) { + return "\n" + markdown.replace(/^[ ]{0,3}>?[ \t]*$/gm, replacement) + "\n"; + }); + } + }; + + if (/^(?![ ]{0,3}>)/m.test(chunk.selection)) { + this.wrap(chunk, SETTINGS.lineLength - 2); + chunk.selection = chunk.selection.replace(/^/gm, "> "); + replaceBlanksInTags(true); + chunk.skipLines(); + } else { + chunk.selection = chunk.selection.replace(/^[ ]{0,3}> ?/gm, ""); + this.unwrap(chunk); + replaceBlanksInTags(false); + + if (!/^(\n|^)[ ]{0,3}>/.test(chunk.selection) && chunk.startTag) { + chunk.startTag = chunk.startTag.replace(/\n{0,2}$/, "\n\n"); + } + + if (!/(\n|^)[ ]{0,3}>.*$/.test(chunk.selection) && chunk.endTag) { + chunk.endTag = chunk.endTag.replace(/^\n{0,2}/, "\n\n"); + } + } + + chunk.selection = this.hooks.postBlockquoteCreation(chunk.selection); + + if (!/\n/.test(chunk.selection)) { + chunk.selection = chunk.selection.replace(/^(> *)/, + function (wholeMatch, blanks) { + chunk.startTag += blanks; + return ""; + }); + } + }; + + commandProto.doCode = function (chunk, postProcessing) { + + var hasTextBefore = /\S[ ]*$/.test(chunk.before); + var hasTextAfter = /^[ ]*\S/.test(chunk.after); + + // Use 'four space' markdown if the selection is on its own + // line or is multiline. + if ((!hasTextAfter && !hasTextBefore) || /\n/.test(chunk.selection)) { + + chunk.before = chunk.before.replace(/[ ]{4}$/, + function (totalMatch) { + chunk.selection = totalMatch + chunk.selection; + return ""; + }); + + var nLinesBack = 1; + var nLinesForward = 1; + + if (/(\n|^)(\t|[ ]{4,}).*\n$/.test(chunk.before)) { + nLinesBack = 0; + } + if (/^\n(\t|[ ]{4,})/.test(chunk.after)) { + nLinesForward = 0; + } + + chunk.skipLines(nLinesBack, nLinesForward); + + if (!chunk.selection) { + chunk.startTag = " "; + chunk.selection = this.getString("codeexample"); + } + else { + if (/^[ ]{0,3}\S/m.test(chunk.selection)) { + if (/\n/.test(chunk.selection)) + chunk.selection = chunk.selection.replace(/^/gm, " "); + else // if it's not multiline, do not select the four added spaces; this is more consistent with the doList behavior + chunk.before += " "; + } + else { + chunk.selection = chunk.selection.replace(/^(?:[ ]{4}|[ ]{0,3}\t)/gm, ""); + } + } + } + else { + // Use backticks (`) to delimit the code block. + + chunk.trimWhitespace(); + chunk.findTags(/`/, /`/); + + if (!chunk.startTag && !chunk.endTag) { + chunk.startTag = chunk.endTag = "`"; + if (!chunk.selection) { + chunk.selection = this.getString("codeexample"); + } + } + else if (chunk.endTag && !chunk.startTag) { + chunk.before += chunk.endTag; + chunk.endTag = ""; + } + else { + chunk.startTag = chunk.endTag = ""; + } + } + }; + + commandProto.doList = function (chunk, postProcessing, isNumberedList) { + + // These are identical except at the very beginning and end. + // Should probably use the regex extension function to make this clearer. + var previousItemsRegex = /(\n|^)(([ ]{0,3}([*+-]|\d+[.])[ \t]+.*)(\n.+|\n{2,}([*+-].*|\d+[.])[ \t]+.*|\n{2,}[ \t]+\S.*)*)\n*$/; + var nextItemsRegex = /^\n*(([ ]{0,3}([*+-]|\d+[.])[ \t]+.*)(\n.+|\n{2,}([*+-].*|\d+[.])[ \t]+.*|\n{2,}[ \t]+\S.*)*)\n*/; + + // The default bullet is a dash but others are possible. + // This has nothing to do with the particular HTML bullet, + // it's just a markdown bullet. + var bullet = "-"; + + // The number in a numbered list. + var num = 1; + + // Get the item prefix - e.g. " 1. " for a numbered list, " - " for a bulleted list. + var getItemPrefix = function () { + var prefix; + if (isNumberedList) { + prefix = " " + num + ". "; + num++; + } + else { + prefix = " " + bullet + " "; + } + return prefix; + }; + + // Fixes the prefixes of the other list items. + var getPrefixedItem = function (itemText) { + + // The numbering flag is unset when called by autoindent. + if (isNumberedList === undefined) { + isNumberedList = /^\s*\d/.test(itemText); + } + + // Renumber/bullet the list element. + itemText = itemText.replace(/^[ ]{0,3}([*+-]|\d+[.])\s/gm, + function (_) { + return getItemPrefix(); + }); + + return itemText; + }; + + chunk.findTags(/(\n|^)*[ ]{0,3}([*+-]|\d+[.])\s+/, null); + + if (chunk.before && !/\n$/.test(chunk.before) && !/^\n/.test(chunk.startTag)) { + chunk.before += chunk.startTag; + chunk.startTag = ""; + } + + if (chunk.startTag) { + + var hasDigits = /\d+[.]/.test(chunk.startTag); + chunk.startTag = ""; + chunk.selection = chunk.selection.replace(/\n[ ]{4}/g, "\n"); + this.unwrap(chunk); + chunk.skipLines(); + + if (hasDigits) { + // Have to renumber the bullet points if this is a numbered list. + chunk.after = chunk.after.replace(nextItemsRegex, getPrefixedItem); + } + if (isNumberedList == hasDigits) { + return; + } + } + + var nLinesUp = 1; + + chunk.before = chunk.before.replace(previousItemsRegex, + function (itemText) { + if (/^\s*([*+-])/.test(itemText)) { + bullet = re.$1; + } + nLinesUp = /[^\n]\n\n[^\n]/.test(itemText) ? 1 : 0; + return getPrefixedItem(itemText); + }); + + if (!chunk.selection) { + chunk.selection = this.getString("litem"); + } + + var prefix = getItemPrefix(); + + var nLinesDown = 1; + + chunk.after = chunk.after.replace(nextItemsRegex, + function (itemText) { + nLinesDown = /[^\n]\n\n[^\n]/.test(itemText) ? 1 : 0; + return getPrefixedItem(itemText); + }); + + chunk.trimWhitespace(true); + chunk.skipLines(nLinesUp, nLinesDown, true); + chunk.startTag = prefix; + var spaces = prefix.replace(/./g, " "); + this.wrap(chunk, SETTINGS.lineLength - spaces.length); + chunk.selection = chunk.selection.replace(/\n/g, "\n" + spaces); + + }; + + commandProto.doHeading = function (chunk, postProcessing) { + + // Remove leading/trailing whitespace and reduce internal spaces to single spaces. + chunk.selection = chunk.selection.replace(/\s+/g, " "); + chunk.selection = chunk.selection.replace(/(^\s+|\s+$)/g, ""); + + // If we clicked the button with no selected text, we just + // make a level 2 hash header around some default text. + if (!chunk.selection) { + chunk.startTag = "## "; + chunk.selection = this.getString("headingexample"); + chunk.endTag = " ##"; + return; + } + + var headerLevel = 0; // The existing header level of the selected text. + + // Remove any existing hash heading markdown and save the header level. + chunk.findTags(/#+[ ]*/, /[ ]*#+/); + if (/#+/.test(chunk.startTag)) { + headerLevel = re.lastMatch.length; + } + chunk.startTag = chunk.endTag = ""; + + // Try to get the current header level by looking for - and = in the line + // below the selection. + chunk.findTags(null, /\s?(-+|=+)/); + if (/=+/.test(chunk.endTag)) { + headerLevel = 1; + } + if (/-+/.test(chunk.endTag)) { + headerLevel = 2; + } + + // Skip to the next line so we can create the header markdown. + chunk.startTag = chunk.endTag = ""; + chunk.skipLines(1, 1); + + // We make a level 2 header if there is no current header. + // If there is a header level, we substract one from the header level. + // If it's already a level 1 header, it's removed. + var headerLevelToCreate = headerLevel == 0 ? 2 : headerLevel - 1; + + if (headerLevelToCreate > 0) { + + // The button only creates level 1 and 2 underline headers. + // Why not have it iterate over hash header levels? Wouldn't that be easier and cleaner? + var headerChar = headerLevelToCreate >= 2 ? "-" : "="; + var len = chunk.selection.length; + if (len > SETTINGS.lineLength) { + len = SETTINGS.lineLength; + } + chunk.endTag = "\n"; + while (len--) { + chunk.endTag += headerChar; + } + } + }; + + commandProto.doHorizontalRule = function (chunk, postProcessing) { + chunk.startTag = "----------\n"; + chunk.selection = ""; + chunk.skipLines(2, 1, true); + } + + +})(); \ No newline at end of file diff --git a/assets/public/editor/Markdown.Extra.js b/assets/public/editor/Markdown.Extra.js new file mode 100644 index 0000000..d3b859a --- /dev/null +++ b/assets/public/editor/Markdown.Extra.js @@ -0,0 +1,874 @@ +(function () { + // A quick way to make sure we're only keeping span-level tags when we need to. + // This isn't supposed to be foolproof. It's just a quick way to make sure we + // keep all span-level tags returned by a pagedown converter. It should allow + // all span-level tags through, with or without attributes. + var inlineTags = new RegExp(['^(<\\/?(a|abbr|acronym|applet|area|b|basefont|', + 'bdo|big|button|cite|code|del|dfn|em|figcaption|', + 'font|i|iframe|img|input|ins|kbd|label|map|', + 'mark|meter|object|param|progress|q|ruby|rp|rt|s|', + 'samp|script|select|small|span|strike|strong|', + 'sub|sup|textarea|time|tt|u|var|wbr)[^>]*>|', + '<(br)\\s?\\/?>)$'].join(''), 'i'); + + /****************************************************************** + * Utility Functions * + *****************************************************************/ + + // patch for ie7 + if (!Array.indexOf) { + Array.prototype.indexOf = function(obj) { + for (var i = 0; i < this.length; i++) { + if (this[i] == obj) { + return i; + } + } + return -1; + }; + } + + function trim(str) { + return str.replace(/^\s+|\s+$/g, ''); + } + + function rtrim(str) { + return str.replace(/\s+$/g, ''); + } + + // Remove one level of indentation from text. Indent is 4 spaces. + function outdent(text) { + return text.replace(new RegExp('^(\\t|[ ]{1,4})', 'gm'), ''); + } + + function contains(str, substr) { + return str.indexOf(substr) != -1; + } + + // Sanitize html, removing tags that aren't in the whitelist + function sanitizeHtml(html, whitelist) { + return html.replace(/<[^>]*>?/gi, function(tag) { + return tag.match(whitelist) ? tag : ''; + }); + } + + // Merge two arrays, keeping only unique elements. + function union(x, y) { + var obj = {}; + for (var i = 0; i < x.length; i++) + obj[x[i]] = x[i]; + for (i = 0; i < y.length; i++) + obj[y[i]] = y[i]; + var res = []; + for (var k in obj) { + if (obj.hasOwnProperty(k)) + res.push(obj[k]); + } + return res; + } + + // JS regexes don't support \A or \Z, so we add sentinels, as Pagedown + // does. In this case, we add the ascii codes for start of text (STX) and + // end of text (ETX), an idea borrowed from: + // https://github.com/tanakahisateru/js-markdown-extra + function addAnchors(text) { + if(text.charAt(0) != '\x02') + text = '\x02' + text; + if(text.charAt(text.length - 1) != '\x03') + text = text + '\x03'; + return text; + } + + // Remove STX and ETX sentinels. + function removeAnchors(text) { + if(text.charAt(0) == '\x02') + text = text.substr(1); + if(text.charAt(text.length - 1) == '\x03') + text = text.substr(0, text.length - 1); + return text; + } + + // Convert markdown within an element, retaining only span-level tags + function convertSpans(text, extra) { + return sanitizeHtml(convertAll(text, extra), inlineTags); + } + + // Convert internal markdown using the stock pagedown converter + function convertAll(text, extra) { + var result = extra.blockGamutHookCallback(text); + // We need to perform these operations since we skip the steps in the converter + result = unescapeSpecialChars(result); + result = result.replace(/~D/g, "$$").replace(/~T/g, "~"); + result = extra.previousPostConversion(result); + return result; + } + + // Convert escaped special characters + function processEscapesStep1(text) { + // Markdown extra adds two escapable characters, `:` and `|` + return text.replace(/\\\|/g, '~I').replace(/\\:/g, '~i'); + } + function processEscapesStep2(text) { + return text.replace(/~I/g, '|').replace(/~i/g, ':'); + } + + // Duplicated from PageDown converter + function unescapeSpecialChars(text) { + // Swap back in all the special characters we've hidden. + text = text.replace(/~E(\d+)E/g, function(wholeMatch, m1) { + var charCodeToReplace = parseInt(m1); + return String.fromCharCode(charCodeToReplace); + }); + return text; + } + + function slugify(text) { + return text.toLowerCase() + .replace(/\s+/g, '-') // Replace spaces with - + .replace(/[^\w\-]+/g, '') // Remove all non-word chars + .replace(/\-\-+/g, '-') // Replace multiple - with single - + .replace(/^-+/, '') // Trim - from start of text + .replace(/-+$/, ''); // Trim - from end of text + } + + /***************************************************************************** + * Markdown.Extra * + ****************************************************************************/ + + Markdown.Extra = function() { + // For converting internal markdown (in tables for instance). + // This is necessary since these methods are meant to be called as + // preConversion hooks, and the Markdown converter passed to init() + // won't convert any markdown contained in the html tags we return. + this.converter = null; + + // Stores html blocks we generate in hooks so that + // they're not destroyed if the user is using a sanitizing converter + this.hashBlocks = []; + + // Stores footnotes + this.footnotes = {}; + this.usedFootnotes = []; + + // Special attribute blocks for fenced code blocks and headers enabled. + this.attributeBlocks = false; + + // Fenced code block options + this.googleCodePrettify = false; + this.highlightJs = false; + + // Table options + this.tableClass = ''; + + this.tabWidth = 4; + }; + + Markdown.Extra.init = function(converter, options) { + // Each call to init creates a new instance of Markdown.Extra so it's + // safe to have multiple converters, with different options, on a single page + var extra = new Markdown.Extra(); + var postNormalizationTransformations = []; + var preBlockGamutTransformations = []; + var postSpanGamutTransformations = []; + var postConversionTransformations = ["unHashExtraBlocks"]; + + options = options || {}; + options.extensions = options.extensions || ["all"]; + if (contains(options.extensions, "all")) { + options.extensions = ["tables", "fenced_code_gfm", "def_list", "attr_list", "footnotes", "smartypants", "strikethrough", "newlines"]; + } + preBlockGamutTransformations.push("wrapHeaders"); + if (contains(options.extensions, "attr_list")) { + postNormalizationTransformations.push("hashFcbAttributeBlocks"); + preBlockGamutTransformations.push("hashHeaderAttributeBlocks"); + postConversionTransformations.push("applyAttributeBlocks"); + extra.attributeBlocks = true; + } + if (contains(options.extensions, "fenced_code_gfm")) { + // This step will convert fcb inside list items and blockquotes + preBlockGamutTransformations.push("fencedCodeBlocks"); + // This extra step is to prevent html blocks hashing and link definition/footnotes stripping inside fcb + postNormalizationTransformations.push("fencedCodeBlocks"); + } + if (contains(options.extensions, "tables")) { + preBlockGamutTransformations.push("tables"); + } + if (contains(options.extensions, "def_list")) { + preBlockGamutTransformations.push("definitionLists"); + } + if (contains(options.extensions, "footnotes")) { + postNormalizationTransformations.push("stripFootnoteDefinitions"); + preBlockGamutTransformations.push("doFootnotes"); + postConversionTransformations.push("printFootnotes"); + } + if (contains(options.extensions, "smartypants")) { + postConversionTransformations.push("runSmartyPants"); + } + if (contains(options.extensions, "strikethrough")) { + postSpanGamutTransformations.push("strikethrough"); + } + if (contains(options.extensions, "newlines")) { + postSpanGamutTransformations.push("newlines"); + } + + converter.hooks.chain("postNormalization", function(text) { + return extra.doTransform(postNormalizationTransformations, text) + '\n'; + }); + + converter.hooks.chain("preBlockGamut", function(text, blockGamutHookCallback) { + // Keep a reference to the block gamut callback to run recursively + extra.blockGamutHookCallback = blockGamutHookCallback; + text = processEscapesStep1(text); + text = extra.doTransform(preBlockGamutTransformations, text) + '\n'; + text = processEscapesStep2(text); + return text; + }); + + converter.hooks.chain("postSpanGamut", function(text) { + return extra.doTransform(postSpanGamutTransformations, text); + }); + + // Keep a reference to the hook chain running before doPostConversion to apply on hashed extra blocks + extra.previousPostConversion = converter.hooks.postConversion; + converter.hooks.chain("postConversion", function(text) { + text = extra.doTransform(postConversionTransformations, text); + // Clear state vars that may use unnecessary memory + extra.hashBlocks = []; + extra.footnotes = {}; + extra.usedFootnotes = []; + return text; + }); + + if ("highlighter" in options) { + extra.googleCodePrettify = options.highlighter === 'prettify'; + extra.highlightJs = options.highlighter === 'highlight'; + } + + if ("table_class" in options) { + extra.tableClass = options.table_class; + } + + extra.converter = converter; + + // Caller usually won't need this, but it's handy for testing. + return extra; + }; + + // Do transformations + Markdown.Extra.prototype.doTransform = function(transformations, text) { + for(var i = 0; i < transformations.length; i++) + text = this[transformations[i]](text); + return text; + }; + + // Return a placeholder containing a key, which is the block's index in the + // hashBlocks array. We wrap our output in a

        tag here so Pagedown won't. + Markdown.Extra.prototype.hashExtraBlock = function(block) { + return '\n

        ~X' + (this.hashBlocks.push(block) - 1) + 'X

        \n'; + }; + Markdown.Extra.prototype.hashExtraInline = function(block) { + return '~X' + (this.hashBlocks.push(block) - 1) + 'X'; + }; + + // Replace placeholder blocks in `text` with their corresponding + // html blocks in the hashBlocks array. + Markdown.Extra.prototype.unHashExtraBlocks = function(text) { + var self = this; + function recursiveUnHash() { + var hasHash = false; + text = text.replace(/(?:

        )?~X(\d+)X(?:<\/p>)?/g, function(wholeMatch, m1) { + hasHash = true; + var key = parseInt(m1, 10); + return self.hashBlocks[key]; + }); + if(hasHash === true) { + recursiveUnHash(); + } + } + recursiveUnHash(); + return text; + }; + + // Wrap headers to make sure they won't be in def lists + Markdown.Extra.prototype.wrapHeaders = function(text) { + function wrap(text) { + return '\n' + text + '\n'; + } + text = text.replace(/^.+[ \t]*\n=+[ \t]*\n+/gm, wrap); + text = text.replace(/^.+[ \t]*\n-+[ \t]*\n+/gm, wrap); + text = text.replace(/^\#{1,6}[ \t]*.+?[ \t]*\#*\n+/gm, wrap); + return text; + }; + + + /****************************************************************** + * Attribute Blocks * + *****************************************************************/ + + // TODO: use sentinels. Should we just add/remove them in doConversion? + // TODO: better matches for id / class attributes + var attrBlock = "\\{[ \\t]*((?:[#.][-_:a-zA-Z0-9]+[ \\t]*)+)\\}"; + var hdrAttributesA = new RegExp("^(#{1,6}.*#{0,6})[ \\t]+" + attrBlock + "[ \\t]*(?:\\n|0x03)", "gm"); + var hdrAttributesB = new RegExp("^(.*)[ \\t]+" + attrBlock + "[ \\t]*\\n" + + "(?=[\\-|=]+\\s*(?:\\n|0x03))", "gm"); // underline lookahead + var fcbAttributes = new RegExp("^(```[^`\\n]*)[ \\t]+" + attrBlock + "[ \\t]*\\n" + + "(?=([\\s\\S]*?)\\n```[ \\t]*(\\n|0x03))", "gm"); + + // Extract headers attribute blocks, move them above the element they will be + // applied to, and hash them for later. + Markdown.Extra.prototype.hashHeaderAttributeBlocks = function(text) { + + var self = this; + function attributeCallback(wholeMatch, pre, attr) { + return '

        ~XX' + (self.hashBlocks.push(attr) - 1) + 'XX

        \n' + pre + "\n"; + } + + text = text.replace(hdrAttributesA, attributeCallback); // ## headers + text = text.replace(hdrAttributesB, attributeCallback); // underline headers + return text; + }; + + // Extract FCB attribute blocks, move them above the element they will be + // applied to, and hash them for later. + Markdown.Extra.prototype.hashFcbAttributeBlocks = function(text) { + // TODO: use sentinels. Should we just add/remove them in doConversion? + // TODO: better matches for id / class attributes + + var self = this; + function attributeCallback(wholeMatch, pre, attr) { + return '

        ~XX' + (self.hashBlocks.push(attr) - 1) + 'XX

        \n' + pre + "\n"; + } + + return text.replace(fcbAttributes, attributeCallback); + }; + + Markdown.Extra.prototype.applyAttributeBlocks = function(text) { + var self = this; + var blockRe = new RegExp('

        ~XX(\\d+)XX

        [\\s]*' + + '(?:<(h[1-6]|pre)(?: +class="(\\S+)")?(>[\\s\\S]*?))', "gm"); + text = text.replace(blockRe, function(wholeMatch, k, tag, cls, rest) { + if (!tag) // no following header or fenced code block. + return ''; + + // get attributes list from hash + var key = parseInt(k, 10); + var attributes = self.hashBlocks[key]; + + // get id + var id = attributes.match(/#[^\s#.]+/g) || []; + var idStr = id[0] ? ' id="' + id[0].substr(1, id[0].length - 1) + '"' : ''; + + // get classes and merge with existing classes + var classes = attributes.match(/\.[^\s#.]+/g) || []; + for (var i = 0; i < classes.length; i++) // Remove leading dot + classes[i] = classes[i].substr(1, classes[i].length - 1); + + var classStr = ''; + if (cls) + classes = union(classes, [cls]); + + if (classes.length > 0) + classStr = ' class="' + classes.join(' ') + '"'; + + return "<" + tag + idStr + classStr + rest; + }); + + return text; + }; + + /****************************************************************** + * Tables * + *****************************************************************/ + + // Find and convert Markdown Extra tables into html. + Markdown.Extra.prototype.tables = function(text) { + var self = this; + + var leadingPipe = new RegExp( + ['^' , + '[ ]{0,3}' , // Allowed whitespace + '[|]' , // Initial pipe + '(.+)\\n' , // $1: Header Row + + '[ ]{0,3}' , // Allowed whitespace + '[|]([ ]*[-:]+[-| :]*)\\n' , // $2: Separator + + '(' , // $3: Table Body + '(?:[ ]*[|].*\\n?)*' , // Table rows + ')', + '(?:\\n|$)' // Stop at final newline + ].join(''), + 'gm' + ); + + var noLeadingPipe = new RegExp( + ['^' , + '[ ]{0,3}' , // Allowed whitespace + '(\\S.*[|].*)\\n' , // $1: Header Row + + '[ ]{0,3}' , // Allowed whitespace + '([-:]+[ ]*[|][-| :]*)\\n' , // $2: Separator + + '(' , // $3: Table Body + '(?:.*[|].*\\n?)*' , // Table rows + ')' , + '(?:\\n|$)' // Stop at final newline + ].join(''), + 'gm' + ); + + text = text.replace(leadingPipe, doTable); + text = text.replace(noLeadingPipe, doTable); + + // $1 = header, $2 = separator, $3 = body + function doTable(match, header, separator, body, offset, string) { + // remove any leading pipes and whitespace + header = header.replace(/^ *[|]/m, ''); + separator = separator.replace(/^ *[|]/m, ''); + body = body.replace(/^ *[|]/gm, ''); + + // remove trailing pipes and whitespace + header = header.replace(/[|] *$/m, ''); + separator = separator.replace(/[|] *$/m, ''); + body = body.replace(/[|] *$/gm, ''); + + // determine column alignments + var alignspecs = separator.split(/ *[|] */); + var align = []; + for (var i = 0; i < alignspecs.length; i++) { + var spec = alignspecs[i]; + if (spec.match(/^ *-+: *$/m)) + align[i] = ' align="right"'; + else if (spec.match(/^ *:-+: *$/m)) + align[i] = ' align="center"'; + else if (spec.match(/^ *:-+ *$/m)) + align[i] = ' align="left"'; + else align[i] = ''; + } + + // TODO: parse spans in header and rows before splitting, so that pipes + // inside of tags are not interpreted as separators + var headers = header.split(/ *[|] */); + var colCount = headers.length; + + // build html + var cls = self.tableClass ? ' class="' + self.tableClass + '"' : ''; + var html = ['\n', '\n', '\n'].join(''); + + // build column headers. + for (i = 0; i < colCount; i++) { + var headerHtml = convertSpans(trim(headers[i]), self); + html += [" ", headerHtml, "\n"].join(''); + } + html += "\n\n"; + + // build rows + var rows = body.split('\n'); + for (i = 0; i < rows.length; i++) { + if (rows[i].match(/^\s*$/)) // can apply to final row + continue; + + // ensure number of rowCells matches colCount + var rowCells = rows[i].split(/ *[|] */); + var lenDiff = colCount - rowCells.length; + for (var j = 0; j < lenDiff; j++) + rowCells.push(''); + + html += "\n"; + for (j = 0; j < colCount; j++) { + var colHtml = convertSpans(trim(rowCells[j]), self); + html += [" ", colHtml, "\n"].join(''); + } + html += "\n"; + } + + html += "\n"; + + // replace html with placeholder until postConversion step + return self.hashExtraBlock(html); + } + + return text; + }; + + + /****************************************************************** + * Footnotes * + *****************************************************************/ + + // Strip footnote, store in hashes. + Markdown.Extra.prototype.stripFootnoteDefinitions = function(text) { + var self = this; + + text = text.replace( + /\n[ ]{0,3}\[\^(.+?)\]\:[ \t]*\n?([\s\S]*?)\n{1,2}((?=\n[ ]{0,3}\S)|$)/g, + function(wholeMatch, m1, m2) { + m1 = slugify(m1); + m2 += "\n"; + m2 = m2.replace(/^[ ]{0,3}/g, ""); + self.footnotes[m1] = m2; + return "\n"; + }); + + return text; + }; + + + // Find and convert footnotes references. + Markdown.Extra.prototype.doFootnotes = function(text) { + var self = this; + if(self.isConvertingFootnote === true) { + return text; + } + + var footnoteCounter = 0; + text = text.replace(/\[\^(.+?)\]/g, function(wholeMatch, m1) { + var id = slugify(m1); + var footnote = self.footnotes[id]; + if (footnote === undefined) { + return wholeMatch; + } + footnoteCounter++; + self.usedFootnotes.push(id); + var html = '' + footnoteCounter + + ''; + return self.hashExtraInline(html); + }); + + return text; + }; + + // Print footnotes at the end of the document + Markdown.Extra.prototype.printFootnotes = function(text) { + var self = this; + + if (self.usedFootnotes.length === 0) { + return text; + } + + text += '\n\n
        \n
        \n
          \n\n'; + for(var i=0; i' + + formattedfootnote + + ' \n\n'; + } + text += '
        \n
        '; + return text; + }; + + + /****************************************************************** + * Fenced Code Blocks (gfm) * + ******************************************************************/ + + // Find and convert gfm-inspired fenced code blocks into html. + Markdown.Extra.prototype.fencedCodeBlocks = function(text) { + function encodeCode(code) { + code = code.replace(/&/g, "&"); + code = code.replace(//g, ">"); + // These were escaped by PageDown before postNormalization + code = code.replace(/~D/g, "$$"); + code = code.replace(/~T/g, "~"); + return code; + } + + var self = this; + text = text.replace(/(?:^|\n)```([^`\n]*)\n([\s\S]*?)\n```[ \t]*(?=\n)/g, function(match, m1, m2) { + var language = trim(m1), codeblock = m2; + + // adhere to specified options + var preclass = self.googleCodePrettify ? ' class="prettyprint"' : ''; + var codeclass = ''; + if (language) { + if (self.googleCodePrettify || self.highlightJs) { + // use html5 language- class names. supported by both prettify and highlight.js + codeclass = ' class="language-' + language + '"'; + } else { + codeclass = ' class="' + language + '"'; + } + } + + var html = ['', + encodeCode(codeblock), '

    '].join(''); + + // replace codeblock with placeholder until postConversion step + return self.hashExtraBlock(html); + }); + + return text; + }; + + + /****************************************************************** + * SmartyPants * + ******************************************************************/ + + Markdown.Extra.prototype.educatePants = function(text) { + var self = this; + var result = ''; + var blockOffset = 0; + // Here we parse HTML in a very bad manner + text.replace(/(?:)|(<)([a-zA-Z1-6]+)([^\n]*?>)([\s\S]*?)(<\/\2>)/g, function(wholeMatch, m1, m2, m3, m4, m5, offset) { + var token = text.substring(blockOffset, offset); + result += self.applyPants(token); + self.smartyPantsLastChar = result.substring(result.length - 1); + blockOffset = offset + wholeMatch.length; + if(!m1) { + // Skip commentary + result += wholeMatch; + return; + } + // Skip special tags + if(!/code|kbd|pre|script|noscript|iframe|math|ins|del|pre/i.test(m2)) { + m4 = self.educatePants(m4); + } + else { + self.smartyPantsLastChar = m4.substring(m4.length - 1); + } + result += m1 + m2 + m3 + m4 + m5; + }); + var lastToken = text.substring(blockOffset); + result += self.applyPants(lastToken); + self.smartyPantsLastChar = result.substring(result.length - 1); + return result; + }; + + function revertPants(wholeMatch, m1) { + var blockText = m1; + blockText = blockText.replace(/&\#8220;/g, "\""); + blockText = blockText.replace(/&\#8221;/g, "\""); + blockText = blockText.replace(/&\#8216;/g, "'"); + blockText = blockText.replace(/&\#8217;/g, "'"); + blockText = blockText.replace(/&\#8212;/g, "---"); + blockText = blockText.replace(/&\#8211;/g, "--"); + blockText = blockText.replace(/&\#8230;/g, "..."); + return blockText; + } + + Markdown.Extra.prototype.applyPants = function(text) { + // Dashes + text = text.replace(/---/g, "—").replace(/--/g, "–"); + // Ellipses + text = text.replace(/\.\.\./g, "…").replace(/\.\s\.\s\./g, "…"); + // Backticks + text = text.replace(/``/g, "“").replace (/''/g, "”"); + + if(/^'$/.test(text)) { + // Special case: single-character ' token + if(/\S/.test(this.smartyPantsLastChar)) { + return "’"; + } + return "‘"; + } + if(/^"$/.test(text)) { + // Special case: single-character " token + if(/\S/.test(this.smartyPantsLastChar)) { + return "”"; + } + return "“"; + } + + // Special case if the very first character is a quote + // followed by punctuation at a non-word-break. Close the quotes by brute force: + text = text.replace (/^'(?=[!"#\$\%'()*+,\-.\/:;<=>?\@\[\\]\^_`{|}~]\B)/, "’"); + text = text.replace (/^"(?=[!"#\$\%'()*+,\-.\/:;<=>?\@\[\\]\^_`{|}~]\B)/, "”"); + + // Special case for double sets of quotes, e.g.: + //

    He said, "'Quoted' words in a larger quote."

    + text = text.replace(/"'(?=\w)/g, "“‘"); + text = text.replace(/'"(?=\w)/g, "‘“"); + + // Special case for decade abbreviations (the '80s): + text = text.replace(/'(?=\d{2}s)/g, "’"); + + // Get most opening single quotes: + text = text.replace(/(\s| |--|&[mn]dash;|&\#8211;|&\#8212;|&\#x201[34];)'(?=\w)/g, "$1‘"); + + // Single closing quotes: + text = text.replace(/([^\s\[\{\(\-])'/g, "$1’"); + text = text.replace(/'(?=\s|s\b)/g, "’"); + + // Any remaining single quotes should be opening ones: + text = text.replace(/'/g, "‘"); + + // Get most opening double quotes: + text = text.replace(/(\s| |--|&[mn]dash;|&\#8211;|&\#8212;|&\#x201[34];)"(?=\w)/g, "$1“"); + + // Double closing quotes: + text = text.replace(/([^\s\[\{\(\-])"/g, "$1”"); + text = text.replace(/"(?=\s)/g, "”"); + + // Any remaining quotes should be opening ones. + text = text.replace(/"/ig, "“"); + return text; + }; + + // Find and convert markdown extra definition lists into html. + Markdown.Extra.prototype.runSmartyPants = function(text) { + this.smartyPantsLastChar = ''; + text = this.educatePants(text); + // Clean everything inside html tags (some of them may have been converted due to our rough html parsing) + text = text.replace(/(<([a-zA-Z1-6]+)\b([^\n>]*?)(\/)?>)/g, revertPants); + return text; + }; + + /****************************************************************** + * Definition Lists * + ******************************************************************/ + + // Find and convert markdown extra definition lists into html. + Markdown.Extra.prototype.definitionLists = function(text) { + var wholeList = new RegExp( + ['(\\x02\\n?|\\n\\n)' , + '(?:' , + '(' , // $1 = whole list + '(' , // $2 + '[ ]{0,3}' , + '((?:[ \\t]*\\S.*\\n)+)', // $3 = defined term + '\\n?' , + '[ ]{0,3}:[ ]+' , // colon starting definition + ')' , + '([\\s\\S]+?)' , + '(' , // $4 + '(?=\\0x03)' , // \z + '|' , + '(?=' , + '\\n{2,}' , + '(?=\\S)' , + '(?!' , // Negative lookahead for another term + '[ ]{0,3}' , + '(?:\\S.*\\n)+?' , // defined term + '\\n?' , + '[ ]{0,3}:[ ]+' , // colon starting definition + ')' , + '(?!' , // Negative lookahead for another definition + '[ ]{0,3}:[ ]+' , // colon starting definition + ')' , + ')' , + ')' , + ')' , + ')' + ].join(''), + 'gm' + ); + + var self = this; + text = addAnchors(text); + + text = text.replace(wholeList, function(match, pre, list) { + var result = trim(self.processDefListItems(list)); + result = "
    \n" + result + "\n
    "; + return pre + self.hashExtraBlock(result) + "\n\n"; + }); + + return removeAnchors(text); + }; + + // Process the contents of a single definition list, splitting it + // into individual term and definition list items. + Markdown.Extra.prototype.processDefListItems = function(listStr) { + var self = this; + + var dt = new RegExp( + ['(\\x02\\n?|\\n\\n+)' , // leading line + '(' , // definition terms = $1 + '[ ]{0,3}' , // leading whitespace + '(?![:][ ]|[ ])' , // negative lookahead for a definition + // mark (colon) or more whitespace + '(?:\\S.*\\n)+?' , // actual term (not whitespace) + ')' , + '(?=\\n?[ ]{0,3}:[ ])' // lookahead for following line feed + ].join(''), // with a definition mark + 'gm' + ); + + var dd = new RegExp( + ['\\n(\\n+)?' , // leading line = $1 + '(' , // marker space = $2 + '[ ]{0,3}' , // whitespace before colon + '[:][ ]+' , // definition mark (colon) + ')' , + '([\\s\\S]+?)' , // definition text = $3 + '(?=\\n*' , // stop at next definition mark, + '(?:' , // next term or end of text + '\\n[ ]{0,3}[:][ ]|' , + '
    |\\x03' , // \z + ')' , + ')' + ].join(''), + 'gm' + ); + + listStr = addAnchors(listStr); + // trim trailing blank lines: + listStr = listStr.replace(/\n{2,}(?=\\x03)/, "\n"); + + // Process definition terms. + listStr = listStr.replace(dt, function(match, pre, termsStr) { + var terms = trim(termsStr).split("\n"); + var text = ''; + for (var i = 0; i < terms.length; i++) { + var term = terms[i]; + // process spans inside dt + term = convertSpans(trim(term), self); + text += "\n
    " + term + "
    "; + } + return text + "\n"; + }); + + // Process actual definitions. + listStr = listStr.replace(dd, function(match, leadingLine, markerSpace, def) { + if (leadingLine || def.match(/\n{2,}/)) { + // replace marker with the appropriate whitespace indentation + def = Array(markerSpace.length + 1).join(' ') + def; + // process markdown inside definition + // TODO?: currently doesn't apply extensions + def = outdent(def) + "\n\n"; + def = "\n" + convertAll(def, self) + "\n"; + } else { + // convert span-level markdown inside definition + def = rtrim(def); + def = convertSpans(outdent(def), self); + } + + return "\n
    " + def + "
    \n"; + }); + + return removeAnchors(listStr); + }; + + + /*********************************************************** + * Strikethrough * + ************************************************************/ + + Markdown.Extra.prototype.strikethrough = function(text) { + // Pretty much duplicated from _DoItalicsAndBold + return text.replace(/([\W_]|^)~T~T(?=\S)([^\r]*?\S[\*_]*)~T~T([\W_]|$)/g, + "$1$2$3"); + }; + + + /*********************************************************** + * New lines * + ************************************************************/ + + Markdown.Extra.prototype.newlines = function(text) { + // We have to ignore already converted newlines and line breaks in sub-list items + return text.replace(/(<(?:br|\/li)>)?\n/g, function(wholeMatch, previousTag) { + return previousTag ? wholeMatch : "
    \n"; + }); + }; + +})(); + diff --git a/assets/public/editor/Markdown.Sanitizer.js b/assets/public/editor/Markdown.Sanitizer.js new file mode 100644 index 0000000..73f5d74 --- /dev/null +++ b/assets/public/editor/Markdown.Sanitizer.js @@ -0,0 +1,108 @@ +(function () { + var output, Converter; + if (typeof exports === "object" && typeof require === "function") { // we're in a CommonJS (e.g. Node.js) module + output = exports; + Converter = require("./Markdown.Converter").Converter; + } else { + output = window.Markdown; + Converter = output.Converter; + } + + output.getSanitizingConverter = function () { + var converter = new Converter(); + converter.hooks.chain("postConversion", sanitizeHtml); + converter.hooks.chain("postConversion", balanceTags); + return converter; + } + + function sanitizeHtml(html) { + return html.replace(/<[^>]*>?/gi, sanitizeTag); + } + + // (tags that can be opened/closed) | (tags that stand alone) + var basic_tag_whitelist = /^(<\/?(b|blockquote|code|del|dd|dl|dt|em|h1|h2|h3|i|kbd|li|ol(?: start="\d+")?|p|pre|s|sup|sub|strong|strike|ul)>|<(br|hr)\s?\/?>)$/i; + // | + var a_white = /^(]+")?\s?>|<\/a>)$/i; + + // ]*")?(\stitle="[^"<>]*")?\s?\/?>)$/i; + + function sanitizeTag(tag) { + if (tag.match(basic_tag_whitelist) || tag.match(a_white) || tag.match(img_white)) + return tag; + else + return ""; + } + + /// + /// attempt to balance HTML tags in the html string + /// by removing any unmatched opening or closing tags + /// IMPORTANT: we *assume* HTML has *already* been + /// sanitized and is safe/sane before balancing! + /// + /// adapted from CODESNIPPET: A8591DBA-D1D3-11DE-947C-BA5556D89593 + /// + function balanceTags(html) { + + if (html == "") + return ""; + + var re = /<\/?\w+[^>]*(\s|$|>)/g; + // convert everything to lower case; this makes + // our case insensitive comparisons easier + var tags = html.toLowerCase().match(re); + + // no HTML tags present? nothing to do; exit now + var tagcount = (tags || []).length; + if (tagcount == 0) + return html; + + var tagname, tag; + var ignoredtags = "



  • "; + var match; + var tagpaired = []; + var tagremove = []; + var needsRemoval = false; + + // loop through matched tags in forward order + for (var ctag = 0; ctag < tagcount; ctag++) { + tagname = tags[ctag].replace(/<\/?(\w+).*/, "$1"); + // skip any already paired tags + // and skip tags in our ignore list; assume they're self-closed + if (tagpaired[ctag] || ignoredtags.search("<" + tagname + ">") > -1) + continue; + + tag = tags[ctag]; + match = -1; + + if (!/^<\//.test(tag)) { + // this is an opening tag + // search forwards (next tags), look for closing tags + for (var ntag = ctag + 1; ntag < tagcount; ntag++) { + if (!tagpaired[ntag] && tags[ntag] == "") { + match = ntag; + break; + } + } + } + + if (match == -1) + needsRemoval = tagremove[ctag] = true; // mark for removal + else + tagpaired[match] = true; // mark paired + } + + if (!needsRemoval) + return html; + + // delete all orphaned tags from the string + + var ctag = 0; + html = html.replace(re, function (match) { + var res = tagremove[ctag] ? "" : match; + ctag++; + return res; + }); + return html; + } +})(); diff --git a/assets/public/editor/cmunrb.otf b/assets/public/editor/cmunrb.otf new file mode 100644 index 0000000000000000000000000000000000000000..57e6e6d54730a0684dcdeff4263aeeb300bd59be GIT binary patch literal 216080 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

    9X0GZYDY0lNQf%2mLY}^s|4! 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 literal 0 HcmV?d00001 diff --git a/assets/public/editor/cmunrm.otf b/assets/public/editor/cmunrm.otf new file mode 100644 index 0000000000000000000000000000000000000000..b449df04c3c62152d99906a90a772d463d81e712 GIT binary patch literal 330492 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

    ^6dgV;mERwilKwvz3V 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 z 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%0AtxlXuTzRt4cK#4|zLjUb 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 + + + + + + +Editor + + + + + + + + + + + + + + +

    + +
    + +
    +
    ?
    +
    +
    X
    +
        
    +Writing is a lightweight distraction-free text editor.
    +Write text on the left, and the result is displayed on the right.
    +
    +Commands
    +--------
    +CTRL + D: toggle display mode (editor only, preview only or both-at-the-same-time)
    +CTRL + P: print or export as PDF
    +CTRL + S: save source code as .MD file
    +CTRL + SHIFT + O: open .MD file
    +CTRL + SHIFT + 7: send to the storage
    +
    +CTRL + SHIFT + L: enable / disable LaTeX (i.e. math formulas)
    +CTRL + SHIFT + D: toggle dark mode
    +CTRL + SHIFT + R: toggle roman (LaTex-like) or sans-serif font
    +CTRL + SHIFT + H: show this help dialog
    +
    +F11: full-screen (in most browsers)
    +
    +Markdown syntax
    +---------------
    +#Title
    +##Subtitle
    +This is *italic* and this is **bold**.
    +This is a [link](http://www.example.com/) and this is an ![image](imagelink.jpg).
    +Write code with `...` or by adding a 4-whitespace indent to the paragraph.
    +> This is a quote.
    +
    +LaTeX syntax
    +------------
    +This formula $x^2+1$ will be displayed inline.
    +This formula $$x^2+1$$ will be displayed in a new paragraph.
    +
    +Specific syntax
    +---------------
    +\pagebreak will trigger a pagebreak when printing / exporting to PDF.
    +
    +About
    +-----
    +Made by @JosephErnest
    +https://github.com/josephernest/writing
    +Uses Pagedown, Pagedown Extra, MathJax, StackOverflow's editor code and the Computer Modern font.
    +
    +
    + + + + + + + diff --git a/assets/public/editor/mathjax-editing_writing.js b/assets/public/editor/mathjax-editing_writing.js new file mode 100644 index 0000000..6b660b6 --- /dev/null +++ b/assets/public/editor/mathjax-editing_writing.js @@ -0,0 +1,375 @@ +// Comes from: http://dev.stackoverflow.com/content/js/mathjax-editing.js (MIT-License) +// Version downloaded 2016-11-21 +// +// Two things modified: +// +// - StackExchange.mathjaxEditing = (function () { +// + function mjpd() { this.mathjaxEditing = (function () { +// - converterObject.hooks.chain("preSafe", replaceMath); +// + converterObject.hooks.chain("postConversion", replaceMath); +// - return { prepareWmdForMathJax: prepareWmdForMathJax };})(); +// + return { prepareWmdForMathJax: prepareWmdForMathJax } })(); } + + +"use strict"; + +function mjpd() { + this.mathjaxEditing = (function () { + var ready = false; // true after initial typeset is complete + var pending = null; // non-null when typesetting has been queued + var inline = "$"; // the inline math delimiter + var blocks, start, end, last, braces, indent; // used in searching for math + var math; // stores math until markdone is done + var HUB = MathJax.Hub, TEX, NOERRORS; + + // + // Runs after initial typeset + // + HUB.Queue(function () { + TEX = MathJax.InputJax.TeX; + NOERRORS = TEX.config.noErrors; + ready = true; + HUB.processUpdateTime = 50; // reduce update time so that we can cancel easier + HUB.processSectionDelay = 0; // don't pause between input and output phases + MathJax.Extension["fast-preview"].Disable(); // disable fast-preview + HUB.Config({ + // reduce chunk for more frequent updates + "HTML-CSS": { + EqnChunk: 10, + EqnChunkFactor: 1 + }, + CommonHTML: { + EqnChunk: 10, + EqnChunkFactor: 1 + }, + SVG: { + EqnChunk: 10, + EqnChunkFactor: 1 + } + }); + if (pending) return RestartMJ(pending, "Typeset"); + }); + + // + // These get called before and after typsetting + // + function preTypeset() { + NOERRORS.disabled = true; // disable noErrors (error will be shown) + TEX.resetEquationNumbers(); // reset labels + } + function postTypeset() { + NOERRORS.disabled = false; // don't show errors when not editing + } + + // + // The pattern for math delimiters and special symbols + // needed for searching for math in the page. + // + var SPLIT = /(\$\$?|\\(?:begin|end)\{[a-z]*\*?\}|\\[\\{}$]|[{}]|(?:\n\s*)+|@@\d+@@|`+)/i; + + // + // The math is in blocks i through j, so + // collect it into one block and clear the others. + // Replace &, <, and > by named entities. + // For IE, put
    at the ends of comments since IE removes \n. + // Clear the current math positions and store the index of the + // math, then push the math string onto the storage array. + // + function processMath(i, j) { + var block = blocks.slice(i, j + 1).join("") + .replace(/&/g, "&") // use HTML entity for & + .replace(//g, ">") // use HTML entity for > + ; + if (indent) block = block.replace(/\n /g, "\n"); + if (HUB.Browser.isMSIE) { + block = block.replace(/(%[^\n]*)\n/g, "$1
    \n"); + } + while (j > i) blocks[j--] = ""; + blocks[i] = "@@" + math.length + "@@"; + math.push(block); + start = end = last = null; + } + + + var capturingStringSplit; + if ("aba".split(/(b)/).length === 3) { + capturingStringSplit = function (str, regex) { return str.split(regex); }; + } + else { // IE8 + capturingStringSplit = function (str, regex) { + var result = [], match; + if (!regex.global) { + var source = regex.toString(), + flags = ""; + source = source.replace(/^\/(.*)\/([im]*)$/, function (wholematch, re, fl) { flags = fl; return re; }); + regex = new RegExp(source, flags + "g"); + } + regex.lastIndex = 0; + var lastPos = 0; + while ((match = regex.exec(str))) { + result.push(str.substring(lastPos, match.index)); + result.push.apply(result, match.slice(1)); + lastPos = match.index + match[0].length; + } + result.push(str.substring(lastPos)); + return result; + }; + } + + + // + // Break up the text into its component parts and search + // through them for math delimiters, braces, linebreaks, etc. + // Math delimiters must match and braces must balance. + // Don't allow math to pass through a double linebreak + // (which will be a paragraph). + // Handle backticks (don't do math inside them) + // + function removeMath(text) { + start = end = last = indent = null; // for tracking math delimiters + math = []; // stores math strings for latter + + blocks = capturingStringSplit(text.replace(/\r\n?/g, "\n"), SPLIT); + + for (var i = 1, m = blocks.length; i < m; i += 2) { + var block = blocks[i]; + if (block.charAt(0) === "@") { + // + // Things that look like our math markers will get + // stored and then retrieved along with the math. + // + blocks[i] = "@@" + math.length + "@@"; + math.push(block); + } + else if (start) { + // + // If we are in math or backticks, + // look for the end delimiter, + // but don't go past double line breaks, + // and balance braces within the math, + // but don't process math inside backticks. + // + if (block === end) { + if (braces > 0) { + last = i; + } + else if (braces === 0) { + processMath(start, i); + } + else { + start = end = last = null; + } + } + else if (block.match(/\n.*\n/) || i + 2 >= m) { + if (last) { + i = last; + if (braces >= 0) processMath(start, i); + } + start = end = last = null; + braces = 0; + } + else if (block === "{" && braces >= 0) { + braces++; + } + else if (block === "}" && braces > 0) { + braces--; + } + } + else { + // + // Look for math start delimiters and when + // found, set up the end delimiter. + // + if (block === inline || block === "$$") { + start = i; + end = block; + braces = 0; + } + else if (block.substr(1, 5) === "begin") { + start = i; + end = "\\end" + block.substr(6); + braces = 0; + } + else if (block.charAt(0) === "`") { + start = last = i; + end = block; + braces = -1; // no brace balancing + } + else if (block.charAt(0) === "\n") { + if (block.match(/ $/)) indent = true; + } + } + } + if (last) processMath(start, last); + return blocks.join(""); + } + + // + // Put back the math strings that were saved, + // and clear the math array (no need to keep it around). + // + function replaceMath(text) { + text = text.replace(/@@(\d+)@@/g, function (match, n) { + return math[n]; + }); + math = null; + return text; + } + + // + // This is run to restart MathJax after it has finished + // the previous run (that may have been canceled) + // + function RestartMJ(preview, method) { + pending = false; + HUB.cancelTypeset = false; // won't need to do this in the future + HUB.Queue( + preTypeset, + [method, HUB, preview], + postTypeset + ); + } + + // + // When the preview changes, cancel MathJax and restart, + // if we haven't done that already. + // + function UpdateMJ(preview, method) { + if (!pending) { + pending = preview; + if (ready) { + HUB.Cancel(); + HUB.Queue([RestartMJ, preview, method]); + } + } + } + + // + // Save the preview ID and the inline math delimiter. + // Create a converter for the editor and register a preConversion hook + // to handle escaping the math. + // Create a preview refresh hook to handle starting MathJax. + // Check if any errors are being displayed (in case there were + // errors in the initial display, which doesn't go through + // onPreviewRefresh), and reprocess if there are. + // + function prepareWmdForMathJax(editorObject, wmdId, delimiters) { + var preview = document.getElementById("wmd-preview" + wmdId); + inline = delimiters[0][0]; + + var converterObject = editorObject.getConverter(); + converterObject.hooks.chain("preConversion", removeMath); + converterObject.hooks.chain("postConversion", replaceMath); + editorObject.hooks.chain("onPreviewRefresh", function () { + UpdateMJ(preview, "Typeset"); + }); + + HUB.Queue(function () { + if (preview && preview.querySelector(".mjx-noError")) { + RestartMJ(preview, "Reprocess"); + } + }); + } + + return { + prepareWmdForMathJax: prepareWmdForMathJax + } + })(); +} +// +// Set up MathJax to allow canceling of typesetting, if it +// doesn't already have that. +// +(function () { + var HUB = MathJax.Hub; + + if (!HUB.Cancel) { + + HUB.cancelTypeset = false; + var CANCELMESSAGE = "MathJax Canceled"; + + HUB.Register.StartupHook("HTML-CSS Jax Config", function () { + var HTMLCSS = MathJax.OutputJax["HTML-CSS"], + TRANSLATE = HTMLCSS.Translate; + HTMLCSS.Augment({ + Translate: function (script, state) { + if (HUB.cancelTypeset || state.cancelled) { + throw Error(CANCELMESSAGE) + } + return TRANSLATE.call(HTMLCSS, script, state); + } + }); + }); + + HUB.Register.StartupHook("SVG Jax Config", function () { + var SVG = MathJax.OutputJax["SVG"], + TRANSLATE = SVG.Translate; + SVG.Augment({ + Translate: function (script, state) { + if (HUB.cancelTypeset || state.cancelled) { + throw Error(CANCELMESSAGE) + } + return TRANSLATE.call(SVG, script, state); + } + }); + }); + + HUB.Register.StartupHook("CommonHTML Jax Config", function () { + var CHTML = MathJax.OutputJax.CommonHTML, + TRANSLATE = CHTML.Translate; + CHTML.Augment({ + Translate: function (script, state) { + if (HUB.cancelTypeset || state.cancelled) { + throw Error(CANCELMESSAGE); + } + return TRANSLATE.call(CHTML, script, state); + } + }); + }); + + HUB.Register.StartupHook("PreviewHTML Jax Config", function () { + var PHTML = MathJax.OutputJax.PreviewHTML, + TRANSLATE = PHTML.Translate; + PHTML.Augment({ + Translate: function (script, state) { + if (HUB.cancelTypeset || state.cancelled) { + throw Error(CANCELMESSAGE); + } + return TRANSLATE.call(PHTML, script, state); + } + }); + }); + + HUB.Register.StartupHook("TeX Jax Config", function () { + var TEX = MathJax.InputJax.TeX, + TRANSLATE = TEX.Translate; + TEX.Augment({ + Translate: function (script, state) { + if (HUB.cancelTypeset || state.cancelled) { + throw Error(CANCELMESSAGE) + } + return TRANSLATE.call(TEX, script, state); + } + }); + }); + + var PROCESSERROR = HUB.processError; + HUB.processError = function (error, state, type) { + if (error.message !== CANCELMESSAGE) { + return PROCESSERROR.call(HUB, error, state, type) + } + MathJax.Message.Clear(0, 0); + state.jaxIDs = []; + state.jax = {}; + state.scripts = []; + state.i = state.j = 0; + state.cancelled = true; + return null; + }; + + HUB.Cancel = function () { + this.cancelTypeset = true; + }; + } +})(); \ No newline at end of file diff --git a/assets/public/index.html b/assets/public/index.html index f386a5d..fe01ea5 100644 --- a/assets/public/index.html +++ b/assets/public/index.html @@ -8,34 +8,16 @@
    -

    NoteHub

    -

    Pastebin for One-Off Markdown Publishing

    -
    - See Demo Note New Note + All Notes +
    + Nice Editor + +
    -
    -

    Changelog

    -
      -
    • 2017-09: NoteHub 3.0 rewritten in Go.
    • -
    • 2016-03: Note deletion feature added.
    • -
    • 2015-10: NoteHub 2.0 rewritten in Node.js.
    • -
    • 2015-10: NoteHub API and note styling discontinued due to low adoption.
    • -
    • 2014-09: text size setting added
    • -
    • 2014-07: deprecated all API versions less than 1.4 & performance improvements.
    • -
    • 2014-03: note expiration implemented.
    • -
    • 2014-02: a simple JS-client for API testing added.
    • -
    • 2014-01: NoteHub API, mobile friendly styling and more.
    • -
    • 2013-03: new color themes.
    • -
    • 2012-07: password protection for note editing added.
    • -
    • 2012-06: NoteHub 1.0 released as a result of an experiment.
    • -
    -
    diff --git a/assets/public/new.js b/assets/public/new.js index a39ca4d..4a6d320 100644 --- a/assets/public/new.js +++ b/assets/public/new.js @@ -2,28 +2,25 @@ function $(id) { return document.getElementById(id) } -function toggleButton() { $('publish-button').disabled = !$('tos').checked } - -function submitForm(token) { - var id = $("id").value; - var text = $("text").value; - var deletion = id != "" && text == ""; +function submitForm() { + const id = $("id").value; + const text = $("text").value; + const name = $("name").value; + const deletion = id !== "" && text === ""; if (deletion && !confirm("Do you want to delete this note?")) { return; } - var resp = post("/", { + const resp = post("/", { "id": id, "text": text, - "tos": $("tos").value, - "password": $("password").value, - "token": token + "name": name, + "password": $("password").value }, function (status, responseRaw) { - var response = JSON.parse(responseRaw); + const response = JSON.parse(responseRaw); if (status < 400 && response.Success) { window.location.replace(deletion ? "/" : "/" + response.Payload) } else { - grecaptcha.reset(); $('feedback').innerHTML = status + ": " + response.Payload; } - }) + }); } diff --git a/assets/public/note.js b/assets/public/note.js index d800522..dbb1c16 100644 --- a/assets/public/note.js +++ b/assets/public/note.js @@ -1,20 +1,13 @@ "use strict"; function post(url, vals, cb) { - var data = new FormData(); - for (var key in vals) { + const data = new FormData(); + for (const key in vals) { data.append(key, vals[key]); } - var xhr = new XMLHttpRequest(); + const xhr = new XMLHttpRequest(); xhr.open('POST', url) xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE) return cb(xhr.status, xhr.responseText) }; xhr.send(data); } -function report(id) { - var resp = prompt("Please shortly explain the problem with this note."); - if (resp) { - post('/' + id + '/report', { "report": resp }) - alert("Thank you!") - } -} diff --git a/assets/public/robots.txt b/assets/public/robots.txt index 86a5112..7b9d52d 100644 --- a/assets/public/robots.txt +++ b/assets/public/robots.txt @@ -1,5 +1,2 @@ User-agent: * -Disallow: /new -Disallow: /*edit -Disallow: /*export -Disallow: /*stats \ No newline at end of file +Disallow: /* \ No newline at end of file diff --git a/assets/public/style.css b/assets/public/style.css index 9ea810f..1fe82f5 100644 --- a/assets/public/style.css +++ b/assets/public/style.css @@ -9,7 +9,7 @@ html, body { padding: 0; margin: 0; color: #353a3a; - background: #c5caca; + background: #EBEBEB; } #hero { @@ -18,24 +18,11 @@ html, body { padding-top: 5em; } -.ui-border { - border-radius: 3px; - border: 1px solid #333; -} - a { border-bottom: 1px dotted; text-decoration: none; font-weight: bold; - color: #086; -} - -a:hover { - color: #097; -} - -a:visited { - color: #075; + color: #52489C; } .button { @@ -43,13 +30,13 @@ a:visited { } .ui-elem { - background: #fff; + background: whitesmoke; font-size: 1em; opacity: 0.8; padding: 0.3em; - border-radius: 3px; font-weight: 300; - border: 1px solid #333; + border: 3px black solid; + border-radius: 10px; } .landing-button { @@ -57,13 +44,15 @@ a:visited { display: inline-block; width: 10em; white-space: nowrap; - border-radius: 3px; - border: none; margin: 0.5em; - background: #0a6; font-size: 1.5em; text-decoration: none; font-weight: 300; + color: #52489C; + border: 3px solid black; + background-color: #59C3C3; + border-radius: 25px; + transition: 0.5s; } .landing-button.demo { @@ -73,7 +62,9 @@ a:visited { } .landing-button:hover { - background: #0b7; + -webkit-box-shadow: 5px 5px 15px 5px rgba(0, 0, 0, 0.44); + box-shadow: 5px 5px 15px 5px rgba(0, 0, 0, 0.44); + transform: scale(1.12) } .landing-button.demo:hover { @@ -136,10 +127,7 @@ h6 { article { text-align: justify; - margin-top: 3em; - margin-bottom: 5em; - margin-right: auto; - margin-left: auto; + margin: 3em auto 5em; } article img { @@ -192,7 +180,7 @@ pre, code { font-family: monospace; font-size: 1.1em; border-radius: 3px; - background-color: #b5baba; + background-color: #EBEBEB; } pre { @@ -205,7 +193,7 @@ table { } th { - background-color: #b5baba; + background-color: #EBEBEB; line-height: 2.5em; padding: 0.3em; } @@ -221,16 +209,16 @@ td { } textarea { - background-color: #b5baba; + background-color: whitesmoke; font-size: 1.2em; - border-radius: 5px; flex: 1 0; margin: 3em; padding: 2em; } textarea, fieldset { - border: none; + border: 3px black solid; + border-radius: 10px; } fieldset { diff --git a/assets/templates/form.html b/assets/templates/form.html index fa726c0..3dc8af5 100644 --- a/assets/templates/form.html +++ b/assets/templates/form.html @@ -6,7 +6,6 @@ - @@ -16,11 +15,12 @@
    - - @@ -29,13 +29,8 @@ -
    -
    -{{end}} + +{{end}} \ No newline at end of file diff --git a/assets/templates/list.html b/assets/templates/list.html new file mode 100644 index 0000000..2d31064 --- /dev/null +++ b/assets/templates/list.html @@ -0,0 +1,23 @@ +{{define "List"}} + + + + NoteHub List + + + + + +
    + {{range .}} + {{.ID }} +
    + {{end}} +
    +
    + + + +{{end}} \ No newline at end of file diff --git a/assets/templates/note.html b/assets/templates/note.html index 9d92a37..2b8ac4e 100644 --- a/assets/templates/note.html +++ b/assets/templates/note.html @@ -28,9 +28,7 @@ stats · edit · export · - report abuse · {{end}} - tos diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..ed4e589 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,11 @@ +version: "3.9" +services: + notes: + build: . + volumes: + - data:/data + ports: + - "127.0.0.1:8877:3000" + restart: always +volumes: + data: \ No newline at end of file diff --git a/email.go b/email.go deleted file mode 100644 index 0191309..0000000 --- a/email.go +++ /dev/null @@ -1,16 +0,0 @@ -package main - -import ( - "fmt" - "net/smtp" - "os" -) - -func email(id, text string) error { - smtpServer := os.Getenv("SMTP_SERVER") - auth := smtp.PlainAuth("", os.Getenv("SMTP_USER"), os.Getenv("SMTP_PASSWORD"), smtpServer) - to := []string{os.Getenv("NOTEHUB_ADMIN_EMAIL")} - msg := []byte("Subject: Note reported\r\n\r\n" + - fmt.Sprintf("Note https://notehub.org/%s was reported: %q\r\n", id, text)) - return smtp.SendMail(smtpServer+":587", auth, to[0], to, msg) -} diff --git a/render.go b/render.go index 7628166..364e275 100644 --- a/render.go +++ b/render.go @@ -29,6 +29,7 @@ var ( errorUnathorised = errors.New("password is wrong") errorBadRequest = errors.New("password is empty") + errorNameExists = errors.New("name exists") ) func (n *Note) prepare() { diff --git a/server.go b/server.go index 1f48bf1..8eeca09 100644 --- a/server.go +++ b/server.go @@ -1,13 +1,11 @@ package main import ( - "encoding/json" "fmt" "html/template" "io" "io/ioutil" "net/http" - "net/url" "os" "time" @@ -19,7 +17,6 @@ import ( "github.com/labstack/gommon/log" ) -var TEST_MODE = false type Template struct{ templates *template.Template } @@ -31,14 +28,12 @@ func main() { e := echo.New() e.Logger.SetLevel(log.DEBUG) - db, err := sql.Open("sqlite3", "./database.sqlite") + db, err := sql.Open("sqlite3", "./data/database.sqlite") if err != nil { e.Logger.Error(err) } defer db.Close() - TEST_MODE = os.Getenv("TEST_MODE") != "" - adsFName := os.Getenv("ADS") var ads template.HTML if adsFName != "" { @@ -60,14 +55,15 @@ func main() { e.File("/note.js", "assets/public/note.js") e.File("/index.html", "assets/public/index.html") e.File("/", "assets/public/index.html") + e.File("/Markdown.Converter.js", "assets/public/editor/Markdown.Converter.js") + e.File("/Markdown.Editor.js", "assets/public/editor/Markdown.Editor.js") + e.File("/Markdown.Extra.js", "assets/public/editor/Markdown.Extra.js") + e.File("/Markdown.Sanitizer.js", "assets/public/editor/Markdown.Sanitizer.js") + e.File("/mathjax-editing_writing.js", "assets/public/editor/mathjax-editing_writing.js") + e.File("/cmunrb.otf", "assets/public/editor/cmunrb.otf") + e.File("/cmunrm.otf", "assets/public/editor/cmunrm.otf") + e.File("/editor", "assets/public/editor/index.html") - e.GET("/TOS.md", func(c echo.Context) error { - n, code := md2html(c, "TOS") - if code != http.StatusOK { - c.String(code, statuses[code]) - } - return c.Render(code, "Page", n) - }) e.GET("/:id", func(c echo.Context) error { id := c.Param("id") @@ -130,9 +126,6 @@ func main() { if report != "" { id := c.Param("id") c.Logger().Infof("note %s was reported: %s", id, report) - if err := email(id, report); err != nil { - c.Logger().Errorf("couldn't send email: %v", err) - } } return c.NoContent(http.StatusNoContent) }) @@ -142,6 +135,15 @@ func main() { return c.Render(http.StatusOK, "Form", nil) }) + e.GET("/list", func(c echo.Context) error { + c.Logger().Debug("GET /list") + notes, err := loadAll(c, db) + if err != http.StatusOK { + return c.String(err, "Error happened") + } + return c.Render(http.StatusOK, "List", notes) + }) + type postResp struct { Success bool Payload string @@ -149,27 +151,13 @@ func main() { e.POST("/", func(c echo.Context) error { c.Logger().Debug("POST /") - if !TEST_MODE && !checkRecaptcha(c, c.FormValue("token")) { - code := http.StatusForbidden - return c.JSON(code, postResp{false, statuses[code] + ": robot check failed"}) - } - if c.FormValue("tos") != "on" { - code := http.StatusPreconditionFailed - c.Logger().Errorf("POST / error: %d", code) - return c.JSON(code, postResp{false, statuses[code]}) - } id := c.FormValue("id") text := c.FormValue("text") - l := len(text) - if (id == "" || id != "" && l != 0) && (10 > l || l > 50000) { - code := http.StatusBadRequest - c.Logger().Errorf("POST / error: %d", code) - return c.JSON(code, postResp{false, statuses[code] + ": note length not accepted"}) - } n := &Note{ ID: id, Text: text, Password: c.FormValue("password"), + Name: c.FormValue("name"), } n, err = save(c, db, n) if err != nil { @@ -179,6 +167,8 @@ func main() { code = http.StatusUnauthorized } else if err == errorBadRequest { code = http.StatusBadRequest + } else if err == errorNameExists { + code = http.StatusBadRequest } c.Logger().Errorf("POST / error: %d", code) return c.JSON(code, postResp{false, statuses[code] + ": " + err.Error()}) @@ -201,31 +191,3 @@ func main() { } e.Logger.Fatal(e.StartServer(s)) } - -func checkRecaptcha(c echo.Context, captchaResp string) bool { - resp, err := http.PostForm("https://www.google.com/recaptcha/api/siteverify", url.Values{ - "secret": []string{os.Getenv("RECAPTCHA_SECRET")}, - "response": []string{captchaResp}, - "remoteip": []string{c.Request().RemoteAddr}, - }) - if err != nil { - c.Logger().Errorf("captcha response verification failed: %v", err) - return false - } - defer resp.Body.Close() - respJson := &struct { - Success bool `json:"success"` - ErrorCodes []string `json:"error-codes"` - }{} - s, err := ioutil.ReadAll(resp.Body) - err = json.Unmarshal(s, respJson) - if err != nil { - c.Logger().Errorf("captcha response parse recaptcha response: %v", err) - return false - } - if !respJson.Success { - c.Logger().Warnf("captcha validation failed: %v", respJson.ErrorCodes) - } - return respJson.Success - -} diff --git a/stats.go b/stats.go index 6cfa6d7..4f38008 100644 --- a/stats.go +++ b/stats.go @@ -53,7 +53,5 @@ func incViews(n *Note, db *sql.DB) { } } stats.Store(n.ID, views+1) - if TEST_MODE { - flush(db) - } + _, _ = flush(db) } diff --git a/storage.go b/storage.go index 02bf462..43e6436 100644 --- a/storage.go +++ b/storage.go @@ -32,7 +32,7 @@ var ( ) type Note struct { - ID, Title, Text, Password, DeprecatedPassword, Encoded string + ID, Title, Text, Password, DeprecatedPassword, Encoded, Name string Published, Edited time.Time Views int Content, Ads template.HTML @@ -109,13 +109,16 @@ func insert(c echo.Context, db *sql.DB, n *Note) (*Note, error) { } stmt, _ := tx.Prepare("insert into notes(id, text, password) values(?, ?, ?)") defer stmt.Close() - id := randId() + id := n.Name + if id == "" { + id = randId() + } _, err = stmt.Exec(id, n.Text, n.Password) if err != nil { tx.Rollback() if strings.HasPrefix(err.Error(), "UNIQUE constraint failed") { c.Logger().Infof("collision on id %s", id) - return save(c, db, n) + return nil, errorNameExists } return nil, err } @@ -168,3 +171,36 @@ func load(c echo.Context, db *sql.DB) (*Note, int) { n.prepare() return n, http.StatusOK } + +func loadAll(c echo.Context, db *sql.DB) ([]Note, int) { + + c.Logger().Debug("loading notes") + stmt, _ := db.Prepare("select * from notes") + defer stmt.Close() + rows, _ := stmt.Query() + var notes []Note + for rows.Next() { + var id, text, password string + var published time.Time + var editedVal interface{} + var views int + if err := rows.Scan(&id, &text, &published, &editedVal, &password, &views); err != nil { + code := http.StatusNotFound + return nil, code + } + n := &Note{ + ID: id, + Text: text, + Views: views, + Published: published, + } + if editedVal != nil { + n.Edited = editedVal.(time.Time) + } + n.prepare() + notes = append(notes, *n) + } + + + return notes, http.StatusOK +} diff --git a/test/main.go b/test/main.go deleted file mode 100644 index 71be9f6..0000000 --- a/test/main.go +++ /dev/null @@ -1,377 +0,0 @@ -package main - -import ( - "strings" - - simplejson "github.com/bitly/go-simplejson" - "github.com/verdverm/frisby" -) - -func main() { - - service := "http://localhost:3000" - - frisby.Create("Test Notehub landing page"). - Get(service). - Send(). - ExpectHeader("Content-Type", "text/html; charset=utf-8"). - ExpectStatus(200). - ExpectContent("Pastebin for One-Off Markdown Publishing") - - frisby.Create("Test Notehub TOS Page"). - Get(service+"/TOS.md"). - Send(). - ExpectHeader("Content-Type", "text/html; charset=UTF-8"). - ExpectStatus(200). - ExpectContent("Terms of Service") - - frisby.Create("Test /new page"). - Get(service+"/new"). - Send(). - ExpectHeader("Content-Type", "text/html; charset=UTF-8"). - ExpectStatus(200). - ExpectContent("Publish Note") - - frisby.Create("Test non-existing page"). - Get(service+"/xxyyzz"). - Send(). - ExpectStatus(404). - ExpectHeader("Content-Type", "text/plain; charset=UTF-8"). - ExpectContent("Not found") - - frisby.Create("Test non-existing page: query params"). - Get(service + "/xxyyzz?q=v"). // TODO: test the same for valid note - Send(). - ExpectStatus(404). - ExpectContent("Not found") - - frisby.Create("Test non-existing page: alphabet violation"). - Get(service + "/login.php"). - Send(). - ExpectStatus(404). - ExpectContent("Not found") - - frisby.Create("Test publishing: no input"). - Post(service+"/"). - Send(). - ExpectStatus(412). - ExpectJson("Success", false). - ExpectJson("Payload", "Precondition failed") - - frisby.Create("Test publishing attempt: only TOS set"). - Post(service+"/"). - SetData("tos", "on"). - Send(). - ExpectStatus(400). - ExpectJson("Success", false). - ExpectJson("Payload", "Bad request: note length not accepted") - - testNote := "# Hello World!\nThis is a _test_ note!" - - tooLongNote := testNote - for len(tooLongNote) < 50000 { - tooLongNote += tooLongNote - } - - frisby.Create("Test publishing: too long note"). - Post(service+"/"). - SetData("tos", "on"). - SetData("text", tooLongNote). - Send(). - ExpectStatus(400). - ExpectJson("Success", false). - ExpectJson("Payload", "Bad request: note length not accepted") - - var id string - frisby.Create("Test publishing: correct inputs; no password"). - Post(service+"/"). - SetData("tos", "on"). - SetData("text", testNote). - Send(). - ExpectStatus(201). - ExpectJson("Success", true). - AfterJson(func(F *frisby.Frisby, json *simplejson.Json, err error) { - noteID, err := json.Get("Payload").String() - if err != nil { - F.AddError(err.Error()) - return - } - id = noteID - }) - - testNoteHTML := "

    Hello World!

    \n

    This is a test note!

    " - frisby.Create("Test retrieval of new note"). - Get(service + "/" + id). - Send(). - // simulate 3 requests (for stats) - Get(service + "/" + id). - Send(). - Get(service + "/" + id). - Send(). - ExpectStatus(200). - ExpectContent(testNoteHTML) - - frisby.Create("Test export of new note"). - Get(service+"/"+id+"/export"). - Send(). - ExpectStatus(200). - ExpectHeader("Content-type", "text/plain; charset=UTF-8"). - ExpectContent(testNote) - - frisby.Create("Test opening fake service on note"). - Get(service + "/" + id + "/asd"). - Send(). - ExpectStatus(404). - ExpectContent("Not Found") - - // TODO: fix this - // frisby.Create("Test opening fake service on note 2"). - // Get(service + "/" + id + "/exports"). - // Send(). - // ExpectStatus(404). - // ExpectContent("Not Found") - - frisby.Create("Test stats of new note"). - Get(service + "/" + id + "/stats"). - Send(). - ExpectStatus(200). - ExpectContent("Views: 4"). - ExpectContent("Published") - - frisby.Create("Test edit page of new note"). - Get(service+"/"+id+"/edit"). - Send(). - ExpectStatus(200). - ExpectHeader("Content-type", "text/html; charset=UTF-8"). - ExpectContent(testNote) - - frisby.Create("Test invalid editing attempt: empty inputs"). - Post(service+"/"). - SetData("id", id). - Send(). - ExpectStatus(412) - - frisby.Create("Test invalid editing attempt: tos only"). - Post(service+"/"). - SetData("id", id). - SetData("tos", "on"). - Send(). - ExpectStatus(400). - ExpectJson("Success", false). - ExpectJson("Payload", "Bad request: password is empty") - - frisby.Create("Test invalid editing attempt: tos and password"). - Post(service+"/"). - SetData("id", id). - SetData("tos", "on"). - SetData("password", "aazzss"). - Send(). - ExpectStatus(401). - ExpectJson("Success", false). - ExpectJson("Payload", "Unauthorized: password is wrong") - - frisby.Create("Test invalid editing attempt: tos and password, but too short note"). - Post(service+"/"). - SetData("id", id). - SetData("tos", "on"). - SetData("text", "Test"). - SetData("password", "aazzss"). - Send(). - ExpectStatus(400). - ExpectJson("Success", false). - ExpectJson("Payload", "Bad request: note length not accepted") - - frisby.Create("Test publishing: correct inputs; with password"). - Post(service+"/"). - SetData("tos", "on"). - SetData("password", "aa11qq"). - SetData("text", testNote). - Send(). - ExpectStatus(201). - ExpectJson("Success", true). - AfterJson(func(F *frisby.Frisby, json *simplejson.Json, err error) { - noteID, err := json.Get("Payload").String() - if err != nil { - F.AddError(err.Error()) - return - } - id = noteID - }) - - updatedNote := strings.Replace(testNote, "is a", "is an updated", -1) - frisby.Create("Test invalid editing attempt: tos only"). - Post(service+"/"). - SetData("id", id). - SetData("tos", "on"). - Send(). - ExpectStatus(400). - ExpectJson("Success", false). - ExpectJson("Payload", "Bad request: password is empty") - - frisby.Create("Test invalid editing attempt: tos and wrong password"). - Post(service+"/"). - SetData("id", id). - SetData("tos", "on"). - SetData("text", updatedNote). - SetData("password", "aazzss"). - Send(). - ExpectStatus(401). - ExpectJson("Success", false). - ExpectJson("Payload", "Unauthorized: password is wrong") - - frisby.Create("Test editing: valid inputs, no tos"). - Post(service+"/"). - SetData("id", id). - SetData("text", updatedNote). - SetData("password", "aa11qq"). - Send(). - ExpectStatus(412). - ExpectJson("Success", false). - ExpectJson("Payload", "Precondition failed") - - frisby.Create("Test editing: valid inputs"). - Post(service+"/"). - SetData("id", id). - SetData("tos", "on"). - SetData("text", updatedNote). - SetData("password", "aa11qq"). - Send(). - ExpectStatus(200). - ExpectJson("Success", true) - - frisby.Create("Test retrieval of updated note"). - Get(service + "/" + id). - Send(). - ExpectStatus(200). - ExpectContent(strings.Replace(testNoteHTML, "is a", "is an updated", -1)) - - frisby.Create("Test export of new note"). - Get(service+"/"+id+"/export"). - Send(). - ExpectStatus(200). - ExpectHeader("Content-type", "text/plain; charset=UTF-8"). - ExpectContent(updatedNote) - - frisby.Create("Test deletion: valid inputs"). - Post(service+"/"). - SetData("id", id). - SetData("tos", "on"). - SetData("text", ""). - SetData("password", "aa11qq"). - Send(). - ExpectStatus(200). - ExpectJson("Success", true) - - frisby.Create("Test retrieval of deleted note"). - Get(service + "/" + id). - Send(). - ExpectStatus(404) - - fraudNote := "http://n.co https://a.co ftp://b.co" - - frisby.Create("Test publishing fraudulent note"). - Post(service+"/"). - SetData("tos", "on"). - SetData("password", "aa22qq"). - SetData("text", fraudNote). - Send(). - ExpectStatus(201). - ExpectJson("Success", true). - AfterJson(func(F *frisby.Frisby, json *simplejson.Json, err error) { - noteID, err := json.Get("Payload").String() - if err != nil { - F.AddError(err.Error()) - return - } - id = noteID - }) - - frisby.Create("Test new fraudulent note"). - Get(service+"/"+id). - Send(). - ExpectStatus(200). - ExpectHeader("Content-type", "text/html; charset=UTF-8"). - ExpectContent(`http://n.co https://a.co ftp://b.co`) - - frisby.Create("Test export of fraudulent note"). - Get(service+"/"+id+"/export"). - Send(). - ExpectStatus(200). - ExpectHeader("Content-type", "text/plain; charset=UTF-8"). - ExpectContent(fraudNote) - - // access fraudulent note more than 100 times - f := frisby.Create("Test export of fraudulent note again") - for i := 0; i < 100; i++ { - f.Get(service + "/" + id).Send() - } - - frisby.Create("Test stats of fradulent note"). - Get(service + "/" + id + "/stats"). - Send(). - ExpectStatus(200). - ExpectContent("Views: 102"). - ExpectContent("Published") - - frisby.Create("Test export of fraudulent note"). - Get(service+"/"+id+"/export"). - Send(). - ExpectStatus(403). - ExpectHeader("Content-type", "text/plain; charset=UTF-8"). - ExpectContent("Forbidden") - - frisby.Create("Test deletion of fraudulent note: wrong password inputs"). - Post(service+"/"). - SetData("id", id). - SetData("tos", "on"). - SetData("text", ""). - SetData("password", "aa11qq"). - Send(). - ExpectStatus(401). - ExpectJson("Success", false) - - frisby.Create("Test deletion of fraudulent note: correct password inputs"). - Post(service+"/"). - SetData("id", id). - SetData("tos", "on"). - SetData("text", ""). - SetData("password", "aa22qq"). - Send(). - ExpectStatus(200). - ExpectJson("Success", true) - - frisby.Create("Test publishing malicious note"). - Post(service+"/"). - SetData("tos", "on"). - SetData("password", "qwerty"). - SetData("text", "Foo Bar "). - Send(). - ExpectStatus(201). - ExpectJson("Success", true). - AfterJson(func(F *frisby.Frisby, json *simplejson.Json, err error) { - noteID, err := json.Get("Payload").String() - if err != nil { - F.AddError(err.Error()) - return - } - id = noteID - }) - - frisby.Create("Test export of fraudulent note"). - Get(service + "/" + id). - Send(). - ExpectStatus(200). - ExpectContent("Foo Bar") - - frisby.Create("Test deletion of malicious note"). - Post(service+"/"). - SetData("id", id). - SetData("tos", "on"). - SetData("text", ""). - SetData("password", "qwerty"). - Send(). - ExpectStatus(200). - ExpectJson("Success", true) - - frisby.Global.PrintReport() -}