From b22dd7b50d8c0a1b509d2aa5635cfeb130e0cc38 Mon Sep 17 00:00:00 2001 From: benweet Date: Sun, 20 Oct 2013 00:00:39 +0100 Subject: [PATCH] v2.2.1 pre-release --- public/cache.manifest | 2 +- public/res-min/main.js | 109 ++++++++++++++++++---------- public/res-min/themes/blue-gray.css | 1 + public/res-min/themes/default.css | 1 + public/res-min/themes/night.css | 1 + public/res-min/themes/school.css | 1 + 6 files changed, 76 insertions(+), 39 deletions(-) diff --git a/public/cache.manifest b/public/cache.manifest index 9d493de0..b44a7f5b 100644 --- a/public/cache.manifest +++ b/public/cache.manifest @@ -1,5 +1,5 @@ CACHE MANIFEST -#Date Wed Oct 16 2013 00:12:57 +#Date Sun Oct 20 2013 00:00:12 CACHE: res/worker.js diff --git a/public/res-min/main.js b/public/res-min/main.js index b9509f18..1407cbc4 100644 --- a/public/res-min/main.js +++ b/public/res-min/main.js @@ -8365,7 +8365,7 @@ function runDelayedFunction() { }); }; }.call(r.prototype), t.CommandManager = r; -}), define("ace/commands/default_commands", [ "require", "exports", "module", "ace/lib/lang", "ace/config" ], function(e, t) { +}), define("ace/commands/default_commands", [ "require", "exports", "module", "ace/lib/lang", "ace/config", "ace/range" ], function(e, t) { function n(e, t) { return { win: e, @@ -8373,7 +8373,9 @@ function runDelayedFunction() { }; } var i = e("ace/lib/lang"); - e("ace/config"), t.commands = [ { + e("ace/config"); + var o = e("ace/range").Range; + t.commands = [ { name: "overwrite", bindKey: "Insert", exec: function(e) { @@ -8684,7 +8686,8 @@ function runDelayedFunction() { name: "indent", bindKey: n("Tab", "Tab"), exec: function(e) { - e.indent(); + var t = e.getSelectionRange(), n = new o(t.end.row, 0, t.end.row, t.end.column), i = e.session.getTextRange(n), r = e.session.getTokenAt(t.end.row, t.end.column); + "markup.list" == r.type && /^\s*(?:[-+*]|\d+\.)\s+$/.test(i) ? e.blockIndent() : e.indent(); }, multiSelectAction: "forEach" }, { @@ -20739,7 +20742,7 @@ if (hljs.LANGUAGES.glsl = function(e) { a = e, h(); }, r.onPublishRemoved = h, r.onNewPublishSuccess = h, r; }), define("text!html/buttonShare.html", [], function() { - return '\n\n'; + return '\n\n'; }), define("text!html/buttonShareLocation.html", [], function() { return '
\n \n
\n'; }), define("extensions/buttonShare", [ "jquery", "underscore", "classes/Extension", "text!html/buttonShare.html", "text!html/buttonShareLocation.html" ], function(e, t, n, i, o) { @@ -20848,7 +20851,7 @@ if (hljs.LANGUAGES.glsl = function(e) { }); }, s; }), define("text!html/buttonViewer.html", [], function() { - return '\n \n\n'; + return '\n \n\n'; }), define("extensions/buttonViewer", [ "jquery", "classes/Extension", "text!html/buttonViewer.html" ], function(e, t, n) { var i = new t("buttonViewer", 'Button "Viewer"', !0, !0); return i.settingsBlock = '

Adds a "Viewer" button over the preview.

', i.onCreatePreviewButton = function() { @@ -21756,10 +21759,11 @@ if (hljs.LANGUAGES.glsl = function(e) { }, n; }(), t.Tour = n; })(jQuery, window); -}.call(this), define("bootstrap-tour", function() {}), define("extensions/welcomeTour", [ "jquery", "classes/Extension", "bootstrap-tour" ], function(e, t) { - var n = new t("welcomeTour", "Welcome tour", !1, !0); - return n.onReady = function() { - var t = new Tour({ +}.call(this), define("bootstrap-tour", function() {}), define("extensions/welcomeTour", [ "underscore", "jquery", "classes/Extension", "bootstrap-tour" ], function(e, t, n) { + var i = new n("welcomeTour", "Welcome tour", !1, !0); + return i.onReady = function() { + var n = new Tour({ + keyboard: !1, storage: { getItem: function() {}, setItem: function() {}, @@ -21768,47 +21772,47 @@ if (hljs.LANGUAGES.glsl = function(e) { onEnd: function() { localStorage.welcomeTour = "done"; }, - template: [ "
", "
", "

", "
", " ", "
" ].join("") + template: [ '
', '
', '

', '
', ' ", "
" ].join("") }); - t.addSteps([ { + n.addSteps([ { element: ".navbar-inner", title: "Welcome to StackEdit!", - content: "Please click Next to take a quick tour.", + content: [ '', '

You are using the new secured platform. If you want to recover your documents from the old platform, click here.

', "Please click Next to take a quick tour." ].join(""), placement: "bottom" }, { element: ".navbar .action-create-file", title: "New document", - content: "Click the New document button to create a new document.", + content: 'Click the New document button to create a new document.', placement: "left", reflex: !0 }, { element: ".document-panel .collapse-button", title: "Toggle document", - content: [ "

Click the Select document button to switch to another document.

", "NOTE: Use Ctrl+[ and Ctrl+] shortcuts to toggle quickly." ].join(""), + content: [ '

Click the Select document button to switch to another document.

', "NOTE: Use Ctrl+[ and Ctrl+] shortcuts to toggle quickly." ].join(""), placement: "left", reflex: !0 }, { element: ".menu-panel .collapse-button", title: "Menu", - content: [ "

Use the menu to synchronize your document on Google Drive or Dropbox.

", "Use also this menu to publish your document on GitHub, Blogger..." ].join(""), + content: [ '

Use the menu to synchronize your document on Google Drive or Dropbox.

