New pre editor
This commit is contained in:
		
							parent
							
								
									296f24eaa5
								
							
						
					
					
						commit
						5584980c58
					
				
							
								
								
									
										418
									
								
								public/res/classes/PreEditor.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										418
									
								
								public/res/classes/PreEditor.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,418 @@
 | 
			
		||||
/* jshint -W084, -W099 */
 | 
			
		||||
define([
 | 
			
		||||
    'jquery',
 | 
			
		||||
    'eventMgr',
 | 
			
		||||
    'prism-core',
 | 
			
		||||
    'libs/prism-markdown'
 | 
			
		||||
], function ($, eventMgr, Prism) {
 | 
			
		||||
 | 
			
		||||
    var undoManager;
 | 
			
		||||
    eventMgr.addListener('onPagedownConfigure', function (pagedownEditor) {
 | 
			
		||||
        // Undo manager does exist at the moment
 | 
			
		||||
        setTimeout(function () {
 | 
			
		||||
            undoManager = pagedownEditor.undoManager;
 | 
			
		||||
        }, 0);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    String.prototype.splice = function (i, remove, add) {
 | 
			
		||||
        remove = +remove || 0;
 | 
			
		||||
        add = add || '';
 | 
			
		||||
 | 
			
		||||
        return this.slice(0, i) + add + this.slice(i + remove);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    function PreEditor(preElt) {
 | 
			
		||||
        var preEditor = this;
 | 
			
		||||
        preEditor.selectionStart = 0;
 | 
			
		||||
        preEditor.selectionEnd = 0;
 | 
			
		||||
        preEditor.scrollTop = 0;
 | 
			
		||||
        preEditor.$preContentElt = $('<div contenteditable class="pre-content language-md">');
 | 
			
		||||
 | 
			
		||||
        preElt.appendChild(preEditor.$preContentElt[0]);
 | 
			
		||||
        preEditor.highlight = function () {
 | 
			
		||||
            setTimeout(function () {
 | 
			
		||||
                preEditor.selectionStart = preElt.selectionStart;
 | 
			
		||||
                preEditor.selectionEnd = preElt.selectionEnd;
 | 
			
		||||
                var startDate = Date.now();
 | 
			
		||||
                Prism.highlightElement(preEditor.$preContentElt[0], false, function () {
 | 
			
		||||
                    console.log(Date.now() - startDate);
 | 
			
		||||
                    preElt.setSelectionRange(preEditor.selectionStart, preEditor.selectionEnd);
 | 
			
		||||
                });
 | 
			
		||||
            }, 0);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        preElt.focus = function () {
 | 
			
		||||
            preEditor.$preContentElt.focus();
 | 
			
		||||
            this.setSelectionRange(preEditor.selectionStart, preEditor.selectionEnd);
 | 
			
		||||
            preElt.scrollTop = preEditor.scrollTop;
 | 
			
		||||
        };
 | 
			
		||||
        preEditor.$preContentElt.focus(function () {
 | 
			
		||||
            preElt.focused = true;
 | 
			
		||||
        });
 | 
			
		||||
        preEditor.$preContentElt.blur(function () {
 | 
			
		||||
            preElt.focused = false;
 | 
			
		||||
        });
 | 
			
		||||
        Object.defineProperty(preElt, 'value', {
 | 
			
		||||
            get: function () {
 | 
			
		||||
                return this.textContent;
 | 
			
		||||
            },
 | 
			
		||||
            set: function (value) {
 | 
			
		||||
                //return preEditor.$preContentElt.text(value);
 | 
			
		||||
                var currentValue = this.textContent;
 | 
			
		||||
 | 
			
		||||
                // Find the first modified char
 | 
			
		||||
                var startIndex = 0;
 | 
			
		||||
                var startIndexMax = Math.min(currentValue.length, value.length);
 | 
			
		||||
                while (startIndex < startIndexMax) {
 | 
			
		||||
                    if (currentValue.charCodeAt(startIndex) !== value.charCodeAt(startIndex)) {
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                    startIndex++;
 | 
			
		||||
                }
 | 
			
		||||
                if (startIndex === startIndexMax) {
 | 
			
		||||
                    return preEditor.$preContentElt.text(value);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Find the last modified char
 | 
			
		||||
                var endIndex = 1;
 | 
			
		||||
                var endIndexMax = Math.min(currentValue.length - startIndex, value.length - startIndex);
 | 
			
		||||
                while (endIndex <= endIndexMax) {
 | 
			
		||||
                    if (currentValue.charCodeAt(currentValue.length - endIndex) !== value.charCodeAt(value.length - endIndex)) {
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                    endIndex++;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                var replacementText = value.substring(startIndex, value.length - endIndex + 1);
 | 
			
		||||
                endIndex = currentValue.length - endIndex + 1;
 | 
			
		||||
 | 
			
		||||
                var range = createRange(preElt, startIndex, endIndex);
 | 
			
		||||
                range.deleteContents();
 | 
			
		||||
                range.insertNode(document.createTextNode(replacementText));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        Object.defineProperty(preElt, 'selectionStart', {
 | 
			
		||||
            get: function () {
 | 
			
		||||
                var selection = window.getSelection();
 | 
			
		||||
 | 
			
		||||
                if (selection.rangeCount) {
 | 
			
		||||
                    var range = selection.getRangeAt(0),
 | 
			
		||||
                        element = range.startContainer,
 | 
			
		||||
                        container = element,
 | 
			
		||||
                        offset = range.startOffset;
 | 
			
		||||
 | 
			
		||||
                    if (!(this.compareDocumentPosition(element) & 0x10)) {
 | 
			
		||||
                        return 0;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    do {
 | 
			
		||||
                        while (element = element.previousSibling) {
 | 
			
		||||
                            if (element.textContent) {
 | 
			
		||||
                                offset += element.textContent.length;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        element = container = container.parentNode;
 | 
			
		||||
                    } while (element && element != this);
 | 
			
		||||
 | 
			
		||||
                    return offset;
 | 
			
		||||
                } else {
 | 
			
		||||
                    return 0;
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            set: function (value) {
 | 
			
		||||
                preElt.setSelectionRange(value, preEditor.selectionEnd);
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            enumerable: true,
 | 
			
		||||
            configurable: true
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        Object.defineProperty(preElt, 'selectionEnd', {
 | 
			
		||||
            get: function () {
 | 
			
		||||
                var selection = window.getSelection();
 | 
			
		||||
 | 
			
		||||
                if (selection.rangeCount) {
 | 
			
		||||
                    return this.selectionStart + (selection.getRangeAt(0) + '').length;
 | 
			
		||||
                } else {
 | 
			
		||||
                    return 0;
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            set: function (value) {
 | 
			
		||||
                preElt.setSelectionRange(preEditor.selectionStart, value);
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            enumerable: true,
 | 
			
		||||
            configurable: true
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        function findOffset(root, ss) {
 | 
			
		||||
            if (!root) {
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var offset = 0,
 | 
			
		||||
                element = root,
 | 
			
		||||
                container;
 | 
			
		||||
 | 
			
		||||
            do {
 | 
			
		||||
                container = element;
 | 
			
		||||
                element = element.firstChild;
 | 
			
		||||
 | 
			
		||||
                if (element) {
 | 
			
		||||
                    do {
 | 
			
		||||
                        var len = element.textContent.length;
 | 
			
		||||
 | 
			
		||||
                        if (offset <= ss && offset + len > ss) {
 | 
			
		||||
                            break;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        offset += len;
 | 
			
		||||
                    } while (element = element.nextSibling);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (!element) {
 | 
			
		||||
                    // It's the container's lastChild
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            } while (element && element.hasChildNodes() && element.nodeType != 3);
 | 
			
		||||
 | 
			
		||||
            if (element) {
 | 
			
		||||
                return {
 | 
			
		||||
                    element: element,
 | 
			
		||||
                    offset: ss - offset
 | 
			
		||||
                };
 | 
			
		||||
            } else if (container) {
 | 
			
		||||
                element = container;
 | 
			
		||||
 | 
			
		||||
                while (element && element.lastChild) {
 | 
			
		||||
                    element = element.lastChild;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (element.nodeType === 3) {
 | 
			
		||||
                    return {
 | 
			
		||||
                        element: element,
 | 
			
		||||
                        offset: element.textContent.length
 | 
			
		||||
                    };
 | 
			
		||||
                } else {
 | 
			
		||||
                    return {
 | 
			
		||||
                        element: element,
 | 
			
		||||
                        offset: 0
 | 
			
		||||
                    };
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return {
 | 
			
		||||
                element: root,
 | 
			
		||||
                offset: 0,
 | 
			
		||||
                error: true
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        function createRange(root, ss, se) {
 | 
			
		||||
            var range = document.createRange(),
 | 
			
		||||
                offset = findOffset(root, ss);
 | 
			
		||||
 | 
			
		||||
            range.setStart(offset.element, offset.offset);
 | 
			
		||||
 | 
			
		||||
            if (se && se != ss) {
 | 
			
		||||
                offset = findOffset(root, se);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            range.setEnd(offset.element, offset.offset);
 | 
			
		||||
            return range;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        preElt.setSelectionRange = function (ss, se) {
 | 
			
		||||
            preEditor.selectionStart = ss;
 | 
			
		||||
            preEditor.selectionEnd = se;
 | 
			
		||||
            var range = createRange(this, ss, se);
 | 
			
		||||
 | 
			
		||||
            var selection = window.getSelection();
 | 
			
		||||
            selection.removeAllRanges();
 | 
			
		||||
            selection.addRange(range);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        var action = function (action, options) {
 | 
			
		||||
            options = options || {};
 | 
			
		||||
 | 
			
		||||
            var text = preElt.value,
 | 
			
		||||
                ss = options.start || preEditor.selectionStart,
 | 
			
		||||
                se = options.end || preEditor.selectionEnd,
 | 
			
		||||
                state = {
 | 
			
		||||
                    ss: ss,
 | 
			
		||||
                    se: se,
 | 
			
		||||
                    before: text.slice(0, ss),
 | 
			
		||||
                    after: text.slice(se),
 | 
			
		||||
                    selection: text.slice(ss, se)
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
            actions[action](state, options);
 | 
			
		||||
 | 
			
		||||
            preElt.value = state.before + state.selection + state.after;
 | 
			
		||||
 | 
			
		||||
            preElt.setSelectionRange(state.ss, state.se);
 | 
			
		||||
 | 
			
		||||
            preElt.dispatchEvent(new window.Event('input'));
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        var actions = {
 | 
			
		||||
            indent: function (state, options) {
 | 
			
		||||
                var lf = state.before.lastIndexOf('\n') + 1;
 | 
			
		||||
 | 
			
		||||
                undoManager && undoManager.setMode("typing");
 | 
			
		||||
 | 
			
		||||
                if (options.inverse) {
 | 
			
		||||
                    if (/\s/.test(state.before.charAt(lf))) {
 | 
			
		||||
                        state.before = state.before.splice(lf, 1);
 | 
			
		||||
 | 
			
		||||
                        state.ss--;
 | 
			
		||||
                        state.se--;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    state.selection = state.selection.replace(/^[ \t]/gm, '');
 | 
			
		||||
                } else if (state.selection) {
 | 
			
		||||
                    state.before = state.before.splice(lf, 0, '\t');
 | 
			
		||||
                    state.selection = state.selection.replace(/\r?\n(?=[\s\S])/g, '\n\t');
 | 
			
		||||
 | 
			
		||||
                    state.ss++;
 | 
			
		||||
                    state.se++;
 | 
			
		||||
                } else {
 | 
			
		||||
                    state.before += '\t';
 | 
			
		||||
 | 
			
		||||
                    state.ss++;
 | 
			
		||||
                    state.se++;
 | 
			
		||||
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                state.se = state.ss + state.selection.length;
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            newline: function (state) {
 | 
			
		||||
                var lf = state.before.lastIndexOf('\n') + 1;
 | 
			
		||||
                var indent = (state.before.slice(lf).match(/^\s+/) || [''])[0];
 | 
			
		||||
 | 
			
		||||
                undoManager && undoManager.setMode("newlines");
 | 
			
		||||
 | 
			
		||||
                state.before += '\n' + indent;
 | 
			
		||||
 | 
			
		||||
                state.selection = '';
 | 
			
		||||
 | 
			
		||||
                state.ss += indent.length + 1;
 | 
			
		||||
                state.se = state.ss;
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            comment: function (state) {
 | 
			
		||||
                var textAction;
 | 
			
		||||
                var open = '<!--',
 | 
			
		||||
                    close = '-->';
 | 
			
		||||
 | 
			
		||||
                var start = state.before.lastIndexOf(open),
 | 
			
		||||
                    end = state.after.indexOf(close),
 | 
			
		||||
                    closeBefore = state.before.lastIndexOf(close),
 | 
			
		||||
                    openAfter = state.after.indexOf(start);
 | 
			
		||||
 | 
			
		||||
                undoManager && undoManager.setMode("typing");
 | 
			
		||||
 | 
			
		||||
                if (start > -1 && end > -1 && (start > closeBefore || closeBefore === -1) && (end < openAfter || openAfter === -1)) {
 | 
			
		||||
                    // Uncomment
 | 
			
		||||
                    state.before = state.before.splice(start, open.length);
 | 
			
		||||
                    state.after = state.after.splice(end, close.length);
 | 
			
		||||
 | 
			
		||||
                    textAction = [{
 | 
			
		||||
                        add: '',
 | 
			
		||||
                        del: open,
 | 
			
		||||
                        start: start
 | 
			
		||||
                    }, {
 | 
			
		||||
                        add: '',
 | 
			
		||||
                        del: close,
 | 
			
		||||
                        start: state.before.length + state.selection.length + end
 | 
			
		||||
                    }];
 | 
			
		||||
 | 
			
		||||
                    state.ss -= open.length;
 | 
			
		||||
                    state.se -= open.length;
 | 
			
		||||
 | 
			
		||||
                    return textAction;
 | 
			
		||||
                } else {
 | 
			
		||||
                    // Comment
 | 
			
		||||
                    if (state.selection) {
 | 
			
		||||
                        // Comment selection
 | 
			
		||||
                        state.selection = open + state.selection + close;
 | 
			
		||||
 | 
			
		||||
                        textAction = [{
 | 
			
		||||
                            add: open,
 | 
			
		||||
                            del: '',
 | 
			
		||||
                            start: state.ss
 | 
			
		||||
                        }, {
 | 
			
		||||
                            add: close,
 | 
			
		||||
                            del: '',
 | 
			
		||||
                            start: open.length + state.se
 | 
			
		||||
                        }];
 | 
			
		||||
                    } else {
 | 
			
		||||
                        // Comment whole line
 | 
			
		||||
                        start = state.before.lastIndexOf('\n') + 1;
 | 
			
		||||
                        end = state.after.indexOf('\n');
 | 
			
		||||
 | 
			
		||||
                        if (end === -1) {
 | 
			
		||||
                            end = state.after.length;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        while (/\s/.test(state.before.charAt(start))) {
 | 
			
		||||
                            start++;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        state.before = state.before.splice(start, 0, open);
 | 
			
		||||
 | 
			
		||||
                        state.after = state.after.splice(end, 0, close);
 | 
			
		||||
 | 
			
		||||
                        textAction = [{
 | 
			
		||||
                            add: open,
 | 
			
		||||
                            del: '',
 | 
			
		||||
                            start: start
 | 
			
		||||
                        }, {
 | 
			
		||||
                            add: close,
 | 
			
		||||
                            del: '',
 | 
			
		||||
                            start: state.before.length + end
 | 
			
		||||
                        }];
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    state.ss += open.length;
 | 
			
		||||
                    state.se += open.length;
 | 
			
		||||
 | 
			
		||||
                    return textAction;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        preEditor.$preContentElt.on('keydown', function (evt) {
 | 
			
		||||
            var cmdOrCtrl = evt.metaKey || evt.ctrlKey;
 | 
			
		||||
 | 
			
		||||
            switch (evt.keyCode) {
 | 
			
		||||
            case 9: // Tab
 | 
			
		||||
                if (!cmdOrCtrl) {
 | 
			
		||||
                    action('indent', {
 | 
			
		||||
                        inverse: evt.shiftKey
 | 
			
		||||
                    });
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case 13:
 | 
			
		||||
                action('newline');
 | 
			
		||||
                return false;
 | 
			
		||||
            case 191:
 | 
			
		||||
                if (cmdOrCtrl && !evt.altKey) {
 | 
			
		||||
                    action('comment', {
 | 
			
		||||
                        lang: this.id
 | 
			
		||||
                    });
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return PreEditor;
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										183
									
								
								public/res/classes/preEditor copy.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								public/res/classes/preEditor copy.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,183 @@
 | 
			
		||||
define(['jquery'], function($) {
 | 
			
		||||
    function PreEditor(preElt) {
 | 
			
		||||
        this.selectionStart = 0;
 | 
			
		||||
        this.selectionEnd = 0;
 | 
			
		||||
        this.scrollTop = 0;
 | 
			
		||||
        this.$preContentElt = $('<div contenteditable class="pre-content">');
 | 
			
		||||
        
 | 
			
		||||
        preElt.appendChild(this.$preContentElt[0]);
 | 
			
		||||
        
 | 
			
		||||
        preElt.focus = function() {
 | 
			
		||||
            this.$preContentElt.focus();
 | 
			
		||||
            this.setSelectionRange(this.selectionStart, this.selectionEnd);
 | 
			
		||||
            preElt.scrollTop = this.scrollTop;
 | 
			
		||||
        };
 | 
			
		||||
        this.$preContentElt.focus(function() {
 | 
			
		||||
            preElt.focused = true;
 | 
			
		||||
        });
 | 
			
		||||
        this.$preContentElt.blur(function() {
 | 
			
		||||
            preElt.focused = false;
 | 
			
		||||
        });
 | 
			
		||||
        Object.defineProperty(preElt, 'value', {
 | 
			
		||||
            get: function() {
 | 
			
		||||
                return this.$preContentElt.text();
 | 
			
		||||
            },
 | 
			
		||||
            set: function(value) {
 | 
			
		||||
                this.$preContentElt.text(value);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        Object.defineProperty(preElt, 'value', {
 | 
			
		||||
            get: function() {
 | 
			
		||||
                return this.$preContentElt.text();
 | 
			
		||||
            },
 | 
			
		||||
            set: function(value) {
 | 
			
		||||
                this.$preContentElt.text(value);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        Object.defineProperty(preElt, 'selectionStart', {
 | 
			
		||||
            get: function() {
 | 
			
		||||
                var selection = window.getSelection();
 | 
			
		||||
 | 
			
		||||
                if(selection.rangeCount) {
 | 
			
		||||
                    var range = selection.getRangeAt(0),
 | 
			
		||||
                        element = range.startContainer,
 | 
			
		||||
                        container = element,
 | 
			
		||||
                        offset = range.startOffset;
 | 
			
		||||
 | 
			
		||||
                    if(!(this.compareDocumentPosition(element) & 0x10)) {
 | 
			
		||||
                        return 0;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    do {
 | 
			
		||||
                        while(element = element.previousSibling) {
 | 
			
		||||
                            if(element.textContent) {
 | 
			
		||||
                                offset += element.textContent.length;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        element = container = container.parentNode;
 | 
			
		||||
                    } while(element && element != this);
 | 
			
		||||
 | 
			
		||||
                    return offset;
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    return 0;
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            set: function(value) {
 | 
			
		||||
                preElt.setSelectionRange(value, this.selectionEnd);
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            enumerable: true,
 | 
			
		||||
            configurable: true
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        Object.defineProperty(preElt, 'selectionEnd', {
 | 
			
		||||
            get: function() {
 | 
			
		||||
                var selection = window.getSelection();
 | 
			
		||||
 | 
			
		||||
                if(selection.rangeCount) {
 | 
			
		||||
                    return this.selectionStart + (selection.getRangeAt(0) + '').length;
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    return 0;
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            set: function(value) {
 | 
			
		||||
                preElt.setSelectionRange(this.selectionStart, value);
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            enumerable: true,
 | 
			
		||||
            configurable: true
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        preElt.setSelectionRange = function(ss, se) {
 | 
			
		||||
            this.selectionStart = ss;
 | 
			
		||||
            this.selectionEnd = se;
 | 
			
		||||
            function findOffset(root, ss) {
 | 
			
		||||
                if(!root) {
 | 
			
		||||
                    return null;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                var offset = 0,
 | 
			
		||||
                    element = root,
 | 
			
		||||
                    container;
 | 
			
		||||
 | 
			
		||||
                do {
 | 
			
		||||
                    container = element;
 | 
			
		||||
                    element = element.firstChild;
 | 
			
		||||
 | 
			
		||||
                    if(element) {
 | 
			
		||||
                        do {
 | 
			
		||||
                            var len = element.textContent.length;
 | 
			
		||||
 | 
			
		||||
                            if(offset <= ss && offset + len > ss) {
 | 
			
		||||
                                break;
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            offset += len;
 | 
			
		||||
                        } while(element = element.nextSibling);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if(!element) {
 | 
			
		||||
                        // It's the container's lastChild
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                } while(element && element.hasChildNodes() && element.nodeType != 3);
 | 
			
		||||
 | 
			
		||||
                if(element) {
 | 
			
		||||
                    return {
 | 
			
		||||
                        element: element,
 | 
			
		||||
                        offset: ss - offset
 | 
			
		||||
                    };
 | 
			
		||||
                }
 | 
			
		||||
                else if(container) {
 | 
			
		||||
                    element = container;
 | 
			
		||||
 | 
			
		||||
                    while(element && element.lastChild) {
 | 
			
		||||
                        element = element.lastChild;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if(element.nodeType === 3) {
 | 
			
		||||
                        return {
 | 
			
		||||
                            element: element,
 | 
			
		||||
                            offset: element.textContent.length
 | 
			
		||||
                        };
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        return {
 | 
			
		||||
                            element: element,
 | 
			
		||||
                            offset: 0
 | 
			
		||||
                        };
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return {
 | 
			
		||||
                    element: root,
 | 
			
		||||
                    offset: 0,
 | 
			
		||||
                    error: true
 | 
			
		||||
                };
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var range = document.createRange(),
 | 
			
		||||
                offset = findOffset(this, ss);
 | 
			
		||||
 | 
			
		||||
            range.setStart(offset.element, offset.offset);
 | 
			
		||||
 | 
			
		||||
            if(se && se != ss) {
 | 
			
		||||
                offset = findOffset(this, se);	
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            range.setEnd(offset.element, offset.offset);
 | 
			
		||||
 | 
			
		||||
            var selection = window.getSelection();
 | 
			
		||||
            selection.removeAllRanges();
 | 
			
		||||
            selection.addRange(range);
 | 
			
		||||
        };
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
            
 | 
			
		||||
    return PreEditor;
 | 
			
		||||
});
 | 
			
		||||
@ -14,7 +14,7 @@ define([], function() {
 | 
			
		||||
    constants.DEFAULT_FILE_TITLE = "Title";
 | 
			
		||||
    constants.DEFAULT_FOLDER_NAME = "New folder";
 | 
			
		||||
    constants.GDRIVE_DEFAULT_FILE_TITLE = "New Markdown document";
 | 
			
		||||
    constants.EDITOR_DEFAULT_PADDING = 15;
 | 
			
		||||
    constants.EDITOR_DEFAULT_PADDING = 30;
 | 
			
		||||
    constants.CHECK_ONLINE_PERIOD = 120000;
 | 
			
		||||
    constants.AJAX_TIMEOUT = 30000;
 | 
			
		||||
    constants.ASYNC_TASK_DEFAULT_TIMEOUT = 60000;
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@ define([
 | 
			
		||||
    "underscore",
 | 
			
		||||
    "crel",
 | 
			
		||||
    "ace",
 | 
			
		||||
    "classes/PreEditor",
 | 
			
		||||
    "constants",
 | 
			
		||||
    "utils",
 | 
			
		||||
    "storage",
 | 
			
		||||
@ -25,7 +26,7 @@ define([
 | 
			
		||||
    'ace/ext/spellcheck',
 | 
			
		||||
    'ace/ext/searchbox'
 | 
			
		||||
 | 
			
		||||
], function($, _, crel, ace, constants, utils, storage, settings, eventMgr, shortcutMgr, mousetrap, bodyIndexHTML, bodyViewerHTML, settingsTemplateTooltipHTML, settingsUserCustomExtensionTooltipHTML) {
 | 
			
		||||
], function($, _, crel, ace, PreEditor, constants, utils, storage, settings, eventMgr, shortcutMgr, mousetrap, bodyIndexHTML, bodyViewerHTML, settingsTemplateTooltipHTML, settingsUserCustomExtensionTooltipHTML) {
 | 
			
		||||
 | 
			
		||||
    var core = {};
 | 
			
		||||
 | 
			
		||||
@ -384,6 +385,16 @@ define([
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            onresize_end: function(paneName) {
 | 
			
		||||
                if(preEditor.$preContentElt !== undefined && paneName == 'center') {
 | 
			
		||||
                    var padding = ($editorElt.width() - getMaxWidth()) / 2;
 | 
			
		||||
                    if(padding < constants.EDITOR_DEFAULT_PADDING) {
 | 
			
		||||
                        padding = constants.EDITOR_DEFAULT_PADDING;
 | 
			
		||||
                    }
 | 
			
		||||
                    preEditor.$preContentElt.css({
 | 
			
		||||
                        'padding-left': padding + 'px',
 | 
			
		||||
                        'padding-right': padding + 'px'
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
                if(aceEditor !== undefined && paneName == 'center') {
 | 
			
		||||
                    aceEditor.resize();
 | 
			
		||||
                    var bottomMargin = (aceEditor.renderer.$size.scrollerHeight - aceEditor.renderer.lineHeight) / 2;
 | 
			
		||||
@ -488,6 +499,7 @@ define([
 | 
			
		||||
    var fileDesc;
 | 
			
		||||
    var documentContent;
 | 
			
		||||
    var UndoManager = require("ace/undomanager").UndoManager;
 | 
			
		||||
    var preEditor;
 | 
			
		||||
    core.initEditor = function(fileDescParam) {
 | 
			
		||||
        if(fileDesc !== undefined) {
 | 
			
		||||
            eventMgr.onFileClosed(fileDesc);
 | 
			
		||||
@ -518,11 +530,14 @@ define([
 | 
			
		||||
            // Store editor scrollTop on scroll event
 | 
			
		||||
            $editorElt.scroll(function() {
 | 
			
		||||
                if(documentContent !== undefined) {
 | 
			
		||||
                    fileDesc.editorScrollTop = $(this).scrollTop();
 | 
			
		||||
                    preEditor.scrollTop = this.scrollTop;
 | 
			
		||||
                    fileDesc.editorScrollTop = preEditor.scrollTop;
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            // Store editor selection on change
 | 
			
		||||
            $editorElt.bind("keyup mouseup", function() {
 | 
			
		||||
                preEditor.selectionStart = this.selectionStart;
 | 
			
		||||
                preEditor.selectionEnd = this.selectionEnd;
 | 
			
		||||
                if(documentContent !== undefined) {
 | 
			
		||||
                    fileDesc.editorStart = this.selectionStart;
 | 
			
		||||
                    fileDesc.editorEnd = this.selectionEnd;
 | 
			
		||||
@ -572,9 +587,13 @@ define([
 | 
			
		||||
            if(aceEditor !== undefined) {
 | 
			
		||||
                newDocumentContent = aceEditor.getValue();
 | 
			
		||||
            }
 | 
			
		||||
            if(documentContent !== undefined && documentContent != newDocumentContent) {
 | 
			
		||||
            if(documentContent === undefined) {
 | 
			
		||||
                preEditor.highlight();
 | 
			
		||||
            }
 | 
			
		||||
            else if(documentContent != newDocumentContent) {
 | 
			
		||||
                fileDesc.content = newDocumentContent;
 | 
			
		||||
                eventMgr.onContentChanged(fileDesc);
 | 
			
		||||
                preEditor.highlight();
 | 
			
		||||
            }
 | 
			
		||||
            documentContent = newDocumentContent;
 | 
			
		||||
        }
 | 
			
		||||
@ -615,7 +634,8 @@ define([
 | 
			
		||||
                        eventMgr.onFileOpen(fileDesc);
 | 
			
		||||
                        $previewContainerElt.scrollTop(fileDesc.previewScrollTop);
 | 
			
		||||
                        if(window.lightMode) {
 | 
			
		||||
                            $editorElt.scrollTop(fileDesc.editorScrollTop);
 | 
			
		||||
                            preEditor.scrollTop = fileDesc.editorScrollTop;
 | 
			
		||||
                            $editorElt.scrollTop(preEditor.scrollTop);
 | 
			
		||||
                        }
 | 
			
		||||
                        else {
 | 
			
		||||
                            _.defer(function() {
 | 
			
		||||
@ -704,7 +724,7 @@ define([
 | 
			
		||||
            screenWidth = screenWidth || 0;
 | 
			
		||||
            //var codeFontSize = settings.editorFontSize;
 | 
			
		||||
            //var codeLineHeight = Math.round(codeFontSize * 20 / 12);
 | 
			
		||||
            var previewFontSize = size * 13 / 12;
 | 
			
		||||
            var previewFontSize = size; // * 13 / 12;
 | 
			
		||||
            styleContent += [
 | 
			
		||||
                '@media (min-width: ' + screenWidth + 'px) {',
 | 
			
		||||
                '#wmd-input, .textarea-helper {',
 | 
			
		||||
@ -717,9 +737,9 @@ define([
 | 
			
		||||
                '}',
 | 
			
		||||
            ].join('\n');
 | 
			
		||||
        }
 | 
			
		||||
        applyFont(15);
 | 
			
		||||
        applyFont(16, 600);
 | 
			
		||||
        applyFont(17, 1200);
 | 
			
		||||
        applyFont(16);
 | 
			
		||||
        applyFont(17, 600);
 | 
			
		||||
        applyFont(18, 1200);
 | 
			
		||||
                
 | 
			
		||||
        function applyMaxWidth(maxWidth, screenWidth) {
 | 
			
		||||
            styleContent += [
 | 
			
		||||
@ -837,17 +857,12 @@ define([
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Editor
 | 
			
		||||
        if(window.preMode) {
 | 
			
		||||
            // In light mode, we replace ACE with a textarea
 | 
			
		||||
            $('#wmd-input').addClass('form-control').attr('contenteditable', true);
 | 
			
		||||
            
 | 
			
		||||
            // Create UI layout after textarea
 | 
			
		||||
            createLayout();
 | 
			
		||||
        }
 | 
			
		||||
        else if(window.lightMode) {
 | 
			
		||||
            // In light mode, we replace ACE with a textarea
 | 
			
		||||
        if(window.lightMode) {
 | 
			
		||||
            // In pre mode, we replace ACE with an editable pre
 | 
			
		||||
            $('#wmd-input').replaceWith(function() {
 | 
			
		||||
                return $('<textarea id="wmd-input">').addClass(this.className).addClass('form-control');
 | 
			
		||||
                var result = $('<pre id="wmd-input">').addClass(this.className).addClass('form-control');
 | 
			
		||||
                preEditor = new PreEditor(result[0]);
 | 
			
		||||
                return result;
 | 
			
		||||
            });
 | 
			
		||||
            
 | 
			
		||||
            // Create UI layout after textarea
 | 
			
		||||
 | 
			
		||||
@ -93,7 +93,11 @@ define([
 | 
			
		||||
        h.processUpdateTime = 50;
 | 
			
		||||
        h.Config({"HTML-CSS": {EqnChunk: 10,EqnChunkFactor: 1},SVG: {EqnChunk: 10,EqnChunkFactor: 1}})
 | 
			
		||||
    });
 | 
			
		||||
    /*benweet
 | 
			
		||||
    Don't hash inline math $...$ (see https://github.com/benweet/stackedit/issues/136)
 | 
			
		||||
    var u = /(\$\$?|\\(?:begin|end)\{[a-z]*\*?\}|\\[\\{}$]|[{}]|(?:\n\s*)+|@@\d+@@)/i, r;
 | 
			
		||||
    */
 | 
			
		||||
    var u = /(\$\$|\\(?:begin|end)\{[a-z]*\*?\}|\\[\\{}$]|[{}]|(?:\n\s*)+|@@\d+@@)/i, r;
 | 
			
		||||
    r = 3 === "aba".split(/(b)/).length ? function(a, f) {
 | 
			
		||||
        return a.split(f)
 | 
			
		||||
    } : function(a, f) {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								public/res/font/PTSans-Bold-webfont.woff
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public/res/font/PTSans-Bold-webfont.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								public/res/font/PTSans-BoldItalic-webfont.woff
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public/res/font/PTSans-BoldItalic-webfont.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								public/res/font/PTSans-Italic-webfont.woff
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public/res/font/PTSans-Italic-webfont.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								public/res/font/PTSans-Regular-webfont.woff
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public/res/font/PTSans-Regular-webfont.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							@ -713,7 +713,7 @@
 | 
			
		||||
            if (!util.isVisible(inputArea)) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (!isInitialState && doc.activeElement && doc.activeElement !== inputArea) { // this happens when tabbing out of the input box
 | 
			
		||||
            if (!isInitialState && !inputArea.focused) { // this happens when tabbing out of the input box
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -742,7 +742,7 @@
 | 
			
		||||
            }
 | 
			
		||||
            else if (doc.selection) {
 | 
			
		||||
 | 
			
		||||
                if (doc.activeElement && doc.activeElement !== inputArea) {
 | 
			
		||||
                if (!inputArea.focused) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@ -811,7 +811,9 @@
 | 
			
		||||
                inputArea.value = stateObj.text;
 | 
			
		||||
            }
 | 
			
		||||
            this.setInputAreaSelection();
 | 
			
		||||
            inputArea.scrollTop = stateObj.scrollTop;
 | 
			
		||||
            setTimeout(function() {
 | 
			
		||||
                inputArea.scrollTop = stateObj.scrollTop;
 | 
			
		||||
            }, 0);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        // Gets a collection of HTML chunks from the inptut textarea.
 | 
			
		||||
@ -1431,7 +1433,7 @@
 | 
			
		||||
                // 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
 | 
			
		||||
                        if (!panels.input.focused) { // we're not even in the input box, so there's no selection
 | 
			
		||||
                            return;
 | 
			
		||||
                        }
 | 
			
		||||
                        panels.ieCachedRange = document.selection.createRange();
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								public/res/libs/prism-latex.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								public/res/libs/prism-latex.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
Prism.languages.latex = {
 | 
			
		||||
    // A tex command e.g. \foo
 | 
			
		||||
	'keyword': /\\(?:[^a-zA-Z]|[a-zA-Z]+)/g,
 | 
			
		||||
    // Curly and square braces
 | 
			
		||||
	'lparen': /[[({]/g,
 | 
			
		||||
    // Curly and square braces
 | 
			
		||||
	'rparen': /[\])}]/g,
 | 
			
		||||
    // A comment. Tex comments start with % and go to 
 | 
			
		||||
    // the end of the line
 | 
			
		||||
	'comment': /%.*/g,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										308
									
								
								public/res/libs/prism-markdown.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										308
									
								
								public/res/libs/prism-markdown.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,308 @@
 | 
			
		||||
Prism.languages.md = (function() {
 | 
			
		||||
    
 | 
			
		||||
    var urlPattern = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>\[\]'"]+|\([^\s()<>\[\]'"]*\))+(?:\([^\s()<>\[\]'"]*\)|[^\s`!()\[\]{}:'".,<>?«»“”‘’]))/gi;
 | 
			
		||||
    var emailPattern = /[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)\b/gi;
 | 
			
		||||
 | 
			
		||||
    var md = {};
 | 
			
		||||
    md.pre = {
 | 
			
		||||
        pattern: /(^|(?:^|(?:^|\n)(?![ \t]*([*+\-]|\d+\.)[ \t]).*\n)\s*?\n)(\s*(?:[ ]{4}|\t).*(?:\n|$))+/g,
 | 
			
		||||
        lookbehind: true,
 | 
			
		||||
        inside: {
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md['pre gfm'] = {
 | 
			
		||||
        pattern: /^ {0,3}`{3}.*?\n(.*?\n)*? {0,3}`{3} *$/gm,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "md md-pre": /`{3}/
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md['h1 alt'] = {
 | 
			
		||||
        pattern: /^(.+)[ \t]*\n=+[ \t]*$/gm,
 | 
			
		||||
        inside: {
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md['h2 alt'] = {
 | 
			
		||||
        pattern: /^(.+)[ \t]*\n-+[ \t]*$/gm,
 | 
			
		||||
        inside: {
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.hr = {
 | 
			
		||||
        pattern: /^([*\-_] *){3,}$/gm,
 | 
			
		||||
    };
 | 
			
		||||
    md.li = {
 | 
			
		||||
        pattern: /^[ \t]*([*+\-]|\d+\.)[ \t].+$/gm,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "md md-li": /^[ ]?([*+\-]|\d+\.)[ \t]/m,
 | 
			
		||||
            "md md-li2": /^[ ]?(?:[ ]{2}|[	]{1})([*+\-]|\d+\.)[ \t]/m,
 | 
			
		||||
            "md md-li3": /^[ ]?(?:[ ]{4}|[	]{2})([*+\-]|\d+\.)[ \t]/m,
 | 
			
		||||
            "md md-li4": /^[ ]?(?:[ ]{6}|[	]{3})([*+\-]|\d+\.)[ \t]/m,
 | 
			
		||||
            "md md-li5": /^[ ]?(?:[ ]{8}|[	]{4})([*+\-]|\d+\.)[ \t]/m,
 | 
			
		||||
            "md md-li6": /^[ ]?(?:[ ]{10}|[	]{5})([*+\-]|\d+\.)[ \t]/m,
 | 
			
		||||
            "md md-li7": /^[ ]?(?:[ ]{12}|[	]{6})([*+\-]|\d+\.)[ \t]/m,
 | 
			
		||||
            "md md-li8": /^[ ]?(?:[ ]{14}|[	]{7})([*+\-]|\d+\.)[ \t]/m,
 | 
			
		||||
            "md md-li9": /^[ ]?(?:[ ]{16}|[	]{8})([*+\-]|\d+\.)[ \t]/m,
 | 
			
		||||
            "md md-li10": /^[ ]?(?:[ ]{18}|[	]{9})([*+\-]|\d+\.)[ \t]/m,
 | 
			
		||||
            "md md-li11": /^[ ]?(?:[ ]{20}|[	]{10})([*+\-]|\d+\.)[ \t]/m
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    for (var i = 6; i >= 1; i--) {
 | 
			
		||||
        md["h" + i] = {
 | 
			
		||||
            pattern: new RegExp("^#{" + i + "} .*$", "gm"),
 | 
			
		||||
            inside: {
 | 
			
		||||
                "md md-hash": new RegExp("^#{" + i + "} ")
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
    md.blockquote = {
 | 
			
		||||
        pattern: /^>[ ]*[^\n]+$/gm,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "md md-gt": /^>[ ]*/
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md['math block'] = {
 | 
			
		||||
        pattern: /(\$\$|\\\\\[|\\\\\\\\\()[\s\S]*?(\$\$|\\\\\]|\\\\\\\\\))/g,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "md md-bracket-start": /^(\$\$|\\\\\[|\\\\\\\\\()/,
 | 
			
		||||
            "md md-bracket-end": /(\$\$|\\\\\]|\\\\\\\\\))/,
 | 
			
		||||
            rest: Prism.languages.latex
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md['latex block'] = {
 | 
			
		||||
        pattern: /\\?\\begin\{[a-z]*\*?\}[\s\S]*?\\?\\end\{[a-z]*\*?\}/g,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "keyword": /\\?\\(begin|end)/,
 | 
			
		||||
            rest: Prism.languages.latex
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.fndef = {
 | 
			
		||||
        pattern: /^ {0,3}\[\^.*?\]:[ \t]+.*$/gm,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "ref-id": {
 | 
			
		||||
                pattern: /\[\^.*?\]/,
 | 
			
		||||
                inside: {
 | 
			
		||||
                    "md md-bracket-start": /\[/,
 | 
			
		||||
                    "md md-bracket-end": /\]/
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.linkdef = {
 | 
			
		||||
        pattern: /^ {0,3}\[.*?\]:[ \t]+.*$/gm,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "link-id": {
 | 
			
		||||
                pattern: /\[.*?\]/,
 | 
			
		||||
                inside: {
 | 
			
		||||
                    "md md-bracket-start": /\[/,
 | 
			
		||||
                    "md md-bracket-end": /\]/
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            url: urlPattern,
 | 
			
		||||
            linktitle: /['\"\(][^\'\"\)]*['\"\)]/
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.tocmarker = {
 | 
			
		||||
        pattern: /(^|(?:^|\n)\s*\n)[ \t]*\[(toc|TOC)\]($|\n($|\s*\n))$/g,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "md md-toc": /\[(toc|TOC)\]/
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.p = {
 | 
			
		||||
        pattern: /^[^\n]+(?:\n|$)/gm,
 | 
			
		||||
        inside: {
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.img = {
 | 
			
		||||
        pattern: /!\[[^\]]*\]\([^\)]+\)/g,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "md md-bang": /^!/,
 | 
			
		||||
            "md md-bracket-start": /\[/,
 | 
			
		||||
            "md md-alt": /[^\[]+(?=\])/,
 | 
			
		||||
            "md md-bracket-end": /\](?=\()/,
 | 
			
		||||
            "md img-parens": {
 | 
			
		||||
                pattern: /\([^\)]+\)/,
 | 
			
		||||
                inside: {
 | 
			
		||||
                    "md md-paren-start": /^\(/,
 | 
			
		||||
                    "md md-title": /(['‘][^'’]*['’]|["“][^"”]*["”])(?=\)$)/,
 | 
			
		||||
                    "md md-src": /[^\('" \t]+(?=[\)'" \t])/,
 | 
			
		||||
                    "md md-paren-end": /\)$/
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.link = {
 | 
			
		||||
        pattern: /\[(?:(\\.)|[^\[\]])*\]\([^\(\)\s]+(\(\S*?\))??[^\(\)\s]*?(\s(['‘][^'’]*['’]|["“][^"”]*["”]))?\)/gm,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "md md-bracket-start": {
 | 
			
		||||
                pattern: /(^|[^\\])\[/,
 | 
			
		||||
                lookbehind: true
 | 
			
		||||
            },
 | 
			
		||||
            "md md-underlined-text": {
 | 
			
		||||
                pattern: /(?:(\\.)|[^\[\]])+(?=\])/
 | 
			
		||||
            },
 | 
			
		||||
            "md md-bracket-end": /\]\s?\(/,
 | 
			
		||||
            "md md-paren-end": /\)$/,
 | 
			
		||||
            "md md-href": /.*/
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.fn = {
 | 
			
		||||
        pattern: /\[\^(.*?)\]/g,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "ref": {
 | 
			
		||||
                pattern: /^\[[^\[\]]+\] ?/,
 | 
			
		||||
                inside: {
 | 
			
		||||
                    "md md-bracket-start": /\[/,
 | 
			
		||||
                    "md md-ref": /^[^\[\]]+/,
 | 
			
		||||
                    "md md-bracket-end": /\]/
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.imgref = {
 | 
			
		||||
        pattern: /!\[(.*?)\] ?\[(.*?)\]/g,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "md md-bang": /^!/,
 | 
			
		||||
            "ref-end": {
 | 
			
		||||
                pattern: /\[[^\[\]]+\]$/,
 | 
			
		||||
                inside: {
 | 
			
		||||
                    "md md-bracket-start": /\[/,
 | 
			
		||||
                    "md md-href": /[^\[\]]+(?=]$)/,
 | 
			
		||||
                    "md md-bracket-end": /\]/
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "ref-start": {
 | 
			
		||||
                pattern: /^\[[^\[\]]+\] ?/,
 | 
			
		||||
                inside: {
 | 
			
		||||
                    "md md-bracket-start": /\[/,
 | 
			
		||||
                    "md md-alt": /^[^\[\]]+/,
 | 
			
		||||
                    "md md-bracket-end": /\]/
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.linkref = {
 | 
			
		||||
        pattern: /\[(.*?)\] ?\[(.*?)\]/g,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "ref-end": {
 | 
			
		||||
                pattern: /\[[^\[\]]+\]$/,
 | 
			
		||||
                inside: {
 | 
			
		||||
                    "md md-bracket-start": /\[/,
 | 
			
		||||
                    "md md-href": /[^\[\]]+(?=]$)/,
 | 
			
		||||
                    "md md-bracket-end": /\]/
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "ref-start": {
 | 
			
		||||
                pattern: /^\[[^\[\]]+\] ?/,
 | 
			
		||||
                inside: {
 | 
			
		||||
                    "md md-bracket-start": /\[/,
 | 
			
		||||
                    "md md-underlined-text": /^[^\[\]]+/,
 | 
			
		||||
                    "md md-bracket-end": /\]/
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.url = {
 | 
			
		||||
        pattern: urlPattern
 | 
			
		||||
    };
 | 
			
		||||
    md.email = {
 | 
			
		||||
        pattern: emailPattern
 | 
			
		||||
    };
 | 
			
		||||
    md.code = {
 | 
			
		||||
        pattern: /(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/g,
 | 
			
		||||
        lookbehind: true,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "md md-code": /`/
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.math = {
 | 
			
		||||
        pattern: /\$.*?\$/g,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "md md-bracket-start": /^\$/,
 | 
			
		||||
            "md md-bracket-end": /\$$/,
 | 
			
		||||
            rest: Prism.languages.latex
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.strong = {
 | 
			
		||||
        pattern: /([_\*])\1((?!\1{2}).)*\1{2}/g,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "md md-strong": /([_\*])\1/g
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.em = {
 | 
			
		||||
        pattern: /(^|[^\\])(\*|_)(\S[^\2]*?)??[^\s\\]+?\2/g,
 | 
			
		||||
        lookbehind: true,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "md md-em md-start": /^(\*|_)/,
 | 
			
		||||
            "md md-em md-close": /(\*|_)$/
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    md.strike = {
 | 
			
		||||
        pattern: /(^|\n|\W)(~~)(?=\S)([^\r]*?\S)\2/gm,
 | 
			
		||||
        lookbehind: true,
 | 
			
		||||
        inside: {
 | 
			
		||||
            "md md-s": /(~~)/,
 | 
			
		||||
            "md-strike-text": /[^~]+/
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    var rest = {
 | 
			
		||||
        code: md.code,
 | 
			
		||||
        math: md.math,
 | 
			
		||||
        fn: md.fn,
 | 
			
		||||
        img: md.img,
 | 
			
		||||
        link: md.link,
 | 
			
		||||
        imgref: md.imgref,
 | 
			
		||||
        linkref: md.linkref,
 | 
			
		||||
        url: md.url,
 | 
			
		||||
        email: md.email,
 | 
			
		||||
        strong: md.strong,
 | 
			
		||||
        em: md.em,
 | 
			
		||||
        strike: md.strike,
 | 
			
		||||
        comment: Prism.languages.markup.comment,
 | 
			
		||||
        tag: Prism.languages.markup.tag,
 | 
			
		||||
        entity: Prism.languages.markup.entity
 | 
			
		||||
    };
 | 
			
		||||
    for (var c = 6; c >= 1; c--) {
 | 
			
		||||
        md["h" + c].inside.rest = rest;
 | 
			
		||||
    }
 | 
			
		||||
    md["h1 alt"].inside.rest = rest;
 | 
			
		||||
    md["h2 alt"].inside.rest = rest;
 | 
			
		||||
    md.p.inside.rest = rest;
 | 
			
		||||
    md.blockquote.inside.rest = rest;
 | 
			
		||||
    md.li.inside.rest = rest;
 | 
			
		||||
    md.fndef.inside.rest = rest;
 | 
			
		||||
    
 | 
			
		||||
    md.blockquote.inside.rest.li = md.li;
 | 
			
		||||
 | 
			
		||||
    rest = {
 | 
			
		||||
        code: md.code,
 | 
			
		||||
        fn: md.fn,
 | 
			
		||||
        link: md.link,
 | 
			
		||||
        linkref: md.linkref,
 | 
			
		||||
    };
 | 
			
		||||
    md.strong.inside.rest = rest;
 | 
			
		||||
    md.em.inside.rest = rest;
 | 
			
		||||
    md.strike.inside.rest = rest;
 | 
			
		||||
    
 | 
			
		||||
    var inside = {
 | 
			
		||||
        code: md.code,
 | 
			
		||||
        strong: md.strong,
 | 
			
		||||
        em: md.em,
 | 
			
		||||
        strike: md.strike,
 | 
			
		||||
        comment: Prism.languages.markup.comment,
 | 
			
		||||
        tag: Prism.languages.markup.tag,
 | 
			
		||||
        entity: Prism.languages.markup.entity
 | 
			
		||||
    };
 | 
			
		||||
    md.link.inside["md md-underlined-text"].inside = inside;
 | 
			
		||||
    md.linkref.inside["ref-start"].inside["md md-underlined-text"].inside = inside;
 | 
			
		||||
    
 | 
			
		||||
    return md;
 | 
			
		||||
    /*
 | 
			
		||||
    Prism.hooks.add("wrap", function (t) {
 | 
			
		||||
        var i = -1 !== document.getElementsByTagName("body")[0].className.indexOf("tmpl-diffs") ? true : false;
 | 
			
		||||
        if (0 === t.type.indexOf("img") && !i) {
 | 
			
		||||
            var s = t.content.match(/md\-src"\s>([^<]+)/),
 | 
			
		||||
                a = t.content.match(/md\-alt"\s>([^<]+)/);
 | 
			
		||||
            s && s[1] && s[1].match(n) && (a = ' alt="' + (a ? e(a[1]) : "") + '"', t.content += "<span class='img-preview' contenteditable='false'><img src='" + s[1] + "' " + a + " /></span>");
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
    */
 | 
			
		||||
})();
 | 
			
		||||
@ -62,7 +62,9 @@ requirejs.config({
 | 
			
		||||
        'Typo.js': 'bower-libs/Typo.js',
 | 
			
		||||
        css: 'bower-libs/require-css/css',
 | 
			
		||||
        'css-builder': 'bower-libs/require-css/css-builder',
 | 
			
		||||
        normalize: 'bower-libs/require-css/normalize'
 | 
			
		||||
        normalize: 'bower-libs/require-css/normalize',
 | 
			
		||||
        prism: 'bower-libs/prism/prism',
 | 
			
		||||
        'prism-core': 'bower-libs/prism/components/prism-core',
 | 
			
		||||
    },
 | 
			
		||||
    shim: {
 | 
			
		||||
        underscore: {
 | 
			
		||||
@ -83,6 +85,19 @@ requirejs.config({
 | 
			
		||||
        'yaml-js': {
 | 
			
		||||
            exports: 'YAML'
 | 
			
		||||
        },
 | 
			
		||||
        'prism-core': {
 | 
			
		||||
            exports: 'Prism'
 | 
			
		||||
        },
 | 
			
		||||
        'bower-libs/prism/components/prism-markup': [
 | 
			
		||||
            'prism-core'
 | 
			
		||||
        ],
 | 
			
		||||
        'libs/prism-latex': [
 | 
			
		||||
            'prism-core'
 | 
			
		||||
        ],
 | 
			
		||||
        'libs/prism-markdown': [
 | 
			
		||||
            'bower-libs/prism/components/prism-markup',
 | 
			
		||||
            'libs/prism-latex'
 | 
			
		||||
        ],
 | 
			
		||||
        'bootstrap-record': [
 | 
			
		||||
            'mousetrap'
 | 
			
		||||
        ],
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,7 @@
 | 
			
		||||
@font-size-base: 15px;
 | 
			
		||||
@line-height-base: 1.45;
 | 
			
		||||
@p-margin: 1.1em;
 | 
			
		||||
@headings-font-family: inherit;
 | 
			
		||||
 | 
			
		||||
@font-face {
 | 
			
		||||
    font-family: 'Source Sans Pro';
 | 
			
		||||
@ -68,6 +69,19 @@
 | 
			
		||||
    src: local('Source Code Pro Bold'), local('SourceCodePro-Bold'), url("../font/SourceCodePro-Bold-webfont.woff") format('woff');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@font-face {
 | 
			
		||||
    font-family: 'Inconsolata';
 | 
			
		||||
    font-style: normal;
 | 
			
		||||
    font-weight: 400;
 | 
			
		||||
    src: local('Inconsolata'), url("../font/Inconsolata-Regular-webfont.woff") format('woff');
 | 
			
		||||
}
 | 
			
		||||
@font-face {
 | 
			
		||||
    font-family: 'Inconsolata';
 | 
			
		||||
    font-style: normal;
 | 
			
		||||
    font-weight: 700;
 | 
			
		||||
    src: local('Inconsolata Bold'), local('Inconsolata-Bold'), url("../font/Inconsolata-Bold-webfont.woff") format('woff');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@font-face {
 | 
			
		||||
    font-family: 'Anonymous Pro';
 | 
			
		||||
    font-style: normal;
 | 
			
		||||
@ -136,6 +150,10 @@ h1, h2, h3, h4, h5, h6 {
 | 
			
		||||
	margin: 1.3em 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pre {
 | 
			
		||||
    word-break: break-all;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
p,
 | 
			
		||||
pre,
 | 
			
		||||
pre.prettyprint,
 | 
			
		||||
@ -150,7 +168,7 @@ hr {
 | 
			
		||||
code, pre {
 | 
			
		||||
	font-family: @font-family-monospace;
 | 
			
		||||
    letter-spacing: @font-family-monospace-letter-spacing;
 | 
			
		||||
	font-size: 0.95em !important;
 | 
			
		||||
	font-size: 0.9em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pre, pre.prettyprint {
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,7 @@
 | 
			
		||||
 | 
			
		||||
// Editor
 | 
			
		||||
@tertiary-bg: #fff;
 | 
			
		||||
@tertiary-color-lighter: fade(@tertiary-color, 40%);
 | 
			
		||||
@tertiary-color-light: fade(@tertiary-color, 60%);
 | 
			
		||||
@tertiary-color: darken(@secondary-desaturated, 7.5%);
 | 
			
		||||
@tertiary-color-dark: darken(@tertiary-color, 15%);
 | 
			
		||||
@ -57,7 +58,7 @@
 | 
			
		||||
@document-panel-width: 320px;
 | 
			
		||||
@jgrowl-width: 260px;
 | 
			
		||||
@resizer-size: 32px;
 | 
			
		||||
@editor-line-weight: 1.6;
 | 
			
		||||
@editor-line-weight: 1.65;
 | 
			
		||||
 | 
			
		||||
/* Bootstrap */
 | 
			
		||||
@body-bg: @secondary-bg-light;
 | 
			
		||||
@ -140,7 +141,7 @@ body {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#preview-contents {
 | 
			
		||||
	padding: 15px;
 | 
			
		||||
	padding: 30px;
 | 
			
		||||
	margin: 0 auto 180px;
 | 
			
		||||
    text-align: justify;
 | 
			
		||||
}
 | 
			
		||||
@ -1201,20 +1202,233 @@ a {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@font-face {
 | 
			
		||||
    font-family: 'PT Sans';
 | 
			
		||||
    font-style: normal;
 | 
			
		||||
    font-weight: 400;
 | 
			
		||||
    src: local('PT Sans'), local('PTSans'), url("../font/PTSans-Regular-webfont.woff") format('woff');
 | 
			
		||||
}
 | 
			
		||||
@font-face {
 | 
			
		||||
    font-family: 'PT Sans';
 | 
			
		||||
    font-style: normal;
 | 
			
		||||
    font-weight: 700;
 | 
			
		||||
    src: local('PT Sans Bold'), local('PTSans-Bold'), url("../font/PTSans-Bold-webfont.woff") format('woff');
 | 
			
		||||
}
 | 
			
		||||
@font-face {
 | 
			
		||||
    font-family: 'PT Sans';
 | 
			
		||||
    font-style: italic;
 | 
			
		||||
    font-weight: 400;
 | 
			
		||||
    src: local('PT Sans Italic'), local('PTSans-Italic'), url("../font/PTSans-Italic-webfont.woff") format('woff');
 | 
			
		||||
}
 | 
			
		||||
@font-face {
 | 
			
		||||
    font-family: 'PT Sans';
 | 
			
		||||
    font-style: italic;
 | 
			
		||||
    font-weight: 700;
 | 
			
		||||
    src: local('PT Sans Bold Italic'), local('PTSans-BoldItalic'), url("../font/PTSans-BoldItalic-webfont.woff") format('woff');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#wmd-input {
 | 
			
		||||
    font-family: @font-family-monospace;
 | 
			
		||||
    letter-spacing: @font-family-monospace-letter-spacing;
 | 
			
		||||
    letter-spacing: normal;
 | 
			
		||||
	font-size: @font-size-base;
 | 
			
		||||
    border-radius: 0;
 | 
			
		||||
	color: @tertiary-color-dark;
 | 
			
		||||
	.box-shadow(none);
 | 
			
		||||
	resize: none;
 | 
			
		||||
	border: none;
 | 
			
		||||
    padding: 0 @padding-base-horizontal;
 | 
			
		||||
    padding: 0;
 | 
			
		||||
    line-height: @editor-line-weight;
 | 
			
		||||
	div& {
 | 
			
		||||
		padding: 0;
 | 
			
		||||
	}
 | 
			
		||||
    pre& {
 | 
			
		||||
        background-color: @tertiary-bg;
 | 
			
		||||
        font-family: "PT Sans", sans-serif;
 | 
			
		||||
        overflow: auto;
 | 
			
		||||
        white-space: pre-wrap;
 | 
			
		||||
        word-break: break-word;
 | 
			
		||||
        > div {
 | 
			
		||||
            margin: 0 auto;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    .code,
 | 
			
		||||
    .pre {
 | 
			
		||||
		color: @tertiary-color-darker;
 | 
			
		||||
        font: normal 0.9em @font-family-monospace
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    .tag {
 | 
			
		||||
        color: @tertiary-color-darker;
 | 
			
		||||
        font: bold 0.9em @font-family-monospace;
 | 
			
		||||
        .punctuation,
 | 
			
		||||
        .attr-value,
 | 
			
		||||
        .attr-name {
 | 
			
		||||
            font-weight: normal;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    .latex, .math {
 | 
			
		||||
        color: @tertiary-color;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    .entity {
 | 
			
		||||
        font: italic 0.9em @font-family-monospace;
 | 
			
		||||
        color: @tertiary-color;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .comment {
 | 
			
		||||
        font-size: 0.9em;
 | 
			
		||||
        color: @tertiary-color-light;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    .keyword {
 | 
			
		||||
		color: @tertiary-color-dark;
 | 
			
		||||
		font-weight: bold;
 | 
			
		||||
	}
 | 
			
		||||
    
 | 
			
		||||
    .code, .img, .imgref, .md-toc {
 | 
			
		||||
		background-color: @code-bg;
 | 
			
		||||
        border-radius: @border-radius-base;
 | 
			
		||||
        padding: 0.15em 0;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    .md-toc {
 | 
			
		||||
        font-size: 2.5em;
 | 
			
		||||
        padding: 0.2em;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /*
 | 
			
		||||
    .pre {
 | 
			
		||||
        line-height: 1.8;
 | 
			
		||||
        margin-left: 1.8em
 | 
			
		||||
    }
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
    .link, .linkref {
 | 
			
		||||
        .md-underlined-text {
 | 
			
		||||
            color: inherit;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .blockquote {
 | 
			
		||||
        color: @tertiary-color;
 | 
			
		||||
        padding-left: 2em;
 | 
			
		||||
        .li {
 | 
			
		||||
            padding-left: 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .h1, .h2, .h3, .h4, .h5, .h6 {
 | 
			
		||||
        font-weight: 600;
 | 
			
		||||
        .md-hash {
 | 
			
		||||
            color: @tertiary-color-lighter;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    .h1, .h11 { font-size: 1.4em; }
 | 
			
		||||
    .h2, .h22 { font-size: 1.3em; }
 | 
			
		||||
    .h3 { font-size: 1.2em; }
 | 
			
		||||
    .h4 { font-size: 1.1em; }
 | 
			
		||||
    .h5 { font-size: 1em; }
 | 
			
		||||
    .h6 { font-size: 0.9em; }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    .url,.email {
 | 
			
		||||
        color: @tertiary-color-light;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md {
 | 
			
		||||
        color: @tertiary-color-light;
 | 
			
		||||
        font-style: normal;
 | 
			
		||||
        font-weight: 400
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .em,.em .md {
 | 
			
		||||
        font-style: italic
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .strong,.strong .md {
 | 
			
		||||
        font-weight: 600
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-strike-text {
 | 
			
		||||
        text-decoration: line-through
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-underlined-text {
 | 
			
		||||
        text-decoration: underline;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .li {
 | 
			
		||||
        padding-left: 0.8em;
 | 
			
		||||
        .li {
 | 
			
		||||
            padding-left: 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-li,.md-li2,.md-li3,.md-li4,.md-li5,.md-li6,.md-li7,.md-li8,.md-li9,.md-li10,.md-li11 {
 | 
			
		||||
        white-space: pre-line;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-li {
 | 
			
		||||
        padding-left: 1.2em
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-li2 {
 | 
			
		||||
        padding-left: 2.4em
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-li3 {
 | 
			
		||||
        padding-left: 3.6em
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-li4 {
 | 
			
		||||
        padding-left: 4.8em
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-li5 {
 | 
			
		||||
        padding-left: 6em
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-li6 {
 | 
			
		||||
        padding-left: 7.2em
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-li7 {
 | 
			
		||||
        padding-left: 8.4em
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-li8 {
 | 
			
		||||
        padding-left: 9.6em
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-li9 {
 | 
			
		||||
        padding-left: 10.8em
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-li10 {
 | 
			
		||||
        padding-left: 12em
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-li11 {
 | 
			
		||||
        padding-left: 13.2em
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .img,
 | 
			
		||||
    .imgref {
 | 
			
		||||
        padding: 0.2em 0.4em;
 | 
			
		||||
        padding-right: 0
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .md-bang,
 | 
			
		||||
    .md-alt,
 | 
			
		||||
    .md-title {
 | 
			
		||||
        color: #666
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.textarea-helper {
 | 
			
		||||
@ -1223,7 +1437,7 @@ a {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: -100px;
 | 
			
		||||
    height: 1px;
 | 
			
		||||
    padding: 0 @padding-base-horizontal;
 | 
			
		||||
    padding: 0;
 | 
			
		||||
    line-height: @editor-line-weight;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    overflow: auto;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user