', 'Use also this menu to publish your document on GitHub, Blogger...' ].join(""), placement: "right", reflex: !0 }, { element: "#extension-buttons .button-synchronize", title: "Synchronize", - content: "

Once imported/exported, use the Synchronize button to force the synchronization (this is done automatically every 3 minutes).

", + content: '

Once imported/exported, use the Synchronize button to force the synchronization (this is done automatically every 3 minutes).

', placement: "bottom", reflex: !0 }, { element: "#extension-buttons .button-publish", title: "Update publications", - content: "Once published, use the Publish button to update your publication.", + content: 'Once published, use the Publish button to update your publication.', placement: "bottom", reflex: !0 - } ]), _.has(localStorage, "welcomeTour") || t.start(), e(".action-welcome-tour").click(function() { - t.restart(); + } ]), e.has(localStorage, "welcomeTour") || n.start(), t(".action-welcome-tour").click(function() { + n.restart(); }); - }, n; + }, i; }), define("text!bower-libs/Typo.js/typo/typo.js", [], function() { return '\'use strict\';\n\n/**\n * Typo is a JavaScript implementation of a spellchecker using hunspell-style \n * dictionaries.\n */\n\n/**\n * Typo constructor.\n *\n * @param {String} [dictionary] The locale code of the dictionary being used. e.g.,\n * "en_US". This is only used to auto-load dictionaries.\n * @param {String} [affData] The data from the dictionary\'s .aff file. If omitted\n * and the first argument is supplied, in "chrome" platform,\n * the .aff file will be loaded automatically from\n * lib/typo/dictionaries/[dictionary]/[dictionary].aff\n * In other platform, it will be loaded from\n * [setting.path]/dictionaries/[dictionary]/[dictionary].aff\n * @param {String} [wordsData] The data from the dictionary\'s .dic file. If omitted,\n * and the first argument is supplied, in "chrome" platform,\n * the .dic file will be loaded automatically from\n * lib/typo/dictionaries/[dictionary]/[dictionary].dic\n * In other platform, it will be loaded from\n * [setting.path]/dictionaries/[dictionary]/[dictionary].dic\n * @param {Object} [settings] Constructor settings. Available properties are:\n * {String} [platform]: "chrome" for Chrome Extension or other\n * value for the usual web.\n * {String} [path]: path to load dictionary from in non-chrome\n * environment.\n * {Object} [flags]: flag information.\n *\n *\n * @returns {Typo} A Typo object.\n */\n\nvar Typo = function (dictionary, affData, wordsData, settings) {\n settings = settings || {};\n \n /** Determines the method used for auto-loading .aff and .dic files. **/\n this.platform = settings.platform || "chrome"; \n \n this.dictionary = null;\n \n this.rules = {};\n this.dictionaryTable = {};\n \n this.compoundRules = [];\n this.compoundRuleCodes = {};\n \n this.replacementTable = [];\n \n this.flags = settings.flags || {}; \n \n if (dictionary) {\n this.dictionary = dictionary;\n \n if (this.platform == "chrome") {\n if (!affData) affData = this._readFile(chrome.extension.getURL("lib/typo/dictionaries/" + dictionary + "/" + dictionary + ".aff"));\n if (!wordsData) wordsData = this._readFile(chrome.extension.getURL("lib/typo/dictionaries/" + dictionary + "/" + dictionary + ".dic"));\n } else {\n var path = settings.dictionaryPath || \'\';\n \n if (!affData) affData = this._readFile(path + "/" + dictionary + "/" + dictionary + ".aff");\n if (!wordsData) wordsData = this._readFile(path + "/" + dictionary + "/" + dictionary + ".dic");\n }\n \n this.rules = this._parseAFF(affData);\n \n // Save the rule codes that are used in compound rules.\n this.compoundRuleCodes = {};\n \n for (var i = 0, _len = this.compoundRules.length; i < _len; i++) {\n var rule = this.compoundRules[i];\n \n for (var j = 0, _jlen = rule.length; j < _jlen; j++) {\n this.compoundRuleCodes[rule[j]] = [];\n }\n }\n \n // If we add this ONLYINCOMPOUND flag to this.compoundRuleCodes, then _parseDIC\n // will do the work of saving the list of words that are compound-only.\n if ("ONLYINCOMPOUND" in this.flags) {\n this.compoundRuleCodes[this.flags.ONLYINCOMPOUND] = [];\n }\n \n this.dictionaryTable = this._parseDIC(wordsData);\n \n // Get rid of any codes from the compound rule codes that are never used \n // (or that were special regex characters). Not especially necessary... \n for (var i in this.compoundRuleCodes) {\n if (this.compoundRuleCodes[i].length == 0) {\n delete this.compoundRuleCodes[i];\n }\n }\n \n // Build the full regular expressions for each compound rule.\n // I have a feeling (but no confirmation yet) that this method of \n // testing for compound words is probably slow.\n for (var i = 0, _len = this.compoundRules.length; i < _len; i++) {\n var ruleText = this.compoundRules[i];\n \n var expressionText = "";\n \n for (var j = 0, _jlen = ruleText.length; j < _jlen; j++) {\n var character = ruleText[j];\n \n if (character in this.compoundRuleCodes) {\n expressionText += "(" + this.compoundRuleCodes[character].join("|") + ")";\n }\n else {\n expressionText += character;\n }\n }\n \n this.compoundRules[i] = new RegExp(expressionText, "i");\n }\n }\n \n return this;\n};\n\nTypo.prototype = {\n /**\n * Loads a Typo instance from a hash of all of the Typo properties.\n *\n * @param object obj A hash of Typo properties, probably gotten from a JSON.parse(JSON.stringify(typo_instance)).\n */\n \n load : function (obj) {\n for (var i in obj) {\n this[i] = obj[i];\n }\n \n return this;\n },\n \n /**\n * Read the contents of a file.\n * \n * @param {String} path The path (relative) to the file.\n * @param {String} [charset="ISO8859-1"] The expected charset of the file\n * @returns string The file data.\n */\n \n _readFile : function (path, charset) {\n if (!charset) charset = "ISO8859-1";\n \n var req = new XMLHttpRequest();\n req.open("GET", path, false);\n \n if (req.overrideMimeType)\n req.overrideMimeType("text/plain; charset=" + charset);\n \n req.send(null);\n \n return req.responseText;\n },\n \n /**\n * Parse the rules out from a .aff file.\n *\n * @param {String} data The contents of the affix file.\n * @returns object The rules from the file.\n */\n \n _parseAFF : function (data) {\n var rules = {};\n \n // Remove comment lines\n data = this._removeAffixComments(data);\n \n var lines = data.split("\\n");\n \n for (var i = 0, _len = lines.length; i < _len; i++) {\n var line = lines[i];\n \n var definitionParts = line.split(/\\s+/);\n \n var ruleType = definitionParts[0];\n \n if (ruleType == "PFX" || ruleType == "SFX") {\n var ruleCode = definitionParts[1];\n var combineable = definitionParts[2];\n var numEntries = parseInt(definitionParts[3], 10);\n \n var entries = [];\n \n for (var j = i + 1, _jlen = i + 1 + numEntries; j < _jlen; j++) {\n var line = lines[j];\n \n var lineParts = line.split(/\\s+/);\n var charactersToRemove = lineParts[2];\n \n var additionParts = lineParts[3].split("/");\n \n var charactersToAdd = additionParts[0];\n if (charactersToAdd === "0") charactersToAdd = "";\n \n var continuationClasses = this.parseRuleCodes(additionParts[1]);\n \n var regexToMatch = lineParts[4];\n \n var entry = {};\n entry.add = charactersToAdd;\n \n if (continuationClasses.length > 0) entry.continuationClasses = continuationClasses;\n \n if (regexToMatch !== ".") {\n if (ruleType === "SFX") {\n entry.match = new RegExp(regexToMatch + "$");\n }\n else {\n entry.match = new RegExp("^" + regexToMatch);\n }\n }\n \n if (charactersToRemove != "0") {\n if (ruleType === "SFX") {\n entry.remove = new RegExp(charactersToRemove + "$");\n }\n else {\n entry.remove = charactersToRemove;\n }\n }\n \n entries.push(entry);\n }\n \n rules[ruleCode] = { "type" : ruleType, "combineable" : (combineable == "Y"), "entries" : entries };\n \n i += numEntries;\n }\n else if (ruleType === "COMPOUNDRULE") {\n var numEntries = parseInt(definitionParts[1], 10);\n \n for (var j = i + 1, _jlen = i + 1 + numEntries; j < _jlen; j++) {\n var line = lines[j];\n \n var lineParts = line.split(/\\s+/);\n this.compoundRules.push(lineParts[1]);\n }\n \n i += numEntries;\n }\n else if (ruleType === "REP") {\n var lineParts = line.split(/\\s+/);\n \n if (lineParts.length === 3) {\n this.replacementTable.push([ lineParts[1], lineParts[2] ]);\n }\n }\n else {\n // ONLYINCOMPOUND\n // COMPOUNDMIN\n // FLAG\n // KEEPCASE\n // NEEDAFFIX\n \n this.flags[ruleType] = definitionParts[1];\n }\n }\n \n return rules;\n },\n \n /**\n * Removes comment lines and then cleans up blank lines and trailing whitespace.\n *\n * @param {String} data The data from an affix file.\n * @return {String} The cleaned-up data.\n */\n \n _removeAffixComments : function (data) {\n // Remove comments\n data = data.replace(/#.*$/mg, "");\n \n // Trim each line\n data = data.replace(/^\\s\\s*/m, \'\').replace(/\\s\\s*$/m, \'\');\n \n // Remove blank lines.\n data = data.replace(/\\n{2,}/g, "\\n");\n \n // Trim the entire string\n data = data.replace(/^\\s\\s*/, \'\').replace(/\\s\\s*$/, \'\');\n \n return data;\n },\n \n /**\n * Parses the words out from the .dic file.\n *\n * @param {String} data The data from the dictionary file.\n * @returns object The lookup table containing all of the words and\n * word forms from the dictionary.\n */\n \n _parseDIC : function (data) {\n data = this._removeDicComments(data);\n \n var lines = data.split("\\n");\n var dictionaryTable = {};\n \n function addWord(word, rules) {\n // Some dictionaries will list the same word multiple times with different rule sets.\n if (!(word in dictionaryTable) || typeof dictionaryTable[word] != \'object\') {\n dictionaryTable[word] = [];\n }\n \n dictionaryTable[word].push(rules);\n }\n \n // The first line is the number of words in the dictionary.\n for (var i = 1, _len = lines.length; i < _len; i++) {\n var line = lines[i];\n \n var parts = line.split("/", 2);\n \n var word = parts[0];\n\n // Now for each affix rule, generate that form of the word.\n if (parts.length > 1) {\n var ruleCodesArray = this.parseRuleCodes(parts[1]);\n \n // Save the ruleCodes for compound word situations.\n if (!("NEEDAFFIX" in this.flags) || ruleCodesArray.indexOf(this.flags.NEEDAFFIX) == -1) {\n addWord(word, ruleCodesArray);\n }\n \n for (var j = 0, _jlen = ruleCodesArray.length; j < _jlen; j++) {\n var code = ruleCodesArray[j];\n \n var rule = this.rules[code];\n \n if (rule) {\n var newWords = this._applyRule(word, rule);\n \n for (var ii = 0, _iilen = newWords.length; ii < _iilen; ii++) {\n var newWord = newWords[ii];\n \n addWord(newWord, []);\n \n if (rule.combineable) {\n for (var k = j + 1; k < _jlen; k++) {\n var combineCode = ruleCodesArray[k];\n \n var combineRule = this.rules[combineCode];\n \n if (combineRule) {\n if (combineRule.combineable && (rule.type != combineRule.type)) {\n var otherNewWords = this._applyRule(newWord, combineRule);\n \n for (var iii = 0, _iiilen = otherNewWords.length; iii < _iiilen; iii++) {\n var otherNewWord = otherNewWords[iii];\n addWord(otherNewWord, []);\n }\n }\n }\n }\n }\n }\n }\n \n if (code in this.compoundRuleCodes) {\n this.compoundRuleCodes[code].push(word);\n }\n }\n }\n else {\n addWord(word, []);\n }\n }\n \n return dictionaryTable;\n },\n \n \n /**\n * Removes comment lines and then cleans up blank lines and trailing whitespace.\n *\n * @param {String} data The data from a .dic file.\n * @return {String} The cleaned-up data.\n */\n \n _removeDicComments : function (data) {\n // I can\'t find any official documentation on it, but at least the de_DE\n // dictionary uses tab-indented lines as comments.\n \n // Remove comments\n data = data.replace(/^\\t.*$/mg, "");\n \n return data;\n \n // Trim each line\n data = data.replace(/^\\s\\s*/m, \'\').replace(/\\s\\s*$/m, \'\');\n \n // Remove blank lines.\n data = data.replace(/\\n{2,}/g, "\\n");\n \n // Trim the entire string\n data = data.replace(/^\\s\\s*/, \'\').replace(/\\s\\s*$/, \'\');\n \n return data;\n },\n \n parseRuleCodes : function (textCodes) {\n if (!textCodes) {\n return [];\n }\n else if (!("FLAG" in this.flags)) {\n return textCodes.split("");\n }\n else if (this.flags.FLAG === "long") {\n var flags = [];\n \n for (var i = 0, _len = textCodes.length; i < _len; i += 2) {\n flags.push(textCodes.substr(i, 2));\n }\n \n return flags;\n }\n else if (this.flags.FLAG === "num") {\n return textCode.split(",");\n }\n },\n \n /**\n * Applies an affix rule to a word.\n *\n * @param {String} word The base word.\n * @param {Object} rule The affix rule.\n * @returns {String[]} The new words generated by the rule.\n */\n \n _applyRule : function (word, rule) {\n var entries = rule.entries;\n var newWords = [];\n \n for (var i = 0, _len = entries.length; i < _len; i++) {\n var entry = entries[i];\n \n if (!entry.match || word.match(entry.match)) {\n var newWord = word;\n \n if (entry.remove) {\n newWord = newWord.replace(entry.remove, "");\n }\n \n if (rule.type === "SFX") {\n newWord = newWord + entry.add;\n }\n else {\n newWord = entry.add + newWord;\n }\n \n newWords.push(newWord);\n \n if ("continuationClasses" in entry) {\n for (var j = 0, _jlen = entry.continuationClasses.length; j < _jlen; j++) {\n var continuationRule = this.rules[entry.continuationClasses[j]];\n \n if (continuationRule) {\n newWords = newWords.concat(this._applyRule(newWord, continuationRule));\n }\n /*\n else {\n // This shouldn\'t happen, but it does, at least in the de_DE dictionary.\n // I think the author mistakenly supplied lower-case rule codes instead \n // of upper-case.\n }\n */\n }\n }\n }\n }\n \n return newWords;\n },\n \n /**\n * Checks whether a word or a capitalization variant exists in the current dictionary.\n * The word is trimmed and several variations of capitalizations are checked.\n * If you want to check a word without any changes made to it, call checkExact()\n *\n * @see http://blog.stevenlevithan.com/archives/faster-trim-javascript re:trimming function\n *\n * @param {String} aWord The word to check.\n * @returns {Boolean}\n */\n \n check : function (aWord) {\n // Remove leading and trailing whitespace\n var trimmedWord = aWord.replace(/^\\s\\s*/, \'\').replace(/\\s\\s*$/, \'\');\n \n if (this.checkExact(trimmedWord)) {\n return true;\n }\n \n // The exact word is not in the dictionary.\n if (trimmedWord.toUpperCase() === trimmedWord) {\n // The word was supplied in all uppercase.\n // Check for a capitalized form of the word.\n var capitalizedWord = trimmedWord[0] + trimmedWord.substring(1).toLowerCase();\n \n if (this.hasFlag(capitalizedWord, "KEEPCASE")) {\n // Capitalization variants are not allowed for this word.\n return false;\n }\n \n if (this.checkExact(capitalizedWord)) {\n return true;\n }\n }\n \n var lowercaseWord = trimmedWord.toLowerCase();\n \n if (lowercaseWord !== trimmedWord) {\n if (this.hasFlag(lowercaseWord, "KEEPCASE")) {\n // Capitalization variants are not allowed for this word.\n return false;\n }\n \n // Check for a lowercase form\n if (this.checkExact(lowercaseWord)) {\n return true;\n }\n }\n \n return false;\n },\n \n /**\n * Checks whether a word exists in the current dictionary.\n *\n * @param {String} word The word to check.\n * @returns {Boolean}\n */\n \n checkExact : function (word) {\n var ruleCodes = this.dictionaryTable[word];\n \n if (typeof ruleCodes === \'undefined\') {\n // Check if this might be a compound word.\n if ("COMPOUNDMIN" in this.flags && word.length >= this.flags.COMPOUNDMIN) {\n for (var i = 0, _len = this.compoundRules.length; i < _len; i++) {\n if (word.match(this.compoundRules[i])) {\n return true;\n }\n }\n }\n \n return false;\n }\n else {\n for (var i = 0, _len = ruleCodes.length; i < _len; i++) {\n if (!this.hasFlag(word, "ONLYINCOMPOUND", ruleCodes[i])) {\n return true;\n }\n }\n \n return false;\n }\n },\n \n /**\n * Looks up whether a given word is flagged with a given flag.\n *\n * @param {String} word The word in question.\n * @param {String} flag The flag in question.\n * @return {Boolean}\n */\n \n hasFlag : function (word, flag, wordFlags) {\n if (flag in this.flags) {\n if (typeof wordFlags === \'undefined\') {\n var wordFlags = Array.prototype.concat.apply([], this.dictionaryTable[word]);\n }\n \n if (wordFlags && wordFlags.indexOf(this.flags[flag]) !== -1) {\n return true;\n }\n }\n \n return false;\n },\n \n /**\n * Returns a list of suggestions for a misspelled word.\n *\n * @see http://www.norvig.com/spell-correct.html for the basis of this suggestor.\n * This suggestor is primitive, but it works.\n *\n * @param {String} word The misspelling.\n * @param {Number} [limit=5] The maximum number of suggestions to return.\n * @returns {String[]} The array of suggestions.\n */\n \n alphabet : "",\n \n suggest : function (word, limit) {\n if (!limit) limit = 5;\n \n if (this.check(word)) return [];\n \n // Check the replacement table.\n for (var i = 0, _len = this.replacementTable.length; i < _len; i++) {\n var replacementEntry = this.replacementTable[i];\n \n if (word.indexOf(replacementEntry[0]) !== -1) {\n var correctedWord = word.replace(replacementEntry[0], replacementEntry[1]);\n \n if (this.check(correctedWord)) {\n return [ correctedWord ];\n }\n }\n }\n \n var self = this;\n self.alphabet = "abcdefghijklmnopqrstuvwxyz";\n \n /*\n if (!self.alphabet) {\n // Use the alphabet as implicitly defined by the words in the dictionary.\n var alphaHash = {};\n \n for (var i in self.dictionaryTable) {\n for (var j = 0, _len = i.length; j < _len; j++) {\n alphaHash[i[j]] = true;\n }\n }\n \n for (var i in alphaHash) {\n self.alphabet += i;\n }\n \n var alphaArray = self.alphabet.split("");\n alphaArray.sort();\n self.alphabet = alphaArray.join("");\n }\n */\n \n function edits1(words) {\n var rv = [];\n \n for (var ii = 0, _iilen = words.length; ii < _iilen; ii++) {\n var word = words[ii];\n \n var splits = [];\n \n for (var i = 0, _len = word.length + 1; i < _len; i++) {\n splits.push([ word.substring(0, i), word.substring(i, word.length) ]);\n }\n \n var deletes = [];\n \n for (var i = 0, _len = splits.length; i < _len; i++) {\n var s = splits[i];\n \n if (s[1]) {\n deletes.push(s[0] + s[1].substring(1));\n }\n }\n \n var transposes = [];\n \n for (var i = 0, _len = splits.length; i < _len; i++) {\n var s = splits[i];\n \n if (s[1].length > 1) {\n transposes.push(s[0] + s[1][1] + s[1][0] + s[1].substring(2));\n }\n }\n \n var replaces = [];\n \n for (var i = 0, _len = splits.length; i < _len; i++) {\n var s = splits[i];\n \n if (s[1]) {\n for (var j = 0, _jlen = self.alphabet.length; j < _jlen; j++) {\n replaces.push(s[0] + self.alphabet[j] + s[1].substring(1));\n }\n }\n }\n \n var inserts = [];\n \n for (var i = 0, _len = splits.length; i < _len; i++) {\n var s = splits[i];\n \n if (s[1]) {\n for (var j = 0, _jlen = self.alphabet.length; j < _jlen; j++) {\n replaces.push(s[0] + self.alphabet[j] + s[1]);\n }\n }\n }\n \n rv = rv.concat(deletes);\n rv = rv.concat(transposes);\n rv = rv.concat(replaces);\n rv = rv.concat(inserts);\n }\n \n return rv;\n }\n \n function known(words) {\n var rv = [];\n \n for (var i = 0; i < words.length; i++) {\n if (self.check(words[i])) {\n rv.push(words[i]);\n }\n }\n \n return rv;\n }\n \n function correct(word) {\n // Get the edit-distance-1 and edit-distance-2 forms of this word.\n var ed1 = edits1([word]);\n var ed2 = edits1(ed1);\n \n var corrections = known(ed1).concat(known(ed2));\n \n // Sort the edits based on how many different ways they were created.\n var weighted_corrections = {};\n \n for (var i = 0, _len = corrections.length; i < _len; i++) {\n if (!(corrections[i] in weighted_corrections)) {\n weighted_corrections[corrections[i]] = 1;\n }\n else {\n weighted_corrections[corrections[i]] += 1;\n }\n }\n \n var sorted_corrections = [];\n \n for (var i in weighted_corrections) {\n sorted_corrections.push([ i, weighted_corrections[i] ]);\n }\n \n function sorter(a, b) {\n if (a[1] < b[1]) {\n return -1;\n }\n \n return 1;\n }\n \n sorted_corrections.sort(sorter).reverse();\n \n var rv = [];\n \n for (var i = 0, _len = Math.min(limit, sorted_corrections.length); i < _len; i++) {\n if (!self.hasFlag(sorted_corrections[i][0], "NOSUGGEST")) {\n rv.push(sorted_corrections[i][0]);\n }\n }\n \n return rv;\n }\n \n return correct(word);\n }\n};\n'; }), define("text!bower-libs/lz-string/libs/lz-string-1.3.3.js", [], function() { @@ -22366,7 +22370,7 @@ if (hljs.LANGUAGES.glsl = function(e) { }); }, r; }), define("text!html/bodyIndex.html", [], function() { - return '\n
\n
\n
\n
\n\n\n\n\n
\n \n \n
\n
\n
\n
\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
\n
'; + return '\n
\n
\n
\n
\n\n\n\n\n
\n \n \n
\n
\n
\n
\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
\n
'; }), define("text!html/bodyViewer.html", [], function() { return '\n\n
\n
\n
\n\n\n\n
\n \n \n
\n
\n
\n
\n
\n\n\n'; }), define("text!html/settingsTemplateTooltip.html", [], function() { @@ -25880,22 +25884,38 @@ if (hljs.LANGUAGES.glsl = function(e) { } }; }.call(r.prototype); -}), define("libs/ace_mode", [ "require", "exports", "module", "ace/lib/oop", "ace/mode/text", "ace/tokenizer", "./ace_mode_highlight_rules", "ace/mode/folding/markdown" ], function(e, t) { - var n = e("ace/lib/oop"), i = e("ace/mode/text").Mode, o = e("ace/tokenizer").Tokenizer, r = e("./ace_mode_highlight_rules").MarkdownHighlightRules, s = e("ace/mode/folding/markdown").FoldMode, a = function() { +}), define("libs/ace_mode", [ "require", "exports", "module", "ace/lib/oop", "ace/mode/text", "ace/tokenizer", "./ace_mode_highlight_rules", "ace/mode/folding/markdown", "eventMgr", "ace/range" ], function(e, t) { + var n = e("ace/lib/oop"), i = e("ace/mode/text").Mode, o = e("ace/tokenizer").Tokenizer, r = e("./ace_mode_highlight_rules").MarkdownHighlightRules; + e("ace/mode/folding/markdown").FoldMode; + var s = e("eventMgr"), a = e("ace/range").Range, l = void 0; + s.addListener("onAceCreated", function(e) { + l = e; + }); + var c = function() { var e = new r(); - this.$tokenizer = new o(e.getRules()), this.$embeds = e.getEmbeds(), this.foldingRules = new s(); + this.$tokenizer = new o(e.getRules()), this.$embeds = e.getEmbeds(); }; - n.inherits(a, i), function() { + n.inherits(c, i); + var u = !1; + (function() { this.type = "text", this.lineCommentStart = ">", this.getNextLineIndent = function(e, t) { - if ("listblock" == e) { - var n = /^(\s*)(?:([-+*])|(\d+)\.)(\s+)/.exec(t); - if (!n) return ""; - var i = n[2]; - return i || (i = parseInt(n[3], 10) + 1 + "."), n[1] + i + n[4]; + if (u === !0 && ("listblock" == e || "listblock-start" == e) && /^\s*(?:[-+*]|\d+\.)\s+$/.test(t)) { + var n = l.$getSelectedRows(); + if (n.last > 2) { + var i = new a(n.last - 2, l.session.getLine(n.last - 2).length, n.last - 1, l.session.getLine(n.last - 1).length); + l.session.remove(i); + } + return u = !1, this.$getIndent(t); + } + if (u = !1, "listblock" == e) { + var o = /^(\s*)(?:([-+*])|(\d+)\.)(\s+)/.exec(t); + if (!o) return ""; + var r = o[2]; + return r || (r = parseInt(o[3], 10) + 1 + "."), u = !0, o[1] + r + o[4]; } return this.$getIndent(t); }; - }.call(a.prototype), t.Mode = a; + }).call(c.prototype), t.Mode = c; }), define("ace/ext/spellcheck", [ "require", "exports", "module", "../lib/event", "../editor", "../config" ], function(e, t) { var n = e("../lib/event"); t.contextMenuHandler = function(e) { @@ -26404,8 +26424,9 @@ if (hljs.LANGUAGES.glsl = function(e) { n.onload = function(t) { return function(n) { try { - if (c = JSON.parse(n.target.result), /^v/.test(c.version) === !1) throw 1; - e(".modal-import-docs-settings").modal("show"); + c = JSON.parse(n.target.result); + var i = parseInt(c.version.match(/^v(\d+)$/)[1], 10), o = parseInt(localStorage.version.match(/^v(\d+)$/)[1], 10); + i > o ? s.onError("Incompatible version. Please upgrade StackEdit.") : e(".modal-import-docs-settings").modal("show"); } catch (n) { s.onError("Wrong format: " + t.name); } @@ -26437,7 +26458,7 @@ if (hljs.LANGUAGES.glsl = function(e) { container: ".modal-settings", placement: "right", trigger: "hover", - title: "Thanks for supporting StackEdit by adding a backlink in your documents!" + title: [ "Thanks for supporting StackEdit by adding a backlink in your documents!

", 'NOTE: Backlinks in Stack Exchange Q/A are not welcome.' ].join("") }); var u = !1; if (e(".tooltip-usercustom-extension").tooltip({ @@ -26485,9 +26506,9 @@ if (hljs.LANGUAGES.glsl = function(e) { document.getElementById("input-settings-theme").innerHTML = p; } }), E; -}), define("text!../WELCOME.md", [], function() { +}), define("text!WELCOME.md", [], function() { return '\nWelcome to StackEdit! {#welcome}\n=====================\n\n\nHello, I am your first Markdown document within **StackEdit**[^stackedit]. Don\'t delete me, I can be helpful. I can be recovered anyway in the `Utils` tab of the `Settings` dialog.\n\n----------\n\n\nDocuments\n---------\n\n**StackEdit** stores your documents in your browser local storage, which means all your documents are automatically saved locally and are accessible offline.\n\n> **NOTE:** This also means that your documents are not shared between different browsers or computers and that clearing your browser\'s data may **delete all of them!**\n\n#### Create a document\n\nYou can create a new document by clicking the button in the navigation bar. This will switch from the current document to the new one.\n\n#### Switch to another document\n\nYou can list all your local documents and switch from one to another by clicking the button in the navigation bar.\n\n#### Rename a document\n\nYou can rename the current document by clicking the document title in the navigation bar.\n\n#### Delete a document\n\nYou can delete the current document by clicking the button in the navigation bar.\n\n#### Save a document\n\nYou can save the current document to a file using the `Save as...` sub-menu.\n\n> **NOTE:** See [ Publish a document](#publish-a-document) section for a description of the different outputs.\n\n\n----------\n\n\nSynchronization\n---------------\n\n**StackEdit** can be combined with **Google Drive** and **Dropbox** to have your documents centralized in the *Cloud*. The synchronization mechanism will take care of uploading your modifications or downloading the latest version of your documents.\n\n> **NOTE:** Full access to **Google Drive** or **Dropbox** is required to be able to import any document in StackEdit. Imported documents are downloaded in your browser and are not transmitted to a server.\n\n#### Import a document\n\nYou can import a document from the *Cloud* by going to the `Google Drive` or the `Dropbox` sub-menu and by clicking `Import from...`. Once imported, your document will be automatically synchronized with the **Google Drive** / **Dropbox** file.\n\n#### Export a document\n\nYou can export any document by going to the `Google Drive` or the `Dropbox` sub-menu and by clicking `Export to...`. Even if your document is already synchronized with **Google Drive** or **Dropbox**, you can export it to a another location. **StackEdit** can synchronize one document with multiple locations.\n\n#### Synchronize a document\n\nOnce your document is linked to a **Google Drive** or a **Dropbox** file, **StackEdit** will periodically (every 3 minutes) synchronize it by downloading/uploading any modification. Any conflict will be detected, and a local copy of your document will be created as a backup if necessary.\n\nIf you just have modified your document and you want to force the synchronization, click the button in the navigation bar.\n\n> **NOTE:** The button is disabled when:\n> \n> - you are offline,\n> - or the document is not synchronized with any location,\n> - or the document has not been modified since the last synchronization.\n\n#### Manage document synchronization\n\nSince one document can be synchronized with multiple locations, you can list and manage synchronized locations by clicking `Manage synchronization` in the menu. This will open a dialog box allowing you to add or remove synchronization links that are associated to your document.\n\n> **NOTE:** If you delete the file from **Google Drive** or from **Dropbox**, the document will no longer be synchronized with that location.\n\n----------\n\n\nPublication\n-----------\n\nOnce you are happy with your document, you can publish it on different websites directly from **StackEdit**. As for now, **StackEdit** can publish on **Blogger**, **Dropbox**, **Gist**, **GitHub**, **Google Drive**, **Tumblr**, **WordPress** and on any SSH server.\n\n#### Publish a document\n\nYou can publish your document by going to the `Publish on` sub-menu and by choosing a website. In the dialog box, you can choose the publication format:\n\n- Markdown, to publish the Markdown text on a website that can interpret it (**GitHub** for instance),\n- HTML, to publish the document converted into HTML (on a blog for instance),\n- Template, to have a full control of the output.\n\n> **NOTE:** The default template is a simple webpage wrapping your document in HTML format. You can customize it in the `Services` tab of the `Settings` dialog.\n\n#### Update a publication\n\nAfter publishing, **StackEdit** will keep your document linked to that publish location so that you can update it easily. Once you have modified your document and you want to update your publication, click on the button in the navigation bar.\n\n> **NOTE:** The button is disabled when:\n> \n> - you are offline,\n> - or the document has not been published anywhere.\n\n#### Manage document publication\n\nSince one document can be published on multiple locations, you can list and manage publish locations by clicking `Manage publication` in the menu. This will open a dialog box allowing you to remove publication links that are associated to your document.\n\n> **NOTE:** In some cases, if you remove the file from the website or the post from the blog, the document will no longer be published on that location.\n\n----------\n\n\nMarkdown Extra\n--------------\n\n**StackEdit** supports **Markdown Extra**, which extends **Markdown** syntax with some nice features.\n\n> **NOTE:** You can disable any **Markdown Extra** feature in the `Extensions` tab of the `Settings` dialog.\n\n\n### Tables\n\n**Markdown Extra** has a special syntax for tables:\n\nItem | Value\n--------- | -----\nComputer | \\$1600\nPhone | \\$12\nPipe | \\$1\n\nYou can specify column alignment with one or two colons:\n\n| Item | Value | Qty |\n| :-------- | ------:| :--: |\n| Computer | \\$1600 | 5 |\n| Phone | \\$12 | 12 |\n| Pipe | \\$1 | 234 |\n\n\n### Definition Lists\n\n**Markdown Extra** has a special syntax for definition lists too:\n\nTerm 1\nTerm 2\n: Definition A\n: Definition B\n\nTerm 3\n\n: Definition C\n\n: Definition D\n\n > part of definition D\n\n\n### Fenced code blocks\n\nGitHub\'s fenced code blocks are also supported with **Prettify** syntax highlighting:\n\n```\n// Foo\nvar bar = 0;\n```\n\n> **NOTE:** To use **Highlight.js** instead of **Prettify**, just configure the `Markdown Extra` extension in the `Settings` dialog.\n\n\n### Special Attributes\n\nWith **Markdown Extra**, you can specify `class` and `id` attributes on headers and fenced code blocks just like this:\n\n##### Header example {#my-header}\n\n``` {#my-id .my-class}\nvar foo = bar;\n```\n\nThen you can create cross-references like this: [beginning of the document](#welcome).\n\n\n### Footnotes\n\nYou can create footnotes like this[^footnote].\n\n [^footnote]: Here is the *text* of the **footnote**.\n\n\n### SmartyPants\n\nSmartyPants converts ASCII punctuation characters into "smart" typographic punctuation HTML entities. For example:\n\n| | ASCII | HTML |\n ------------------|------------------------------------------|-------------------------------------\n| Single backticks | `\'Isn\'t this fun?\'` | ‘Isn’t this fun?’ |\n| Quotes | `"Isn\'t this fun?"` | “Isn’t this fun?” |\n| Dashes | `-- is an en-dash and --- is an em-dash` | – is an en-dash and — is an em-dash |\n\n\n### Table of contents\n\nYou can insert a table of contents using the marker `[TOC]`:\n\n[TOC]\n\n\n### MathJax\n \nYou can render *LaTeX* mathematical expressions using **MathJax**, as on [math.stackexchange.com][1]:\n\nThe *Gamma function* satisfying $\\Gamma(n) = (n-1)!\\quad\\forall\nn\\in\\mathbb N$ is via through the Euler integral\n\n$$\n\\Gamma(z) = \\int_0^\\infty t^{z-1}e^{-t}dt\\,.\n$$\n\n> **NOTE:** When exporting, make sure you include MathJax to render mathematical expression correctly. Your page/template should include something like: \n\n```\n\n```\n\n> **NOTE:** You can find more information:\n>\n> - about **Markdown** syntax [here][2],\n> - about **Markdown Extra** extension [here][3],\n> - about **Prettify** syntax highlighting [here][4],\n> - about **Highlight.js** syntax highlighting [here][5].\n\nWritten with [StackEdit](https://stackedit.io/).\n\n [^stackedit]: StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.\n\n\n [1]: http://math.stackexchange.com/\n [2]: http://daringfireball.net/projects/markdown/syntax "Markdown"\n [3]: https://github.com/jmcmanus/pagedown-extra "Pagedown Extra"\n [4]: https://code.google.com/p/google-code-prettify/\n [5]: http://softwaremaniacs.org/soft/highlight/en/'; -}), define("fileMgr", [ "jquery", "underscore", "core", "utils", "settings", "eventMgr", "fileSystem", "classes/FileDescriptor", "text!../WELCOME.md" ], function(e, t, n, i, o, r, s, a, l) { +}), define("fileMgr", [ "jquery", "underscore", "core", "utils", "settings", "eventMgr", "fileSystem", "classes/FileDescriptor", "text!WELCOME.md" ], function(e, t, n, i, o, r, s, a, l) { var c = {}; c.currentFile = void 0, c.selectFile = function(i) { if (i = i || c.currentFile, void 0 === i) { @@ -27835,7 +27856,7 @@ if (hljs.LANGUAGES.glsl = function(e) { var u = new r(), d = void 0; u.onRun(function() { if (c === !0) return u.chain(), void 0; - var o = [ MAIN_URL, "viewer.html#!provider=", a.providerId ]; + var o = [ MAIN_URL, "viewer#!provider=", a.providerId ]; t.each(a.sharingAttributes, function(e) { o.push("&"), o.push(e), o.push("="), o.push(encodeURIComponent(n[e])); }), o = o.join(""), e.getJSON("https://api-ssl.bitly.com/v3/shorten", { @@ -28679,6 +28700,18 @@ if (hljs.LANGUAGES.glsl = function(e) { } }); +try { + var test = "seLocalStorageCheck"; + localStorage.setItem(test, test), localStorage.removeItem(test); + var obj = {}; + Object.defineProperty(obj, "prop", { + get: function() {}, + set: function() {} + }); +} catch (e) { + throw alert("Your browser is not supported, sorry!"), e; +} + var logger = { log: function() {}, info: function() {}, @@ -28689,7 +28722,7 @@ var logger = { /(\?|&)console($|&)/.test(location.search) && (logger = console); var viewerMode = /(^| )viewer($| )/.test(document.body.className), lightMode = viewerMode || /(\?|&)light($|&)/.test(location.search) || function(e) { - return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(e) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0, 4)) ? !0 : void 0; + return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|android|ipad|playbook|silk/i.test(e) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0, 4)) ? !0 : void 0; }(navigator.userAgent || navigator.vendor || window.opera), theme = localStorage.theme || "default", themeModule = "less!themes/" + theme; -1 !== baseDir.indexOf("-min") && (themeModule = "css!themes/" + theme), require([ "jquery", "core", "eventMgr", "synchronizer", "publisher", "mediaImporter", "css", themeModule ], function(e, t, n) { diff --git a/public/res-min/themes/blue-gray.css b/public/res-min/themes/blue-gray.css index 6a53cc2e..f820f66c 100644 --- a/public/res-min/themes/blue-gray.css +++ b/public/res-min/themes/blue-gray.css @@ -1669,6 +1669,7 @@ input[type="file"]{line-height:inherit;height:inherit;border:none !important} .modal-import-harddrive-html textarea{width:530px;max-width:530px;height:120px} .popover{max-width:350px;padding:15px;-webkit-box-shadow:0 5px 30px rgba(0,0,0,0.4);box-shadow:0 5px 30px rgba(0,0,0,0.4)} .popover .popover-title{font-weight:500;font-size:24px;padding:10px 15px} +.popover .icon-lock{font-size:38px;margin:5px} .popover .disabled{display:none} div.jGrowl{z-index:1040;font-size:inherit} div.jGrowl.bottom-right{right:30px} diff --git a/public/res-min/themes/default.css b/public/res-min/themes/default.css index c355bd2f..4d93f737 100644 --- a/public/res-min/themes/default.css +++ b/public/res-min/themes/default.css @@ -1669,6 +1669,7 @@ input[type="file"]{line-height:inherit;height:inherit;border:none !important} .modal-import-harddrive-html textarea{width:530px;max-width:530px;height:120px} .popover{max-width:350px;padding:15px;-webkit-box-shadow:0 5px 30px rgba(0,0,0,0.4);box-shadow:0 5px 30px rgba(0,0,0,0.4)} .popover .popover-title{font-weight:500;font-size:24px;padding:10px 15px} +.popover .icon-lock{font-size:38px;margin:5px} .popover .disabled{display:none} div.jGrowl{z-index:1040;font-size:inherit} div.jGrowl.bottom-right{right:30px} diff --git a/public/res-min/themes/night.css b/public/res-min/themes/night.css index 22cb0957..2d480cc7 100644 --- a/public/res-min/themes/night.css +++ b/public/res-min/themes/night.css @@ -1669,6 +1669,7 @@ input[type="file"]{line-height:inherit;height:inherit;border:none !important} .modal-import-harddrive-html textarea{width:530px;max-width:530px;height:120px} .popover{max-width:350px;padding:15px;-webkit-box-shadow:0 5px 30px rgba(0,0,0,0.4);box-shadow:0 5px 30px rgba(0,0,0,0.4)} .popover .popover-title{font-weight:500;font-size:24px;padding:10px 15px} +.popover .icon-lock{font-size:38px;margin:5px} .popover .disabled{display:none} div.jGrowl{z-index:1040;font-size:inherit} div.jGrowl.bottom-right{right:30px} diff --git a/public/res-min/themes/school.css b/public/res-min/themes/school.css index 0cae1f4e..157c5ae3 100644 --- a/public/res-min/themes/school.css +++ b/public/res-min/themes/school.css @@ -1669,6 +1669,7 @@ input[type="file"]{line-height:inherit;height:inherit;border:none !important} .modal-import-harddrive-html textarea{width:530px;max-width:530px;height:120px} .popover{max-width:350px;padding:15px;-webkit-box-shadow:0 5px 30px rgba(0,0,0,0.4);box-shadow:0 5px 30px rgba(0,0,0,0.4)} .popover .popover-title{font-weight:500;font-size:24px;padding:10px 15px} +.popover .icon-lock{font-size:38px;margin:5px} .popover .disabled{display:none} div.jGrowl{z-index:1040;font-size:inherit} div.jGrowl.bottom-right{right:30px}