pan> 268
+    }
269
+  },
270
+
271
+  {
272
+    filter: ['th', 'td'],
273
+    replacement: function (content, node) {
274
+      return cell(content, node)
275
+    }
276
+  },
277
+
278
+  {
279
+    filter: 'tr',
280
+    replacement: function (content, node) {
281
+      var borderCells = ''
282
+      var alignMap = { left: ':--', right: '--:', center: ':-:' }
283
+
284
+      if (node.parentNode.nodeName === 'THEAD') {
285
+        for (var i = 0; i < node.childNodes.length; i++) {
286
+          var align = node.childNodes[i].attributes.align
287
+          var border = '---'
288
+
289
+          if (align) border = alignMap[align.value] || border
290
+
291
+          borderCells += cell(border, node.childNodes[i])
292
+        }
293
+      }
294
+      return '\n' + content + (borderCells ? '\n' + borderCells : '')
295
+    }
296
+  },
297
+
298
+  {
299
+    filter: 'table',
300
+    replacement: function (content) {
301
+      return '\n\n' + content + '\n\n'
302
+    }
303
+  },
304
+
305
+  {
306
+    filter: ['thead', 'tbody', 'tfoot'],
307
+    replacement: function (content) {
308
+      return content
309
+    }
310
+  },
311
+
312
+  // Fenced code blocks
313
+  {
314
+    filter: function (node) {
315
+      return node.nodeName === 'PRE' &&
316
+      node.firstChild &&
317
+      node.firstChild.nodeName === 'CODE'
318
+    },
319
+    replacement: function (content, node) {
320
+      return '\n\n```\n' + node.firstChild.textContent + '\n```\n\n'
321
+    }
322
+  },
323
+
324
+  // Syntax-highlighted code blocks
325
+  {
326
+    filter: function (node) {
327
+      return node.nodeName === 'PRE' &&
328
+      node.parentNode.nodeName === 'DIV' &&
329
+      highlightRegEx.test(node.parentNode.className)
330
+    },
331
+    replacement: function (content, node) {
332
+      var language = node.parentNode.className.match(highlightRegEx)[1]
333
+      return '\n\n```' + language + '\n' + node.textContent + '\n```\n\n'
334
+    }
335
+  },
336
+
337
+  {
338
+    filter: function (node) {
339
+      return node.nodeName === 'DIV' &&
340
+      highlightRegEx.test(node.className)
341
+    },
342
+    replacement: function (content) {
343
+      return '\n\n' + content + '\n\n'
344
+    }
345
+  }
346
+]
347
+
348
+},{}],3:[function(require,module,exports){
349
+/*
350
+ * Set up window for Node.js
351
+ */
352
+
353
+var _window = (typeof window !== 'undefined' ? window : this)
354
+
355
+/*
356
+ * Parsing HTML strings
357
+ */
358
+
359
+function canParseHtmlNatively () {
360
+  var Parser = _window.DOMParser
361
+  var canParse = false
362
+
363
+  // Adapted from https://gist.github.com/1129031
364
+  // Firefox/Opera/IE throw errors on unsupported types
365
+  try {
366
+    // WebKit returns null on unsupported types
367
+    if (new Parser().parseFromString('', 'text/html')) {
368
+      canParse = true
369
+    }
370
+  } catch (e) {}
371
+
372
+  return canParse
373
+}
374
+
375
+function createHtmlParser () {
376
+  var Parser = function () {}
377
+
378
+  // For Node.js environments
379
+  if (typeof document === 'undefined') {
380
+    var jsdom = require('jsdom')
381
+    Parser.prototype.parseFromString = function (string) {
382
+      return jsdom.jsdom(string, {
383
+        features: {
384
+          FetchExternalResources: [],
385
+          ProcessExternalResources: false
386
+        }
387
+      })
388
+    }
389
+  } else {
390
+    if (!shouldUseActiveX()) {
391
+      Parser.prototype.parseFromString = function (string) {
392
+        var doc = document.implementation.createHTMLDocument('')
393
+        doc.open()
394
+        doc.write(string)
395
+        doc.close()
396
+        return doc
397
+      }
398
+    } else {
399
+      Parser.prototype.parseFromString = function (string) {
400
+        var doc = new window.ActiveXObject('htmlfile')
401
+        doc.designMode = 'on' // disable on-page scripts
402
+        doc.open()
403
+        doc.write(string)
404
+        doc.close()
405
+        return doc
406
+      }
407
+    }
408
+  }
409
+  return Parser
410
+}
411
+
412
+function shouldUseActiveX () {
413
+  var useActiveX = false
414
+
415
+  try {
416
+    document.implementation.createHTMLDocument('').open()
417
+  } catch (e) {
418
+    if (window.ActiveXObject) useActiveX = true
419
+  }
420
+
421
+  return useActiveX
422
+}
423
+
424
+module.exports = canParseHtmlNatively() ? _window.DOMParser : createHtmlParser()
425
+
426
+},{"jsdom":6}],4:[function(require,module,exports){
427
+'use strict'
428
+
429
+module.exports = [
430
+  {
431
+    filter: 'p',
432
+    replacement: function (content) {
433
+      return '\n\n' + content + '\n\n'
434
+    }
435
+  },
436
+
437
+  {
438
+    filter: 'br',
439
+    replacement: function () {
440
+      return '  \n'
441
+    }
442
+  },
443
+
444
+  {
445
+    filter: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
446
+    replacement: function (content, node) {
447
+      var hLevel = node.nodeName.charAt(1)
448
+      var hPrefix = ''
449
+      for (var i = 0; i < hLevel; i++) {
450
+        hPrefix += '#'
451
+      }
452
+      return '\n\n' + hPrefix + ' ' + content + '\n\n'
453
+    }
454
+  },
455
+
456
+  {
457
+    filter: 'hr',
458
+    replacement: function () {
459
+      return '\n\n* * *\n\n'
460
+    }
461
+  },
462
+
463
+  {
464
+    filter: ['em', 'i'],
465
+    replacement: function (content) {
466
+      return '_' + content + '_'
467
+    }
468
+  },
469
+
470
+  {
471
+    filter: ['strong', 'b'],
472
+    replacement: function (content) {
473
+      return '**' + content + '**'
474
+    }
475
+  },
476
+
477
+  // Inline code
478
+  {
479
+    filter: function (node) {
480
+      var hasSiblings = node.previousSibling || node.nextSibling
481
+      var isCodeBlock = node.parentNode.nodeName === 'PRE' && !hasSiblings
482
+
483
+      return node.nodeName === 'CODE' && !isCodeBlock
484
+    },
485
+    replacement: function (content) {
486
+      return '`' + content + '`'
487
+    }
488
+  },
489
+
490
+  {
491
+    filter: function (node) {
492
+      return node.nodeName === 'A' && node.getAttribute('href')
493
+    },
494
+    replacement: function (content, node) {
495
+      var titlePart = node.title ? ' "' + node.title + '"' : ''
496
+      return '[' + content + '](' + node.getAttribute('href') + titlePart + ')'
497
+    }
498
+  },
499
+
500
+  {
501
+    filter: 'img',
502
+    replacement: function (content, node) {
503
+      var alt = node.alt || ''
504
+      var src = node.getAttribute('src') || ''
505
+      var title = node.title || ''
506
+      var titlePart = title ? ' "' + title + '"' : ''
507
+      return src ? '![' + alt + ']' + '(' + src + titlePart + ')' : ''
508
+    }
509
+  },
510
+
511
+  // Code blocks
512
+  {
513
+    filter: function (node) {
514
+      return node.nodeName === 'PRE' && node.firstChild.nodeName === 'CODE'
515
+    },
516
+    replacement: function (content, node) {
517
+      return '\n\n    ' + node.firstChild.textContent.replace(/\n/g, '\n    ') + '\n\n'
518
+    }
519
+  },
520
+
521
+  {
522
+    filter: 'blockquote',
523
+    replacement: function (content) {
524
+      content = content.trim()
525
+      content = content.replace(/\n{3,}/g, '\n\n')
526
+      content = content.replace(/^/gm, '> ')
527
+      return '\n\n' + content + '\n\n'
528
+    }
529
+  },
530
+
531
+  {
532
+    filter: 'li',
533
+    replacement: function (content, node) {
534
+      content = content.replace(/^\s+/, '').replace(/\n/gm, '\n    ')
535
+      var prefix = '*   '
536
+      var parent = node.parentNode
537
+      var index = Array.prototype.indexOf.call(parent.children, node) + 1
538
+
539
+      prefix = /ol/i.test(parent.nodeName) ? index + '.  ' : '*   '
540
+      return prefix + content
541
+    }
542
+  },
543
+
544
+  {
545
+    filter: ['ul', 'ol'],
546
+    replacement: function (content, node) {
547
+      var strings = []
548
+      for (var i = 0; i < node.childNodes.length; i++) {
549
+        strings.push(node.childNodes[i]._replacement)
550
+      }
551
+
552
+      if (/li/i.test(node.parentNode.nodeName)) {
553
+        return '\n' + strings.join('\n')
554
+      }
555
+      return '\n\n' + strings.join('\n') + '\n\n'
556
+    }
557
+  },
558
+
559
+  {
560
+    filter: function (node) {
561
+      return this.isBlock(node)
562
+    },
563
+    replacement: function (content, node) {
564
+      return '\n\n' + this.outer(node, content) + '\n\n'
565
+    }
566
+  },
567
+
568
+  // Anything else!
569
+  {
570
+    filter: function () {
571
+      return true
572
+    },
573
+    replacement: function (content, node) {
574
+      return this.outer(node, content)
575
+    }
576
+  }
577
+]
578
+
579
+},{}],5:[function(require,module,exports){
580
+/**
581
+ * This file automatically generated from `build.js`.
582
+ * Do not manually edit.
583
+ */
584
+
585
+module.exports = [
586
+  "address",
587
+  "article",
588
+  "aside",
589
+  "audio",
590
+  "blockquote",
591
+  "canvas",
592
+  "dd",
593
+  "div",
594
+  "dl",
595
+  "fieldset",
596
+  "figcaption",
597
+  "figure",
598
+  "footer",
599
+  "form",
600
+  "h1",
601
+  "h2",
602
+  "h3",
603
+  "h4",
604
+  "h5",
605
+  "h6",
606
+  "header",
607
+  "hgroup",
608
+  "hr",
609
+  "main",
610
+  "nav",
611
+  "noscript",
612
+  "ol",
613
+  "output",
614
+  "p",
615
+  "pre",
616
+  "section",
617
+  "table",
618
+  "tfoot",
619
+  "ul",
620
+  "video"
621
+];
622
+
623
+},{}],6:[function(require,module,exports){
624
+
625
+},{}],7:[function(require,module,exports){
626
+'use strict';
627
+
628
+var voidElements = require('void-elements');
629
+Object.keys(voidElements).forEach(function (name) {
630
+  voidElements[name.toUpperCase()] = 1;
631
+});
632
+
633
+var blockElements = {};
634
+require('block-elements').forEach(function (name) {
635
+  blockElements[name.toUpperCase()] = 1;
636
+});
637
+
638
+/**
639
+ * isBlockElem(node) determines if the given node is a block element.
640
+ *
641
+ * @param {Node} node
642
+ * @return {Boolean}
643
+ */
644
+function isBlockElem(node) {
645
+  return !!(node && blockElements[node.nodeName]);
646
+}
647
+
648
+/**
649
+ * isVoid(node) determines if the given node is a void element.
650
+ *
651
+ * @param {Node} node
652
+ * @return {Boolean}
653
+ */
654
+function isVoid(node) {
655
+  return !!(node && voidElements[node.nodeName]);
656
+}
657
+
658
+/**
659
+ * whitespace(elem [, isBlock]) removes extraneous whitespace from an
660
+ * the given element. The function isBlock may optionally be passed in
661
+ * to determine whether or not an element is a block element; if none
662
+ * is provided, defaults to using the list of block elements provided
663
+ * by the `block-elements` module.
664
+ *
665
+ * @param {Node} elem
666
+ * @param {Function} blockTest
667
+ */
668
+function collapseWhitespace(elem, isBlock) {
669
+  if (!elem.firstChild || elem.nodeName === 'PRE') return;
670
+
671
+  if (typeof isBlock !== 'function') {
672
+    isBlock = isBlockElem;
673
+  }
674
+
675
+  var prevText = null;
676
+  var prevVoid = false;
677
+
678
+  var prev = null;
679
+  var node = next(prev, elem);
680
+
681
+  while (node !== elem) {
682
+    if (node.nodeType === 3) {
683
+      // Node.TEXT_NODE
684
+      var text = node.data.replace(/[ \r\n\t]+/g, ' ');
685
+
686
+      if ((!prevText || / $/.test(prevText.data)) && !prevVoid && text[0] === ' ') {
687
+        text = text.substr(1);
688
+      }
689
+
690
+      // `text` might be empty at this point.
691
+      if (!text) {
692
+        node = remove(node);
693
+        continue;
694
+      }
695
+
696
+      node.data = text;
697
+      prevText = node;
698
+    } else if (node.nodeType === 1) {
699
+      // Node.ELEMENT_NODE
700
+      if (isBlock(node) || node.nodeName === 'BR') {
701
+        if (prevText) {
702
+          prevText.data = prevText.data.replace(/ $/, '');
703
+        }
704
+
705
+        prevText = null;
706
+        prevVoid = false;
707
+      } else if (isVoid(node)) {
708
+        // Avoid trimming space around non-block, non-BR void elements.
709
+        prevText = null;
710
+        prevVoid = true;
711
+      }
712
+    } else {
713
+      node = remove(node);
714
+      continue;
715
+    }
716
+
717
+    var nextNode = next(prev, node);
718
+    prev = node;
719
+    node = nextNode;
720
+  }
721
+
722
+  if (prevText) {
723
+    prevText.data = prevText.data.replace(/ $/, '');
724
+    if (!prevText.data) {
725
+      remove(prevText);
726
+    }
727
+  }
728
+}
729
+
730
+/**
731
+ * remove(node) removes the given node from the DOM and returns the
732
+ * next node in the sequence.
733
+ *
734
+ * @param {Node} node
735
+ * @return {Node} node
736
+ */
737
+function remove(node) {
738
+  var next = node.nextSibling || node.parentNode;
739
+
740
+  node.parentNode.removeChild(node);
741
+
742
+  return next;
743
+}
744
+
745
+/**
746
+ * next(prev, current) returns the next node in the sequence, given the
747
+ * current and previous nodes.
748
+ *
749
+ * @param {Node} prev
750
+ * @param {Node} current
751
+ * @return {Node}
752
+ */
753
+function next(prev, current) {
754
+  if (prev && prev.parentNode === current || current.nodeName === 'PRE') {
755
+    return current.nextSibling || current.parentNode;
756
+  }
757
+
758
+  return current.firstChild || current.nextSibling || current.parentNode;
759
+}
760
+
761
+module.exports = collapseWhitespace;
762
+
763
+},{"block-elements":5,"void-elements":8}],8:[function(require,module,exports){
764
+/**
765
+ * This file automatically generated from `pre-publish.js`.
766
+ * Do not manually edit.
767
+ */
768
+
769
+module.exports = {
770
+  "area": true,
771
+  "base": true,
772
+  "br": true,
773
+  "col": true,
774
+  "embed": true,
775
+  "hr": true,
776
+  "img": true,
777
+  "input": true,
778
+  "keygen": true,
779
+  "link": true,
780
+  "menuitem": true,
781
+  "meta": true,
782
+  "param": true,
783
+  "source": true,
784
+  "track": true,
785
+  "wbr": true
786
+};
787
+
788
+},{}]},{},[1])(1)
789
+});

+ 3 - 0
simditor/static/simditor/scripts/to-markdown.min.js

@@ -0,0 +1,3 @@
1
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else{if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else{if(typeof global!=="undefined"){g=global}else{if(typeof self!=="undefined"){g=self}else{g=this}}}g.toMarkdown=f()}}})(function(){var define,module,exports;return(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a){return a(o,!0)}if(i){return i(o,!0)}var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++){s(r[o])}return s})({1:[function(require,module,exports){var toMarkdown;var converters;var mdConverters=require("./lib/md-converters");var gfmConverters=require("./lib/gfm-converters");var HtmlParser=require("./lib/html-parser");var collapse=require("collapse-whitespace");var blocks=["address","article","aside","audio","blockquote","body","canvas","center","dd","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frameset","h1","h2","h3","h4","h5","h6","header","hgroup","hr","html","isindex","li","main","menu","nav","noframes","noscript","ol","output","p","pre","section","table","tbody","td","tfoot","th","thead","tr","ul"];function isBlock(node){return blocks.indexOf(node.nodeName.toLowerCase())!==-1}var voids=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"];function isVoid(node){return voids.indexOf(node.nodeName.toLowerCase())!==-1}function htmlToDom(string){var tree=new HtmlParser().parseFromString(string,"text/html");collapse(tree.documentElement,isBlock);return tree}function bfsOrder(node){var inqueue=[node];var outqueue=[];var elem;var children;var i;while(inqueue.length>0){elem=inqueue.shift();outqueue.push(elem);children=elem.childNodes;for(i=0;i<children.length;i++){if(children[i].nodeType===1){inqueue.push(children[i])}}}outqueue.shift();return outqueue}function getContent(node){var text="";for(var i=0;i<node.childNodes.length;i++){if(node.childNodes[i].nodeType===1){text+=node.childNodes[i]._replacement}else{if(node.childNodes[i].nodeType===3){text+=node.childNodes[i].data}else{continue}}}return text}function outer(node,content){return node.cloneNode(false).outerHTML.replace("><",">"+content+"<")}function canConvert(node,filter){if(typeof filter==="string"){return filter===node.nodeName.toLowerCase()}if(Array.isArray(filter)){return filter.indexOf(node.nodeName.toLowerCase())!==-1}else{if(typeof filter==="function"){return filter.call(toMarkdown,node)}else{throw new TypeError("`filter` needs to be a string, array, or function")}}}function isFlankedByWhitespace(side,node){var sibling;var regExp;var isFlanked;if(side==="left"){sibling=node.previousSibling;regExp=/ $/}else{sibling=node.nextSibling;regExp=/^ /}if(sibling){if(sibling.nodeType===3){isFlanked=regExp.test(sibling.nodeValue)}else{if(sibling.nodeType===1&&!isBlock(sibling)){isFlanked=regExp.test(sibling.textContent)}}}return isFlanked}function flankingWhitespace(node,content){var leading="";var trailing="";if(!isBlock(node)){var hasLeading=/^[ \r\n\t]/.test(content);var hasTrailing=/[ \r\n\t]$/.test(content);if(hasLeading&&!isFlankedByWhitespace("left",node)){leading=" "}if(hasTrailing&&!isFlankedByWhitespace("right",node)){trailing=" "}}return{leading:leading,trailing:trailing}}function process(node){var replacement;var content=getContent(node);if(!isVoid(node)&&!/A|TH|TD/.test(node.nodeName)&&/^\s*$/i.test(content)){node._replacement="";return}for(var i=0;i<converters.length;i++){var converter=converters[i];if(canConvert(node,converter.filter)){if(typeof converter.replacement!=="function"){throw new TypeError("`replacement` needs to be a function that returns a string")}var whitespace=flankingWhitespace(node,content);if(whitespace.leading||whitespace.trailing){content=content.trim()}replacement=whitespace.leading+converter.replacement.call(toMarkdown,content,node)+whitespace.trailing;break}}node._replacement=replacement}toMarkdown=function(input,options){options=options||{};if(typeof input!=="string"){throw new TypeError(input+" is not a string")}if(input===""){return""}input=input.replace(/(\d+)\. /g,"$1\\. ");var clone=htmlToDom(input).body;var nodes=bfsOrder(clone);var output;converters=mdConverters.slice(0);if(options.gfm){converters=gfmConverters.concat(converters)}if(options.converters){converters=options.converters.concat(converters)}for(var i=nodes.length-1;i>=0;i--){process(nodes[i])}output=getContent(clone);return output.replace(/^[\t\r\n]+|[\t\r\n\s]+$/g,"").replace(/\n\s+\n/g,"\n\n").replace(/\n{3,}/g,"\n\n")};toMarkdown.isBlock=isBlock;toMarkdown.isVoid=isVoid;toMarkdown.outer=outer;module.exports=toMarkdown},{"./lib/gfm-converters":2,"./lib/html-parser":3,"./lib/md-converters":4,"collapse-whitespace":7}],2:[function(require,module,exports){function cell(content,node){var index=Array.prototype.indexOf.call(node.parentNode.childNodes,node);
2
+var prefix=" ";if(index===0){prefix="| "}return prefix+content+" |"}var highlightRegEx=/highlight highlight-(\S+)/;module.exports=[{filter:"br",replacement:function(){return"\n"}},{filter:["del","s","strike"],replacement:function(content){return"~~"+content+"~~"}},{filter:function(node){return node.type==="checkbox"&&node.parentNode.nodeName==="LI"},replacement:function(content,node){return(node.checked?"[x]":"[ ]")+" "}},{filter:["th","td"],replacement:function(content,node){return cell(content,node)}},{filter:"tr",replacement:function(content,node){var borderCells="";var alignMap={left:":--",right:"--:",center:":-:"};if(node.parentNode.nodeName==="THEAD"){for(var i=0;i<node.childNodes.length;i++){var align=node.childNodes[i].attributes.align;var border="---";if(align){border=alignMap[align.value]||border}borderCells+=cell(border,node.childNodes[i])}}return"\n"+content+(borderCells?"\n"+borderCells:"")}},{filter:"table",replacement:function(content){return"\n\n"+content+"\n\n"}},{filter:["thead","tbody","tfoot"],replacement:function(content){return content}},{filter:function(node){return node.nodeName==="PRE"&&node.firstChild&&node.firstChild.nodeName==="CODE"},replacement:function(content,node){return"\n\n```\n"+node.firstChild.textContent+"\n```\n\n"}},{filter:function(node){return node.nodeName==="PRE"&&node.parentNode.nodeName==="DIV"&&highlightRegEx.test(node.parentNode.className)},replacement:function(content,node){var language=node.parentNode.className.match(highlightRegEx)[1];return"\n\n```"+language+"\n"+node.textContent+"\n```\n\n"}},{filter:function(node){return node.nodeName==="DIV"&&highlightRegEx.test(node.className)},replacement:function(content){return"\n\n"+content+"\n\n"}}]},{}],3:[function(require,module,exports){var _window=(typeof window!=="undefined"?window:this);function canParseHtmlNatively(){var Parser=_window.DOMParser;var canParse=false;try{if(new Parser().parseFromString("","text/html")){canParse=true}}catch(e){}return canParse}function createHtmlParser(){var Parser=function(){};if(typeof document==="undefined"){var jsdom=require("jsdom");Parser.prototype.parseFromString=function(string){return jsdom.jsdom(string,{features:{FetchExternalResources:[],ProcessExternalResources:false}})}}else{if(!shouldUseActiveX()){Parser.prototype.parseFromString=function(string){var doc=document.implementation.createHTMLDocument("");doc.open();doc.write(string);doc.close();return doc}}else{Parser.prototype.parseFromString=function(string){var doc=new window.ActiveXObject("htmlfile");doc.designMode="on";doc.open();doc.write(string);doc.close();return doc}}}return Parser}function shouldUseActiveX(){var useActiveX=false;try{document.implementation.createHTMLDocument("").open()}catch(e){if(window.ActiveXObject){useActiveX=true}}return useActiveX}module.exports=canParseHtmlNatively()?_window.DOMParser:createHtmlParser()},{"jsdom":6}],4:[function(require,module,exports){module.exports=[{filter:"p",replacement:function(content){return"\n\n"+content+"\n\n"}},{filter:"br",replacement:function(){return"  \n"}},{filter:["h1","h2","h3","h4","h5","h6"],replacement:function(content,node){var hLevel=node.nodeName.charAt(1);var hPrefix="";for(var i=0;i<hLevel;i++){hPrefix+="#"}return"\n\n"+hPrefix+" "+content+"\n\n"}},{filter:"hr",replacement:function(){return"\n\n* * *\n\n"}},{filter:["em","i"],replacement:function(content){return"_"+content+"_"}},{filter:["strong","b"],replacement:function(content){return"**"+content+"**"}},{filter:function(node){var hasSiblings=node.previousSibling||node.nextSibling;var isCodeBlock=node.parentNode.nodeName==="PRE"&&!hasSiblings;return node.nodeName==="CODE"&&!isCodeBlock},replacement:function(content){return"`"+content+"`"}},{filter:function(node){return node.nodeName==="A"&&node.getAttribute("href")},replacement:function(content,node){var titlePart=node.title?' "'+node.title+'"':"";return"["+content+"]("+node.getAttribute("href")+titlePart+")"}},{filter:"img",replacement:function(content,node){var alt=node.alt||"";var src=node.getAttribute("src")||"";var title=node.title||"";var titlePart=title?' "'+title+'"':"";return src?"!["+alt+"]"+"("+src+titlePart+")":""}},{filter:function(node){return node.nodeName==="PRE"&&node.firstChild.nodeName==="CODE"},replacement:function(content,node){return"\n\n    "+node.firstChild.textContent.replace(/\n/g,"\n    ")+"\n\n"}},{filter:"blockquote",replacement:function(content){content=content.trim();content=content.replace(/\n{3,}/g,"\n\n");content=content.replace(/^/gm,"> ");return"\n\n"+content+"\n\n"}},{filter:"li",replacement:function(content,node){content=content.replace(/^\s+/,"").replace(/\n/gm,"\n    ");var prefix="*   ";var parent=node.parentNode;var index=Array.prototype.indexOf.call(parent.children,node)+1;prefix=/ol/i.test(parent.nodeName)?index+".  ":"*   ";return prefix+content}},{filter:["ul","ol"],replacement:function(content,node){var strings=[];for(var i=0;i<node.childNodes.length;i++){strings.push(node.childNodes[i]._replacement)
3
+}if(/li/i.test(node.parentNode.nodeName)){return"\n"+strings.join("\n")}return"\n\n"+strings.join("\n")+"\n\n"}},{filter:function(node){return this.isBlock(node)},replacement:function(content,node){return"\n\n"+this.outer(node,content)+"\n\n"}},{filter:function(){return true},replacement:function(content,node){return this.outer(node,content)}}]},{}],5:[function(require,module,exports){module.exports=["address","article","aside","audio","blockquote","canvas","dd","div","dl","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","main","nav","noscript","ol","output","p","pre","section","table","tfoot","ul","video"]},{}],6:[function(require,module,exports){},{}],7:[function(require,module,exports){var voidElements=require("void-elements");Object.keys(voidElements).forEach(function(name){voidElements[name.toUpperCase()]=1});var blockElements={};require("block-elements").forEach(function(name){blockElements[name.toUpperCase()]=1});function isBlockElem(node){return !!(node&&blockElements[node.nodeName])}function isVoid(node){return !!(node&&voidElements[node.nodeName])}function collapseWhitespace(elem,isBlock){if(!elem.firstChild||elem.nodeName==="PRE"){return}if(typeof isBlock!=="function"){isBlock=isBlockElem}var prevText=null;var prevVoid=false;var prev=null;var node=next(prev,elem);while(node!==elem){if(node.nodeType===3){var text=node.data.replace(/[ \r\n\t]+/g," ");if((!prevText||/ $/.test(prevText.data))&&!prevVoid&&text[0]===" "){text=text.substr(1)}if(!text){node=remove(node);continue}node.data=text;prevText=node}else{if(node.nodeType===1){if(isBlock(node)||node.nodeName==="BR"){if(prevText){prevText.data=prevText.data.replace(/ $/,"")}prevText=null;prevVoid=false}else{if(isVoid(node)){prevText=null;prevVoid=true}}}else{node=remove(node);continue}}var nextNode=next(prev,node);prev=node;node=nextNode}if(prevText){prevText.data=prevText.data.replace(/ $/,"");if(!prevText.data){remove(prevText)}}}function remove(node){var next=node.nextSibling||node.parentNode;node.parentNode.removeChild(node);return next}function next(prev,current){if(prev&&prev.parentNode===current||current.nodeName==="PRE"){return current.nextSibling||current.parentNode}return current.firstChild||current.nextSibling||current.parentNode}module.exports=collapseWhitespace},{"block-elements":5,"void-elements":8}],8:[function(require,module,exports){module.exports={"area":true,"base":true,"br":true,"col":true,"embed":true,"hr":true,"img":true,"input":true,"keygen":true,"link":true,"menuitem":true,"meta":true,"param":true,"source":true,"track":true,"wbr":true}},{}]},{},[1])(1)});

+ 261 - 0
simditor/static/simditor/scripts/uploader.js

@@ -0,0 +1,261 @@
1
+(function (root, factory) {
2
+  if (typeof define === 'function' && define.amd) {
3
+    // AMD. Register as an anonymous module unless amdModuleId is set
4
+    define('simple-uploader', ["jquery","simple-module"], function ($, SimpleModule) {
5
+      return (root['uploader'] = factory($, SimpleModule));
6
+    });
7
+  } else if (typeof exports === 'object') {
8
+    // Node. Does not work with strict CommonJS, but
9
+    // only CommonJS-like environments that support module.exports,
10
+    // like Node.
11
+    module.exports = factory(require("jquery"),require("simple-module"));
12
+  } else {
13
+    root.simple = root.simple || {};
14
+    root.simple['uploader'] = factory(jQuery,SimpleModule);
15
+  }
16
+}(this, function ($, SimpleModule) {
17
+
18
+var Uploader, uploader,
19
+  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
20
+  hasProp = {}.hasOwnProperty;
21
+
22
+Uploader = (function(superClass) {
23
+  extend(Uploader, superClass);
24
+
25
+  function Uploader() {
26
+    return Uploader.__super__.constructor.apply(this, arguments);
27
+  }
28
+
29
+  Uploader.count = 0;
30
+
31
+  Uploader.prototype.opts = {
32
+    url: '',
33
+    params: null,
34
+    fileKey: 'upload_file',
35
+    connectionCount: 3
36
+  };
37
+
38
+  Uploader.prototype._init = function() {
39
+    this.files = [];
40
+    this.queue = [];
41
+    this.id = ++Uploader.count;
42
+    this.on('uploadcomplete', (function(_this) {
43
+      return function(e, file) {
44
+        _this.files.splice($.inArray(file, _this.files), 1);
45
+        if (_this.queue.length > 0 && _this.files.length < _this.opts.connectionCount) {
46
+          return _this.upload(_this.queue.shift());
47
+        } else {
48
+          return _this.uploading = false;
49
+        }
50
+      };
51
+    })(this));
52
+    return $(window).on('beforeunload.uploader-' + this.id, (function(_this) {
53
+      return function(e) {
54
+        if (!_this.uploading) {
55
+          return;
56
+        }
57
+        e.originalEvent.returnValue = _this._t('leaveConfirm');
58
+        return _this._t('leaveConfirm');
59
+      };
60
+    })(this));
61
+  };
62
+
63
+  Uploader.prototype.generateId = (function() {
64
+    var id;
65
+    id = 0;
66
+    return function() {
67
+      return id += 1;
68
+    };
69
+  })();
70
+
71
+  Uploader.prototype.upload = function(file, opts) {
72
+    var f, i, key, len;
73
+    if (opts == null) {
74
+      opts = {};
75
+    }
76
+    if (file == null) {
77
+      return;
78
+    }
79
+    if ($.isArray(file) || file instanceof FileList) {
80
+      for (i = 0, len = file.length; i < len; i++) {
81
+        f = file[i];
82
+        this.upload(f, opts);
83
+      }
84
+    } else if ($(file).is('input:file')) {
85
+      key = $(file).attr('name');
86
+      if (key) {
87
+        opts.fileKey = key;
88
+      }
89
+      this.upload($.makeArray($(file)[0].files), opts);
90
+    } else if (!file.id || !file.obj) {
91
+      file = this.getFile(file);
92
+    }
93
+    if (!(file && file.obj)) {
94
+      return;
95
+    }
96
+    $.extend(file, opts);
97
+    if (this.files.length >= this.opts.connectionCount) {
98
+      this.queue.push(file);
99
+      return;
100
+    }
101
+    if (this.triggerHandler('beforeupload', [file]) === false) {
102
+      return;
103
+    }
104
+    this.files.push(file);
105
+    this._xhrUpload(file);
106
+    return this.uploading = true;
107
+  };
108
+
109
+  Uploader.prototype.getFile = function(fileObj) {
110
+    var name, ref, ref1;
111
+    if (fileObj instanceof window.File || fileObj instanceof window.Blob) {
112
+      name = (ref = fileObj.fileName) != null ? ref : fileObj.name;
113
+    } else {
114
+      return null;
115
+    }
116
+    return {
117
+      id: this.generateId(),
118
+      url: this.opts.url,
119
+      params: this.opts.params,
120
+      fileKey: this.opts.fileKey,
121
+      name: name,
122
+      size: (ref1 = fileObj.fileSize) != null ? ref1 : fileObj.size,
123
+      ext: name ? name.split('.').pop().toLowerCase() : '',
124
+      obj: fileObj
125
+    };
126
+  };
127
+
128
+  Uploader.prototype._xhrUpload = function(file) {
129
+    var formData, k, ref, v;
130
+    formData = new FormData();
131
+    formData.append(file.fileKey, file.obj);
132
+    formData.append("original_filename", file.name);
133
+    if (file.params) {
134
+      ref = file.params;
135
+      for (k in ref) {
136
+        v = ref[k];
137
+        formData.append(k, v);
138
+      }
139
+    }
140
+    return file.xhr = $.ajax({
141
+      url: file.url,
142
+      data: formData,
143
+      processData: false,
144
+      contentType: false,
145
+      type: 'POST',
146
+      headers: {
147
+        'X-File-Name': encodeURIComponent(file.name)
148
+      },
149
+      xhr: function() {
150
+        var req;
151
+        req = $.ajaxSettings.xhr();
152
+        if (req) {
153
+          req.upload.onprogress = (function(_this) {
154
+            return function(e) {
155
+              return _this.progress(e);
156
+            };
157
+          })(this);
158
+        }
159
+        return req;
160
+      },
161
+      progress: (function(_this) {
162
+        return function(e) {
163
+          if (!e.lengthComputable) {
164
+            return;
165
+          }
166
+          return _this.trigger('uploadprogress', [file, e.loaded, e.total]);
167
+        };
168
+      })(this),
169
+      error: (function(_this) {
170
+        return function(xhr, status, err) {
171
+          return _this.trigger('uploaderror', [file, xhr, status]);
172
+        };
173
+      })(this),
174
+      success: (function(_this) {
175
+        return function(result) {
176
+          _this.trigger('uploadprogress', [file, file.size, file.size]);
177
+          _this.trigger('uploadsuccess', [file, result]);
178
+          return $(document).trigger('uploadsuccess', [file, result, _this]);
179
+        };
180
+      })(this),
181
+      complete: (function(_this) {
182
+        return function(xhr, status) {
183
+          return _this.trigger('uploadcomplete', [file, xhr.responseText]);
184
+        };
185
+      })(this)
186
+    });
187
+  };
188
+
189
+  Uploader.prototype.cancel = function(file) {
190
+    var f, i, len, ref;
191
+    if (!file.id) {
192
+      ref = this.files;
193
+      for (i = 0, len = ref.length; i < len; i++) {
194
+        f = ref[i];
195
+        if (f.id === file * 1) {
196
+          file = f;
197
+          break;
198
+        }
199
+      }
200
+    }
201
+    this.trigger('uploadcancel', [file]);
202
+    if (file.xhr) {
203
+      file.xhr.abort();
204
+    }
205
+    return file.xhr = null;
206
+  };
207
+
208
+  Uploader.prototype.readImageFile = function(fileObj, callback) {
209
+    var fileReader, img;
210
+    if (!$.isFunction(callback)) {
211
+      return;
212
+    }
213
+    img = new Image();
214
+    img.onload = function() {
215
+      return callback(img);
216
+    };
217
+    img.onerror = function() {
218
+      return callback();
219
+    };
220
+    if (window.FileReader && FileReader.prototype.readAsDataURL && /^image/.test(fileObj.type)) {
221
+      fileReader = new FileReader();
222
+      fileReader.onload = function(e) {
223
+        return img.src = e.target.result;
224
+      };
225
+      return fileReader.readAsDataURL(fileObj);
226
+    } else {
227
+      return callback();
228
+    }
229
+  };
230
+
231
+  Uploader.prototype.destroy = function() {
232
+    var file, i, len, ref;
233
+    this.queue.length = 0;
234
+    ref = this.files;
235
+    for (i = 0, len = ref.length; i < len; i++) {
236
+      file = ref[i];
237
+      this.cancel(file);
238
+    }
239
+    $(window).off('.uploader-' + this.id);
240
+    return $(document).off('.uploader-' + this.id);
241
+  };
242
+
243
+  Uploader.i18n = {
244
+    'zh-CN': {
245
+      leaveConfirm: '正在上传文件,如果离开上传会自动取消'
246
+    }
247
+  };
248
+
249
+  Uploader.locale = 'zh-CN';
250
+
251
+  return Uploader;
252
+
253
+})(SimpleModule);
254
+
255
+uploader = function(opts) {
256
+  return new Uploader(opts);
257
+};
258
+
259
+return uploader;
260
+
261
+}));

+ 7 - 0
simditor/static/simditor/scripts/uploader.min.js

@@ -0,0 +1,7 @@
1
+!function(a,b){"function"==typeof define&&define.amd?
2
+// AMD. Register as an anonymous module unless amdModuleId is set
3
+define("simple-uploader",["jquery","simple-module"],function(c,d){return a.uploader=b(c,d)}):"object"==typeof exports?
4
+// Node. Does not work with strict CommonJS, but
5
+// only CommonJS-like environments that support module.exports,
6
+// like Node.
7
+module.exports=b(require("jquery"),require("simple-module")):(a.simple=a.simple||{},a.simple.uploader=b(jQuery,SimpleModule))}(this,function(a,b){var c,d,e=function(a,b){function c(){this.constructor=a}for(var d in b)f.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},f={}.hasOwnProperty;return c=function(b){function c(){return c.__super__.constructor.apply(this,arguments)}return e(c,b),c.count=0,c.prototype.opts={url:"",params:null,fileKey:"upload_file",connectionCount:3},c.prototype._init=function(){return this.files=[],this.queue=[],this.id=++c.count,this.on("uploadcomplete",function(b){return function(c,d){return b.files.splice(a.inArray(d,b.files),1),b.queue.length>0&&b.files.length<b.opts.connectionCount?b.upload(b.queue.shift()):b.uploading=!1}}(this)),a(window).on("beforeunload.uploader-"+this.id,function(a){return function(b){return a.uploading?(b.originalEvent.returnValue=a._t("leaveConfirm"),a._t("leaveConfirm")):void 0}}(this))},c.prototype.generateId=function(){var a;return a=0,function(){return a+=1}}(),c.prototype.upload=function(b,c){var d,e,f,g;if(null==c&&(c={}),null!=b){if(a.isArray(b)||b instanceof FileList)for(e=0,g=b.length;g>e;e++)d=b[e],this.upload(d,c);else a(b).is("input:file")?(f=a(b).attr("name"),f&&(c.fileKey=f),this.upload(a.makeArray(a(b)[0].files),c)):b.id&&b.obj||(b=this.getFile(b));if(b&&b.obj){if(a.extend(b,c),this.files.length>=this.opts.connectionCount)return void this.queue.push(b);if(this.triggerHandler("beforeupload",[b])!==!1)return this.files.push(b),this._xhrUpload(b),this.uploading=!0}}},c.prototype.getFile=function(a){var b,c,d;return a instanceof window.File||a instanceof window.Blob?(b=null!=(c=a.fileName)?c:a.name,{id:this.generateId(),url:this.opts.url,params:this.opts.params,fileKey:this.opts.fileKey,name:b,size:null!=(d=a.fileSize)?d:a.size,ext:b?b.split(".").pop().toLowerCase():"",obj:a}):null},c.prototype._xhrUpload=function(b){var c,d,e,f;if(c=new FormData,c.append(b.fileKey,b.obj),c.append("original_filename",b.name),b.params){e=b.params;for(d in e)f=e[d],c.append(d,f)}return b.xhr=a.ajax({url:b.url,data:c,processData:!1,contentType:!1,type:"POST",headers:{"X-File-Name":encodeURIComponent(b.name)},xhr:function(){var b;return b=a.ajaxSettings.xhr(),b&&(b.upload.onprogress=function(a){return function(b){return a.progress(b)}}(this)),b},progress:function(a){return function(c){return c.lengthComputable?a.trigger("uploadprogress",[b,c.loaded,c.total]):void 0}}(this),error:function(a){return function(c,d,e){return a.trigger("uploaderror",[b,c,d])}}(this),success:function(c){return function(d){return c.trigger("uploadprogress",[b,b.size,b.size]),c.trigger("uploadsuccess",[b,d]),a(document).trigger("uploadsuccess",[b,d,c])}}(this),complete:function(a){return function(c,d){return a.trigger("uploadcomplete",[b,c.responseText])}}(this)})},c.prototype.cancel=function(a){var b,c,d,e;if(!a.id)for(e=this.files,c=0,d=e.length;d>c;c++)if(b=e[c],b.id===1*a){a=b;break}return this.trigger("uploadcancel",[a]),a.xhr&&a.xhr.abort(),a.xhr=null},c.prototype.readImageFile=function(b,c){var d,e;if(a.isFunction(c))return e=new Image,e.onload=function(){return c(e)},e.onerror=function(){return c()},window.FileReader&&FileReader.prototype.readAsDataURL&&/^image/.test(b.type)?(d=new FileReader,d.onload=function(a){return e.src=a.target.result},d.readAsDataURL(b)):c()},c.prototype.destroy=function(){var b,c,d,e;for(this.queue.length=0,e=this.files,c=0,d=e.length;d>c;c++)b=e[c],this.cancel(b);return a(window).off(".uploader-"+this.id),a(document).off(".uploader-"+this.id)},c.i18n={"zh-CN":{leaveConfirm:"正在上传文件,如果离开上传会自动取消"}},c.locale="zh-CN",c}(b),d=function(a){return new c(a)}});

+ 34 - 0
simditor/static/simditor/simditor-init.js

@@ -0,0 +1,34 @@
1
+(function() {
2
+    var djangoJQuery;
3
+    if (typeof jQuery == 'undefined' && typeof django == 'undefined') {
4
+        console.error('ERROR django-simditor missing jQuery. Set SIMDITOR_JQUERY_URL or provide jQuery in the template.');
5
+    } else if (typeof django != 'undefined') {
6
+        djangoJQuery = django.jQuery;
7
+    }
8
+
9
+    var $ = jQuery || djangoJQuery;
10
+    $(function() {
11
+
12
+        initialiseSimditor();
13
+        function initialiseSimditor() {
14
+            $('textarea[data-type=simditortype]').each(function() {
15
+
16
+                if($(this).data('processed') == "0" && $(this).attr('data-id').indexOf('__prefix__') == -1){
17
+                    $(this).data('processed', "1");
18
+                    var dataConfig = $(this).data('config');
19
+                    new Simditor({
20
+                        textarea: $(this),
21
+                        upload: dataConfig.upload,
22
+                        cleanPaste: dataConfig.cleanPaste,
23
+                        tabIndent: dataConfig.tabIndent,
24
+                        pasteImage: dataConfig.pasteImage,
25
+                        toolbar: dataConfig.toolbar,
26
+                        emoji: dataConfig.emoji
27
+                    });
28
+                }
29
+            });
30
+        }
31
+
32
+    });
33
+
34
+})();

+ 696 - 0
simditor/static/simditor/styles/editor.scss

@@ -0,0 +1,696 @@
1
+@charset "UTF-8";
2
+
3
+$simditor-button-height: 40px;
4
+$simditor-button-width: 46px;
5
+
6
+.simditor {
7
+  position: relative;
8
+  border: 1px solid #c9d8db;
9
+
10
+  .simditor-wrapper {
11
+    position: relative;
12
+    background: #ffffff;
13
+
14
+    & > textarea {
15
+      display: none !important;
16
+      width: 100%;
17
+      box-sizing: border-box;
18
+      font-family: monaco;
19
+      font-size: 16px;
20
+      line-height: 1.6;
21
+      border: none;
22
+      padding: 22px 15px 40px;
23
+      min-height: 300px;
24
+      outline: none;
25
+      background: transparent;
26
+      resize: none;
27
+    }
28
+
29
+    .simditor-placeholder {
30
+      display: none;
31
+      position: absolute;
32
+      left: 0;
33
+      z-index: 0;
34
+      padding: 22px 15px;
35
+      font-size: 16px;
36
+      font-family: arial, sans-serif;
37
+      line-height: 1.5;
38
+      color: #999999;
39
+      background: transparent;
40
+    }
41
+
42
+    &.toolbar-floating {
43
+      .simditor-toolbar {
44
+        position: fixed;
45
+        top: 0;
46
+        z-index: 10;
47
+        box-shadow: 0 0 6px rgba(0,0,0,0.1);
48
+      }
49
+    }
50
+
51
+    .simditor-image-loading {
52
+      width: 100%;
53
+      height: 100%;
54
+      position: absolute;
55
+      top: 0;
56
+      left: 0;
57
+      z-index: 2;
58
+
59
+      .progress {
60
+        width: 100%;
61
+        height: 100%;
62
+        background: rgba(0,0,0,0.4);
63
+        position: absolute;
64
+        bottom: 0;
65
+        left: 0;
66
+      }
67
+    }
68
+  }
69
+
70
+  .simditor-body {
71
+    padding: 22px 15px 40px;
72
+    min-height: 300px;
73
+    outline: none;
74
+    cursor: text;
75
+    position: relative;
76
+    z-index: 1;
77
+    background: transparent;
78
+
79
+    a.selected {
80
+      background: #b3d4fd;
81
+    }
82
+
83
+    a.simditor-mention {
84
+      cursor: pointer;
85
+    }
86
+
87
+    .simditor-table {
88
+      position: relative;
89
+
90
+      &.resizing {
91
+        cursor: col-resize;
92
+      }
93
+
94
+      .simditor-resize-handle {
95
+        position: absolute;
96
+        left: 0;
97
+        top: 0;
98
+        width: 10px;
99
+        height: 100%;
100
+        cursor: col-resize;
101
+      }
102
+    }
103
+
104
+    pre {
105
+      /*min-height: 28px;*/
106
+      box-sizing: border-box;
107
+      -moz-box-sizing: border-box;
108
+      word-wrap: break-word!important;
109
+      white-space: pre-wrap!important;
110
+    }
111
+
112
+    img {
113
+      cursor: pointer;
114
+
115
+      &.selected {
116
+        box-shadow: 0 0 0 4px #cccccc;
117
+      }
118
+    }
119
+  }
120
+
121
+  .simditor-paste-bin {
122
+    position: fixed;
123
+    bottom: 10px;
124
+    right: 10px;
125
+    width: 1px;
126
+    height: 20px;
127
+    font-size: 1px;
128
+    line-height: 1px;
129
+    overflow: hidden;
130
+    padding: 0;
131
+    margin: 0;
132
+    opacity: 0;
133
+    -webkit-user-select: text;
134
+  }
135
+
136
+  .simditor-toolbar {
137
+    border-bottom: 1px solid #eeeeee;
138
+    background: #ffffff;
139
+    width: 100%;
140
+
141
+    & > ul {
142
+      margin: 0;
143
+      padding: 0 0 0 6px;
144
+      list-style: none;
145
+
146
+      & > li {
147
+        position: relative;
148
+        display: inline-block;
149
+        font-size: 0;
150
+
151
+        & > span.separator {
152
+          display: inline-block;
153
+          background: #cfcfcf;
154
+          width: 1px;
155
+          height: 18px;
156
+          margin: ($simditor-button-height - 18px) / 2 15px;
157
+          vertical-align: middle;
158
+        }
159
+
160
+        & > .toolbar-item {
161
+          display: inline-block;
162
+          width: $simditor-button-width;
163
+          height: $simditor-button-height;
164
+          outline: none;
165
+          color: #333333;
166
+          font-size: 15px;
167
+          line-height: $simditor-button-height;
168
+          vertical-align: middle;
169
+          text-align: center;
170
+          text-decoration: none;
171
+
172
+          span {
173
+            opacity: 0.6;
174
+
175
+            &.simditor-icon {
176
+              display: inline;
177
+              line-height: normal;
178
+            }
179
+          }
180
+
181
+          &:hover span {
182
+            opacity: 1;
183
+          }
184
+
185
+          &.active {
186
+            background: #eeeeee;
187
+
188
+            span {
189
+              opacity: 1;
190
+            }
191
+          }
192
+
193
+          &.disabled {
194
+            cursor: default;
195
+
196
+            span {
197
+              opacity: 0.3;
198
+            }
199
+          }
200
+
201
+          &.toolbar-item-title {
202
+            span:before {
203
+              content: "H";
204
+              font-size: 19px;
205
+              font-weight: bold;
206
+              font-family: 'Times New Roman';
207
+            }
208
+
209
+            &.active-h1 span:before {
210
+              content: 'H1';
211
+              font-size: 18px;
212
+            }
213
+
214
+            &.active-h2 span:before {
215
+              content: 'H2';
216
+              font-size: 18px;
217
+            }
218
+
219
+            &.active-h3 span:before {
220
+              content: 'H3';
221
+              font-size: 18px;
222
+            }
223
+          }
224
+
225
+          &.toolbar-item-image {
226
+            position: relative;
227
+            overflow: hidden;
228
+
229
+            & > input[type=file] {
230
+              position: absolute;
231
+              right: 0px;
232
+              top: 0px;
233
+              opacity: 0;
234
+              font-size: 100px;
235
+              cursor: pointer;
236
+            }
237
+          }
238
+        }
239
+
240
+        &.menu-on {
241
+          .toolbar-item {
242
+            position: relative;
243
+            z-index: 20;
244
+            background: #ffffff;
245
+            box-shadow: 0 1px 4px rgba(0,0,0,0.3);
246
+
247
+            span {
248
+              opacity: 1;
249
+            }
250
+          }
251
+
252
+          .toolbar-menu {
253
+            display: block;
254
+          }
255
+        }
256
+      }
257
+    }
258
+
259
+    .toolbar-menu {
260
+      display: none;
261
+      position: absolute;
262
+      top: $simditor-button-height;
263
+      left: 0;
264
+      z-index: 21;
265
+      background: #ffffff;
266
+      text-align: left;
267
+      box-shadow: 0 0 4px rgba(0,0,0,0.3);
268
+
269
+      &:before {
270
+        content: '';
271
+        display: block;
272
+        width: $simditor-button-width;
273
+        height: 4px;
274
+        background: #ffffff;
275
+        position: absolute;
276
+        top: -3px;
277
+        left: 0;
278
+      }
279
+
280
+      ul {
281
+        min-width: 160px;
282
+        list-style: none;
283
+        margin: 0;
284
+        padding: 10px 1px;
285
+
286
+        & > li {
287
+
288
+          .menu-item {
289
+            display: block;
290
+            font-size:16px;
291
+            line-height: 2em;
292
+            padding: 0 10px;
293
+            text-decoration: none;
294
+            color: #666666;
295
+
296
+            &:hover {
297
+              background: #f6f6f6;
298
+            }
299
+
300
+            &.menu-item-h1 {
301
+              font-size: 24px;
302
+              color: #333333;
303
+            }
304
+
305
+            &.menu-item-h2 {
306
+              font-size: 22px;
307
+              color: #333333;
308
+            }
309
+
310
+            &.menu-item-h3 {
311
+              font-size: 20px;
312
+              color: #333333;
313
+            }
314
+
315
+            &.menu-item-h4 {
316
+              font-size: 18px;
317
+              color: #333333;
318
+            }
319
+
320
+            &.menu-item-h5 {
321
+              font-size: 16px;
322
+              color: #333333;
323
+            }
324
+          }
325
+
326
+          .separator {
327
+            display: block;
328
+            border-top: 1px solid #cccccc;
329
+            height: 0;
330
+            line-height: 0;
331
+            font-size: 0;
332
+            margin: 6px 0;
333
+          }
334
+        }
335
+
336
+      }
337
+
338
+      &.toolbar-menu-color {
339
+        width: 96px;
340
+
341
+        .color-list {
342
+          height: 40px;
343
+          margin: 10px 6px 6px 10px;
344
+          padding: 0;
345
+
346
+          min-width: 0;
347
+
348
+          li {
349
+            float: left;
350
+            margin: 0 4px 4px 0;
351
+
352
+            .font-color {
353
+              display: block;
354
+              width: 16px;
355
+              height: 16px;
356
+              background: #dfdfdf;
357
+              border-radius: 2px;
358
+
359
+              &:hover {
360
+                opacity: 0.8;
361
+              }
362
+
363
+              &.font-color-default {
364
+                background: #333333;
365
+              }
366
+            }
367
+
368
+            $font-colors: #E33737 #e28b41 #c8a732 #209361 #418caf #aa8773 #999999;
369
+            $i: 1;
370
+            @each $color in $font-colors {
371
+              .font-color-#{$i} {
372
+                background: $color;
373
+              }
374
+              $i: $i + 1;
375
+            }
376
+          }
377
+        }
378
+      }
379
+
380
+      &.toolbar-menu-table {
381
+        .menu-create-table {
382
+          background: #ffffff;
383
+          padding: 1px;
384
+
385
+          table {
386
+            border: none;
387
+            border-collapse: collapse;
388
+            border-spacing: 0;
389
+            table-layout: fixed;
390
+
391
+            td {
392
+              padding: 0;
393
+              cursor: pointer;
394
+
395
+              &:before {
396
+                width: 16px;
397
+                height: 16px;
398
+                border: 1px solid #ffffff;
399
+                background: #f3f3f3;
400
+                display: block;
401
+                content: ''
402
+              }
403
+
404
+              &.selected:before {
405
+                background: #cfcfcf;
406
+              }
407
+            }
408
+          }
409
+        }
410
+
411
+        .menu-edit-table {
412
+          display: none;
413
+
414
+          ul {
415
+            li {
416
+              white-space: nowrap;
417
+            }
418
+          }
419
+        }
420
+      }
421
+
422
+      &.toolbar-menu-image {
423
+        .menu-item-upload-image {
424
+          position: relative;
425
+          overflow: hidden;
426
+
427
+          input[type=file] {
428
+            position: absolute;
429
+            right: 0px;
430
+            top: 0px;
431
+            opacity: 0;
432
+            font-size: 100px;
433
+            cursor: pointer;
434
+          }
435
+        }
436
+      }
437
+
438
+      &.toolbar-menu-alignment {
439
+        width: 100%;
440
+        ul {
441
+          min-width: 100%;
442
+        }
443
+        .menu-item {
444
+          text-align: center;
445
+        }
446
+      }
447
+    }
448
+  }
449
+
450
+  .simditor-popover {
451
+    display: none;
452
+    padding: 5px 8px 0;
453
+    background: #ffffff;
454
+    box-shadow: 0 1px 4px rgba(0,0,0,0.4);
455
+    border-radius: 2px;
456
+    position: absolute;
457
+    z-index: 2;
458
+
459
+    .settings-field {
460
+      margin: 0 0 5px 0;
461
+      font-size: 12px;
462
+      height: 25px;
463
+      line-height: 25px;
464
+
465
+      label {
466
+        display: inline-block;
467
+        margin: 0 5px 0 0;
468
+      }
469
+
470
+      input[type=text] {
471
+        display: inline-block;
472
+        width: 200px;
473
+        box-sizing: border-box;
474
+        font-size: 12px;
475
+
476
+        &.image-size {
477
+          width: 83px;
478
+        }
479
+      }
480
+
481
+      .times {
482
+        display: inline-block;
483
+        width: 26px;
484
+        font-size: 12px;
485
+        text-align: center;
486
+      }
487
+    }
488
+
489
+    &.link-popover .btn-unlink,
490
+    &.image-popover .btn-upload,
491
+    &.image-popover .btn-restore {
492
+      display: inline-block;
493
+      margin: 0 0 0 5px;
494
+      color: #333333;
495
+      font-size: 14px;
496
+      outline: 0;
497
+
498
+      span {
499
+        opacity: 0.6;
500
+      }
501
+
502
+      &:hover span {
503
+        opacity: 1;
504
+      }
505
+    }
506
+
507
+    &.image-popover .btn-upload {
508
+      position: relative;
509
+      display: inline-block;
510
+      overflow: hidden;
511
+      vertical-align: middle;
512
+
513
+      input[type=file] {
514
+        position: absolute;
515
+        right: 0px;
516
+        top: 0px;
517
+        opacity: 0;
518
+        height: 100%;
519
+        width: 28px;
520
+      }
521
+    }
522
+  }
523
+
524
+  &.simditor-mobile {
525
+    .simditor-wrapper.toolbar-floating .simditor-toolbar {
526
+        position: absolute;
527
+        top: 0;
528
+        z-index: 10;
529
+        box-shadow: 0 0 6px rgba(0,0,0,0.1);
530
+    }
531
+  }
532
+}
533
+
534
+
535
+
536
+.simditor .simditor-body, .editor-style {
537
+  font-size: 16px;
538
+  font-family: arial, sans-serif;
539
+  line-height: 1.6;
540
+  color: #333;
541
+  outline: none;
542
+  word-wrap: break-word;
543
+
544
+  & > :first-child {
545
+    margin-top: 0!important;
546
+  }
547
+
548
+  a{ color: #4298BA; text-decoration: none; word-break: break-all;}
549
+  a:visited{ color: #4298BA; }
550
+  a:hover{ color: #0F769F; }
551
+  a:active{ color:#9E792E; }
552
+  a:hover, a:active{ outline: 0; }
553
+
554
+  h1,h2,h3,h4,h5,h6 {
555
+    font-weight: normal;
556
+    margin: 40px 0 20px;
557
+    color: #000000;
558
+  }
559
+
560
+  h1 { font-size: 24px; }
561
+  h2 { font-size: 22px; }
562
+  h3 { font-size: 20px; }
563
+  h4 { font-size: 18px; }
564
+  h5 { font-size: 16px; }
565
+  h6 { font-size: 16px; }
566
+
567
+  p, div {
568
+    word-wrap: break-word;
569
+    margin: 0 0 15px 0;
570
+    color: #333;
571
+    word-wrap: break-word;
572
+  }
573
+
574
+  b, strong {
575
+    font-weight: bold;
576
+  }
577
+
578
+  i, em {
579
+    font-style: italic;
580
+  }
581
+
582
+  u {
583
+    text-decoration: underline;
584
+  }
585
+
586
+  strike, del {
587
+    text-decoration: line-through;
588
+  }
589
+
590
+  ul, ol {
591
+    list-style:disc outside none;
592
+    margin: 15px 0;
593
+    padding: 0 0 0 40px;
594
+    line-height: 1.6;
595
+
596
+    ul, ol {
597
+      padding-left: 30px;
598
+    }
599
+
600
+    ul {
601
+      list-style: circle outside none;
602
+
603
+      ul {
604
+        list-style: square outside none;
605
+      }
606
+    }
607
+  }
608
+
609
+  ol {
610
+    list-style:decimal;
611
+  }
612
+
613
+  blockquote {
614
+    border-left: 6px solid #ddd;
615
+    padding: 5px 0 5px 10px;
616
+    margin: 15px 0 15px 15px;
617
+
618
+    & > :first-child {
619
+      margin-top: 0;
620
+    }
621
+  }
622
+
623
+  code {
624
+    display: inline-block;
625
+    padding: 0 4px;
626
+    margin: 0 5px;
627
+    background: #eeeeee;
628
+    border-radius: 3px;
629
+    font-size: 13px;
630
+    font-family: 'monaco', 'Consolas', "Liberation Mono", Courier, monospace;
631
+  }
632
+
633
+  pre {
634
+    padding: 10px 5px 10px 10px;
635
+    margin: 15px 0;
636
+    display: block;
637
+    line-height: 18px;
638
+    background: #F0F0F0;
639
+    border-radius: 3px;
640
+    font-size:13px;
641
+    font-family: 'monaco', 'Consolas', "Liberation Mono", Courier, monospace;
642
+    white-space: pre;
643
+    word-wrap: normal;
644
+    overflow-x: auto;
645
+
646
+    code {
647
+      display: block;
648
+      padding: 0;
649
+      margin: 0;
650
+      background: none;
651
+      border-radius: 0;
652
+    }
653
+  }
654
+
655
+  hr {
656
+    display: block;
657
+    height: 0px;
658
+    border: 0;
659
+    border-top: 1px solid #ccc;
660
+    margin: 15px 0;
661
+    padding: 0;
662
+  }
663
+
664
+  table {
665
+    width: 100%;
666
+    table-layout: fixed;
667
+    border-collapse: collapse;
668
+    border-spacing: 0;
669
+    margin: 15px 0;
670
+
671
+    thead {
672
+      background-color: #f9f9f9;
673
+    }
674
+
675
+    td, th {
676
+      min-width: 40px;
677
+      height: 30px;
678
+      border: 1px solid #ccc;
679
+      vertical-align: top;
680
+      padding: 2px 4px;
681
+      text-align: left;
682
+      box-sizing: border-box;
683
+
684
+      &.active {
685
+        background-color: #ffffee;
686
+      }
687
+    }
688
+  }
689
+
690
+
691
+  img {
692
+    margin: 0 5px;
693
+    vertical-align: middle;
694
+  }
695
+
696
+}

+ 1 - 0
simditor/static/simditor/styles/fonticon.scss

@@ -0,0 +1 @@
1
+@font-face{font-family:'Simditor';src:url(data:application/font-woff;charset=utf-8;base64,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) format('woff');font-weight:normal;font-style:normal}.simditor-icon{display:inline-block;font:normal normal normal 14px/1 'Simditor';font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.simditor-icon-code:before{content:'\f000'}.simditor-icon-bold:before{content:'\f001'}.simditor-icon-italic:before{content:'\f002'}.simditor-icon-underline:before{content:'\f003'}.simditor-icon-times:before{content:'\f004'}.simditor-icon-strikethrough:before{content:'\f005'}.simditor-icon-list-ol:before{content:'\f006'}.simditor-icon-list-ul:before{content:'\f007'}.simditor-icon-quote-left:before{content:'\f008'}.simditor-icon-table:before{content:'\f009'}.simditor-icon-link:before{content:'\f00a'}.simditor-icon-picture-o:before{content:'\f00b'}.simditor-icon-minus:before{content:'\f00c'}.simditor-icon-indent:before{content:'\f00d'}.simditor-icon-outdent:before{content:'\f00e'}.simditor-icon-unlink:before{content:'\f00f'}.simditor-icon-caret-down:before{content:'\f010'}.simditor-icon-caret-right:before{content:'\f011'}.simditor-icon-upload:before{content:'\f012'}.simditor-icon-undo:before{content:'\f013'}.simditor-icon-smile-o:before{content:'\f014'}.simditor-icon-tint:before{content:'\f015'}.simditor-icon-font:before{content:'\f016'}.simditor-icon-html5:before{content:'\f017'}.simditor-icon-mark:before{content:'\f018'}.simditor-icon-align-center:before{content:'\f019'}.simditor-icon-align-left:before{content:'\f01a'}.simditor-icon-align-right:before{content:'\f01b'}.simditor-icon-font-minus:before{content:'\f01c'}.simditor-icon-markdown:before{content:'\f01d'}.simditor-icon-checklist:before{content:'\f01e'}

+ 25 - 0
simditor/static/simditor/styles/simditor-checklist.css

@@ -0,0 +1,25 @@
1
+.simditor .simditor-body .simditor-checklist {
2
+  margin: 15px 0;
3
+  padding: 0 0 0 40px;
4
+  line-height: 1.6;
5
+  list-style-type: none;
6
+}
7
+
8
+.simditor .simditor-body .simditor-checklist > li {
9
+  margin: 0;
10
+  pointer-events: none;
11
+}
12
+.simditor .simditor-body .simditor-checklist > li::before {
13
+  content: '';
14
+  pointer-events: all;
15
+  display: inline-block;
16
+  margin: 0 5px 0 -25px;
17
+  width: 20px;
18
+  height: 20px;
19
+  cursor: default;
20
+  vertical-align: middle;
21
+  background-image: url("data:image/gif;base64,R0lGODlhFAAUAPUAAP///9nZ2XV1dWNjY3Z2dv7+/mpqasbGxsPDw21tbfv7+2RkZM/Pz/X19crKymdnZ+/v725ubsvLy/Hx8XBwcO7u7nd3d83Nzezs7Hp6eoCAgNfX14SEhIqKitLS0uDg4I2NjZSUlNTU1Ojo6NXV1ZaWlp6entjY2J+fn6WlpeXl5ebm5qmpqY6OjvPz85CQkP39/Xt7e/Ly8t3d3dzc3P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAAA1ACwAAAAAFAAUAAAG/8BarVar1Wq1Wq1Wq9VqtVqtVqvVarVarVar1Wq1Wq1Wq9VqtVqtVqvVarVarVar1Wq1Wq1Wq9WAtVpAMBgMBoPBYEAI1Gq1Wq1WKxgOAAAAAAAAAIhEoVar1Wo1xYLRaDQajUaj4XgoarVarVaDACOSyWQymUwmEwkFUqvVarVaxXLBYDAYDAaDuWQqtVqtVqtVNIzNZrPZbDYbBqdSq9VqtVql4wF+Pp/P5/P5eECVWq1Wq9UqIdFoNBqNRqMRqVSp1Wq1Wq1i2kwmk8lkMpmcUJVarVar1SopFQAABAAAAABgxarUarVaraZoOVwul8vlcrkuL0WtVqvVajBHTGYgEAgEAoEg5oDVarVarVaDyWY0Gg1Io9FmMlitVqvVarVarVYoFAqFQqFQq9VqtVqtVqvVarVarVar1Wq1Wq1Wq9VqtVqtVqvVarUasFar1Wq1Wq1Wq9VqtVqtVqvVarVarVar1YIAOw==");
22
+}
23
+.simditor .simditor-body .simditor-checklist > li[checked]::before {
24
+  background-image: url("data:image/gif;base64,R0lGODlhFAAUAPYAAAAAAHeHkD9QYB8wSOjo6Haw6C1huLbn8MfY8Ja42I630Ia48NjY2IefoJbH6Ja44H648D9CkCVZsE9XWFWY2D5wqI+foH6gwE9fYHeIoF93iPj4+J7P+J7A4IegyE54sPDw8I+nuB5BmAAHCEdXWC9BiFaAuFdveF2g4F9veB5JoA8PD12Y4GWg4CZRqKbI6GWo4BcoOK7Q8Cc4SDVwwAcPEEdQYA8YIDc/QBYykC1pwD9IWGaY0C8/SE2Q0B84UF6QyFWY4E2Q2D5omAcIGA8gMEZoiEZvkC5ZsE9ZmP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAABKACwAAAAAFAAUAAAH/4BKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKEys4SkpKSkpKSkpKSkpKSkpKShYAIyBKSkpKSkpKIUkRERERERERNwA2SkpKSkpKShslHggICAgICAEANyUbSkpKSkpKGzkoMjIyMjIdKwAVORtKSkpKSkogIhSAOz0ZMjI2ADZBIiBKSkpKSkogKkEaACsJFwArHUEqIEpKSkpKSiAuQSgxAD8xAEMoQS4gSkpKSkpKIEgoMDw1AAADMDAoSCBKSkpKSkogBigFBUcANTwFBS0GIEpKSkpKSiA0MAsLCzNHCwsLLTQgSkpKSkpKICYLHBwcDhwcgJYcHAsmIEpKSkpKShspCgcHBwcHBwcHCikbSkpKSkpKGxYYGBgYGBgYGBgYFhtKSkpKSkpKGyAMDAwMDAwMDCAbSkpKSkpKSkpKShsbGxsbGxsbSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkqASkpKSkpKSkpKSkpKSkpKSkpKSkpKSoEAOw==");
25
+}

+ 1 - 0
simditor/static/simditor/styles/simditor-checklist.min.css

@@ -0,0 +1 @@
1
+.simditor .simditor-body .simditor-checklist{margin:15px 0;padding:0 0 0 40px;line-height:1.6;list-style-type:none}.simditor .simditor-body .simditor-checklist>li{margin:0;pointer-events:none}.simditor .simditor-body .simditor-checklist>li::before{content:'';pointer-events:all;display:inline-block;margin:0 5px 0 -25px;width:20px;height:20px;cursor:default;vertical-align:middle;background-image:url("data:image/gif;base64,R0lGODlhFAAUAPUAAP///9nZ2XV1dWNjY3Z2dv7+/mpqasbGxsPDw21tbfv7+2RkZM/Pz/X19crKymdnZ+/v725ubsvLy/Hx8XBwcO7u7nd3d83Nzezs7Hp6eoCAgNfX14SEhIqKitLS0uDg4I2NjZSUlNTU1Ojo6NXV1ZaWlp6entjY2J+fn6WlpeXl5ebm5qmpqY6OjvPz85CQkP39/Xt7e/Ly8t3d3dzc3P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAAA1ACwAAAAAFAAUAAAG/8BarVar1Wq1Wq1Wq9VqtVqtVqvVarVarVar1Wq1Wq1Wq9VqtVqtVqvVarVarVar1Wq1Wq1Wq9WAtVpAMBgMBoPBYEAI1Gq1Wq1WKxgOAAAAAAAAAIhEoVar1Wo1xYLRaDQajUaj4XgoarVarVaDACOSyWQymUwmEwkFUqvVarVaxXLBYDAYDAaDuWQqtVqtVqtVNIzNZrPZbDYbBqdSq9VqtVql4wF+Pp/P5/P5eECVWq1Wq9UqIdFoNBqNRqMRqVSp1Wq1Wq1i2kwmk8lkMpmcUJVarVar1SopFQAABAAAAABgxarUarVaraZoOVwul8vlcrkuL0WtVqvVajBHTGYgEAgEAoEg5oDVarVarVaDyWY0Gg1Io9FmMlitVqvVarVarVYoFAqFQqFQq9VqtVqtVqvVarVarVar1Wq1Wq1Wq9VqtVqtVqvVarUasFar1Wq1Wq1Wq9VqtVqtVqvVarVarVar1YIAOw==")}.simditor .simditor-body .simditor-checklist>li[checked]::before{background-image:url("data:image/gif;base64,R0lGODlhFAAUAPYAAAAAAHeHkD9QYB8wSOjo6Haw6C1huLbn8MfY8Ja42I630Ia48NjY2IefoJbH6Ja44H648D9CkCVZsE9XWFWY2D5wqI+foH6gwE9fYHeIoF93iPj4+J7P+J7A4IegyE54sPDw8I+nuB5BmAAHCEdXWC9BiFaAuFdveF2g4F9veB5JoA8PD12Y4GWg4CZRqKbI6GWo4BcoOK7Q8Cc4SDVwwAcPEEdQYA8YIDc/QBYykC1pwD9IWGaY0C8/SE2Q0B84UF6QyFWY4E2Q2D5omAcIGA8gMEZoiEZvkC5ZsE9ZmP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAABKACwAAAAAFAAUAAAH/4BKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKEys4SkpKSkpKSkpKSkpKSkpKShYAIyBKSkpKSkpKIUkRERERERERNwA2SkpKSkpKShslHggICAgICAEANyUbSkpKSkpKGzkoMjIyMjIdKwAVORtKSkpKSkogIhSAOz0ZMjI2ADZBIiBKSkpKSkogKkEaACsJFwArHUEqIEpKSkpKSiAuQSgxAD8xAEMoQS4gSkpKSkpKIEgoMDw1AAADMDAoSCBKSkpKSkogBigFBUcANTwFBS0GIEpKSkpKSiA0MAsLCzNHCwsLLTQgSkpKSkpKICYLHBwcDhwcgJYcHAsmIEpKSkpKShspCgcHBwcHBwcHCikbSkpKSkpKGxYYGBgYGBgYGBgYFhtKSkpKSkpKGyAMDAwMDAwMDCAbSkpKSkpKSkpKShsbGxsbGxsbSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkqASkpKSkpKSkpKSkpKSkpKSkpKSkpKSoEAOw==")}

+ 37 - 0
simditor/static/simditor/styles/simditor-fullscreen.css

@@ -0,0 +1,37 @@
1
+@font-face {
2
+  font-family: 'icomoon';
3
+  src: url("../fonts/icomoon.eot?4vkjot");
4
+  src: url("../fonts/icomoon.eot?#iefix4vkjot") format("embedded-opentype"), url("../fonts/icomoon.ttf?4vkjot") format("truetype"), url("../fonts/icomoon.woff?4vkjot") format("woff"), url("../fonts/icomoon.svg?4vkjot#icomoon") format("svg");
5
+  font-weight: normal;
6
+  font-style: normal;
7
+}
8
+[class^="icon-"], [class*=" icon-"] {
9
+  font-family: 'icomoon';
10
+  speak: none;
11
+  font-style: normal;
12
+  font-weight: normal;
13
+  font-variant: normal;
14
+  text-transform: none;
15
+  line-height: 1;
16
+  /* Better Font Rendering =========== */
17
+  -webkit-font-smoothing: antialiased;
18
+  -moz-osx-font-smoothing: grayscale;
19
+}
20
+
21
+.icon-fullscreen:before {
22
+  content: "\e600";
23
+}
24
+
25
+.simditor-fullscreen {
26
+  overflow: hidden;
27
+}
28
+.simditor-fullscreen .simditor {
29
+  position: fixed;
30
+  top: 0;
31
+  left: 0;
32
+  z-index: 9999;
33
+  width: 100%;
34
+}
35
+.simditor-fullscreen .simditor .simditor-body {
36
+  overflow: auto;
37
+}

+ 1 - 0
simditor/static/simditor/styles/simditor-fullscreen.min.css

@@ -0,0 +1 @@
1
+@font-face{font-family:'icomoon';src:url("../fonts/icomoon.eot?4vkjot");src:url("../fonts/icomoon.eot?#iefix4vkjot") format("embedded-opentype"),url("../fonts/icomoon.ttf?4vkjot") format("truetype"),url("../fonts/icomoon.woff?4vkjot") format("woff"),url("../fonts/icomoon.svg?4vkjot#icomoon") format("svg");font-weight:normal;font-style:normal}[class^="icon-"],[class*=" icon-"]{font-family:'icomoon';speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-fullscreen:before{content:"\e600"}.simditor-fullscreen{overflow:hidden}.simditor-fullscreen .simditor{position:fixed;top:0;left:0;z-index:9999;width:100%}.simditor-fullscreen .simditor .simditor-body{overflow:auto}

+ 28 - 0
simditor/static/simditor/styles/simditor-markdown.css

@@ -0,0 +1,28 @@
1
+.simditor .markdown-editor {
2
+  display: none;
3
+}
4
+.simditor .markdown-editor textarea {
5
+  display: block;
6
+  width: 100%;
7
+  min-height: 200px;
8
+  box-sizing: border-box;
9
+  padding: 22px 15px 40px;
10
+  border: none;
11
+  border-bottom: 1px solid #dfdfdf;
12
+  resize: none;
13
+  outline: none;
14
+  font-size: 16px;
15
+}
16
+.simditor.simditor-markdown .markdown-editor {
17
+  display: block;
18
+}
19
+.simditor.simditor-markdown .simditor-body {
20
+  min-height: 100px;
21
+  background: #f3f3f3;
22
+}
23
+.simditor.simditor-markdown .simditor-placeholder {
24
+  display: none !important;
25
+}
26
+.simditor .simditor-toolbar .toolbar-item.toolbar-item-markdown .simditor-icon {
27
+  font-size: 18px;
28
+}

+ 1 - 0
simditor/static/simditor/styles/simditor-markdown.min.css

@@ -0,0 +1 @@
1
+.simditor .markdown-editor{display:none}.simditor .markdown-editor textarea{display:block;width:100%;min-height:200px;box-sizing:border-box;padding:22px 15px 40px;border:0;border-bottom:1px solid #dfdfdf;resize:none;outline:0;font-size:16px}.simditor.simditor-markdown .markdown-editor{display:block}.simditor.simditor-markdown .simditor-body{min-height:100px;background:#f3f3f3}.simditor.simditor-markdown .simditor-placeholder{display:none!important}.simditor .simditor-toolbar .toolbar-item.toolbar-item-markdown .simditor-icon{font-size:18px}

+ 746 - 0
simditor/static/simditor/styles/simditor.css

@@ -0,0 +1,746 @@
1
+/*!
2
+* Simditor v2.3.6
3
+* http://simditor.tower.im/
4
+* 2015-12-21
5
+*/
6
+@font-face {
7
+  font-family: 'Simditor';
8
+  src: url(data:application/font-woff;charset=utf-8;base64,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) format("woff");
9
+  font-weight: normal;
10
+  font-style: normal;
11
+}
12
+.simditor-icon {
13
+  display: inline-block;
14
+  font: normal normal normal 14px/1 'Simditor';
15
+  font-size: inherit;
16
+  text-rendering: auto;
17
+  -webkit-font-smoothing: antialiased;
18
+  -moz-osx-font-smoothing: grayscale;
19
+  transform: translate(0, 0);
20
+}
21
+
22
+.simditor-icon-code:before {
23
+  content: '\f000';
24
+}
25
+
26
+.simditor-icon-bold:before {
27
+  content: '\f001';
28
+}
29
+
30
+.simditor-icon-italic:before {
31
+  content: '\f002';
32
+}
33
+
34
+.simditor-icon-underline:before {
35
+  content: '\f003';
36
+}
37
+
38
+.simditor-icon-times:before {
39
+  content: '\f004';
40
+}
41
+
42
+.simditor-icon-strikethrough:before {
43
+  content: '\f005';
44
+}
45
+
46
+.simditor-icon-list-ol:before {
47
+  content: '\f006';
48
+}
49
+
50
+.simditor-icon-list-ul:before {
51
+  content: '\f007';
52
+}
53
+
54
+.simditor-icon-quote-left:before {
55
+  content: '\f008';
56
+}
57
+
58
+.simditor-icon-table:before {
59
+  content: '\f009';
60
+}
61
+
62
+.simditor-icon-link:before {
63
+  content: '\f00a';
64
+}
65
+
66
+.simditor-icon-picture-o:before {
67
+  content: '\f00b';
68
+}
69
+
70
+.simditor-icon-minus:before {
71
+  content: '\f00c';
72
+}
73
+
74
+.simditor-icon-indent:before {
75
+  content: '\f00d';
76
+}
77
+
78
+.simditor-icon-outdent:before {
79
+  content: '\f00e';
80
+}
81
+
82
+.simditor-icon-unlink:before {
83
+  content: '\f00f';
84
+}
85
+
86
+.simditor-icon-caret-down:before {
87
+  content: '\f010';
88
+}
89
+
90
+.simditor-icon-caret-right:before {
91
+  content: '\f011';
92
+}
93
+
94
+.simditor-icon-upload:before {
95
+  content: '\f012';
96
+}
97
+
98
+.simditor-icon-undo:before {
99
+  content: '\f013';
100
+}
101
+
102
+.simditor-icon-smile-o:before {
103
+  content: '\f014';
104
+}
105
+
106
+.simditor-icon-tint:before {
107
+  content: '\f015';
108
+}
109
+
110
+.simditor-icon-font:before {
111
+  content: '\f016';
112
+}
113
+
114
+.simditor-icon-html5:before {
115
+  content: '\f017';
116
+}
117
+
118
+.simditor-icon-mark:before {
119
+  content: '\f018';
120
+}
121
+
122
+.simditor-icon-align-center:before {
123
+  content: '\f019';
124
+}
125
+
126
+.simditor-icon-align-left:before {
127
+  content: '\f01a';
128
+}
129
+
130
+.simditor-icon-align-right:before {
131
+  content: '\f01b';
132
+}
133
+
134
+.simditor-icon-font-minus:before {
135
+  content: '\f01c';
136
+}
137
+
138
+.simditor-icon-markdown:before {
139
+  content: '\f01d';
140
+}
141
+
142
+.simditor-icon-checklist:before {
143
+  content: '\f01e';
144
+}
145
+
146
+.simditor {
147
+  position: relative;
148
+  border: 1px solid #c9d8db;
149
+}
150
+.simditor .simditor-wrapper {
151
+  position: relative;
152
+  background: #ffffff;
153
+}
154
+.simditor .simditor-wrapper > textarea {
155
+  display: none !important;
156
+  width: 100%;
157
+  box-sizing: border-box;
158
+  font-family: monaco;
159
+  font-size: 16px;
160
+  line-height: 1.6;
161
+  border: none;
162
+  padding: 22px 15px 40px;
163
+  min-height: 300px;
164
+  outline: none;
165
+  background: transparent;
166
+  resize: none;
167
+}
168
+.simditor .simditor-wrapper .simditor-placeholder {
169
+  display: none;
170
+  position: absolute;
171
+  left: 0;
172
+  z-index: 0;
173
+  padding: 22px 15px;
174
+  font-size: 16px;
175
+  font-family: arial, sans-serif;
176
+  line-height: 1.5;
177
+  color: #999999;
178
+  background: transparent;
179
+}
180
+.simditor .simditor-wrapper.toolbar-floating .simditor-toolbar {
181
+  position: fixed;
182
+  top: 0;
183
+  z-index: 10;
184
+  box-shadow: 0 0 6px rgba(0, 0, 0, 0.1);
185
+}
186
+.simditor .simditor-wrapper .simditor-image-loading {
187
+  width: 100%;
188
+  height: 100%;
189
+  position: absolute;
190
+  top: 0;
191
+  left: 0;
192
+  z-index: 2;
193
+}
194
+.simditor .simditor-wrapper .simditor-image-loading .progress {
195
+  width: 100%;
196
+  height: 100%;
197
+  background: rgba(0, 0, 0, 0.4);
198
+  position: absolute;
199
+  bottom: 0;
200
+  left: 0;
201
+}
202
+.simditor .simditor-body {
203
+  padding: 22px 15px 40px;
204
+  min-height: 300px;
205
+  outline: none;
206
+  cursor: text;
207
+  position: relative;
208
+  z-index: 1;
209
+  background: transparent;
210
+}
211
+.simditor .simditor-body a.selected {
212
+  background: #b3d4fd;
213
+}
214
+.simditor .simditor-body a.simditor-mention {
215
+  cursor: pointer;
216
+}
217
+.simditor .simditor-body .simditor-table {
218
+  position: relative;
219
+}
220
+.simditor .simditor-body .simditor-table.resizing {
221
+  cursor: col-resize;
222
+}
223
+.simditor .simditor-body .simditor-table .simditor-resize-handle {
224
+  position: absolute;
225
+  left: 0;
226
+  top: 0;
227
+  width: 10px;
228
+  height: 100%;
229
+  cursor: col-resize;
230
+}
231
+.simditor .simditor-body pre {
232
+  /*min-height: 28px;*/
233
+  box-sizing: border-box;
234
+  -moz-box-sizing: border-box;
235
+  word-wrap: break-word !important;
236
+  white-space: pre-wrap !important;
237
+}
238
+.simditor .simditor-body img {
239
+  cursor: pointer;
240
+}
241
+.simditor .simditor-body img.selected {
242
+  box-shadow: 0 0 0 4px #cccccc;
243
+}
244
+.simditor .simditor-paste-bin {
245
+  position: fixed;
246
+  bottom: 10px;
247
+  right: 10px;
248
+  width: 1px;
249
+  height: 20px;
250
+  font-size: 1px;
251
+  line-height: 1px;
252
+  overflow: hidden;
253
+  padding: 0;
254
+  margin: 0;
255
+  opacity: 0;
256
+  -webkit-user-select: text;
257
+}
258
+.simditor .simditor-toolbar {
259
+  border-bottom: 1px solid #eeeeee;
260
+  background: #ffffff;
261
+  width: 100%;
262
+}
263
+.simditor .simditor-toolbar > ul {
264
+  margin: 0;
265
+  padding: 0 0 0 6px;
266
+  list-style: none;
267
+}
268
+.simditor .simditor-toolbar > ul > li {
269
+  position: relative;
270
+  display: inline-block;
271
+  font-size: 0;
272
+}
273
+.simditor .simditor-toolbar > ul > li > span.separator {
274
+  display: inline-block;
275
+  background: #cfcfcf;
276
+  width: 1px;
277
+  height: 18px;
278
+  margin: 11px 15px;
279
+  vertical-align: middle;
280
+}
281
+.simditor .simditor-toolbar > ul > li > .toolbar-item {
282
+  display: inline-block;
283
+  width: 46px;
284
+  height: 40px;
285
+  outline: none;
286
+  color: #333333;
287
+  font-size: 15px;
288
+  line-height: 40px;
289
+  vertical-align: middle;
290
+  text-align: center;
291
+  text-decoration: none;
292
+}
293
+.simditor .simditor-toolbar > ul > li > .toolbar-item span {
294
+  opacity: 0.6;
295
+}
296
+.simditor .simditor-toolbar > ul > li > .toolbar-item span.simditor-icon {
297
+  display: inline;
298
+  line-height: normal;
299
+}
300
+.simditor .simditor-toolbar > ul > li > .toolbar-item:hover span {
301
+  opacity: 1;
302
+}
303
+.simditor .simditor-toolbar > ul > li > .toolbar-item.active {
304
+  background: #eeeeee;
305
+}
306
+.simditor .simditor-toolbar > ul > li > .toolbar-item.active span {
307
+  opacity: 1;
308
+}
309
+.simditor .simditor-toolbar > ul > li > .toolbar-item.disabled {
310
+  cursor: default;
311
+}
312
+.simditor .simditor-toolbar > ul > li > .toolbar-item.disabled span {
313
+  opacity: 0.3;
314
+}
315
+.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title span:before {
316
+  content: "H";
317
+  font-size: 19px;
318
+  font-weight: bold;
319
+  font-family: 'Times New Roman';
320
+}
321
+.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h1 span:before {
322
+  content: 'H1';
323
+  font-size: 18px;
324
+}
325
+.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h2 span:before {
326
+  content: 'H2';
327
+  font-size: 18px;
328
+}
329
+.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h3 span:before {
330
+  content: 'H3';
331
+  font-size: 18px;
332
+}
333
+.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-image {
334
+  position: relative;
335
+  overflow: hidden;
336
+}
337
+.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-image > input[type=file] {
338
+  position: absolute;
339
+  right: 0px;
340
+  top: 0px;
341
+  opacity: 0;
342
+  font-size: 100px;
343
+  cursor: pointer;
344
+}
345
+.simditor .simditor-toolbar > ul > li.menu-on .toolbar-item {
346
+  position: relative;
347
+  z-index: 20;
348
+  background: #ffffff;
349
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
350
+}
351
+.simditor .simditor-toolbar > ul > li.menu-on .toolbar-item span {
352
+  opacity: 1;
353
+}
354
+.simditor .simditor-toolbar > ul > li.menu-on .toolbar-menu {
355
+  display: block;
356
+}
357
+.simditor .simditor-toolbar .toolbar-menu {
358
+  display: none;
359
+  position: absolute;
360
+  top: 40px;
361
+  left: 0;
362
+  z-index: 21;
363
+  background: #ffffff;
364
+  text-align: left;
365
+  box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
366
+}
367
+.simditor .simditor-toolbar .toolbar-menu:before {
368
+  content: '';
369
+  display: block;
370
+  width: 46px;
371
+  height: 4px;
372
+  background: #ffffff;
373
+  position: absolute;
374
+  top: -3px;
375
+  left: 0;
376
+}
377
+.simditor .simditor-toolbar .toolbar-menu ul {
378
+  min-width: 160px;
379
+  list-style: none;
380
+  margin: 0;
381
+  padding: 10px 1px;
382
+}
383
+.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item {
384
+  display: block;
385
+  font-size: 16px;
386
+  line-height: 2em;
387
+  padding: 0 10px;
388
+  text-decoration: none;
389
+  color: #666666;
390
+}
391
+.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item:hover {
392
+  background: #f6f6f6;
393
+}
394
+.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h1 {
395
+  font-size: 24px;
396
+  color: #333333;
397
+}
398
+.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h2 {
399
+  font-size: 22px;
400
+  color: #333333;
401
+}
402
+.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h3 {
403
+  font-size: 20px;
404
+  color: #333333;
405
+}
406
+.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h4 {
407
+  font-size: 18px;
408
+  color: #333333;
409
+}
410
+.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h5 {
411
+  font-size: 16px;
412
+  color: #333333;
413
+}
414
+.simditor .simditor-toolbar .toolbar-menu ul > li .separator {
415
+  display: block;
416
+  border-top: 1px solid #cccccc;
417
+  height: 0;
418
+  line-height: 0;
419
+  font-size: 0;
420
+  margin: 6px 0;
421
+}
422
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color {
423
+  width: 96px;
424
+}
425
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list {
426
+  height: 40px;
427
+  margin: 10px 6px 6px 10px;
428
+  padding: 0;
429
+  min-width: 0;
430
+}
431
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li {
432
+  float: left;
433
+  margin: 0 4px 4px 0;
434
+}
435
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color {
436
+  display: block;
437
+  width: 16px;
438
+  height: 16px;
439
+  background: #dfdfdf;
440
+  border-radius: 2px;
441
+}
442
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color:hover {
443
+  opacity: 0.8;
444
+}
445
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color.font-color-default {
446
+  background: #333333;
447
+}
448
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-1 {
449
+  background: #E33737;
450
+}
451
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-2 {
452
+  background: #e28b41;
453
+}
454
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-3 {
455
+  background: #c8a732;
456
+}
457
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-4 {
458
+  background: #209361;
459
+}
460
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-5 {
461
+  background: #418caf;
462
+}
463
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-6 {
464
+  background: #aa8773;
465
+}
466
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-7 {
467
+  background: #999999;
468
+}
469
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table {
470
+  background: #ffffff;
471
+  padding: 1px;
472
+}
473
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table {
474
+  border: none;
475
+  border-collapse: collapse;
476
+  border-spacing: 0;
477
+  table-layout: fixed;
478
+}
479
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td {
480
+  padding: 0;
481
+  cursor: pointer;
482
+}
483
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td:before {
484
+  width: 16px;
485
+  height: 16px;
486
+  border: 1px solid #ffffff;
487
+  background: #f3f3f3;
488
+  display: block;
489
+  content: "";
490
+}
491
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td.selected:before {
492
+  background: #cfcfcf;
493
+}
494
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table {
495
+  display: none;
496
+}
497
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table ul li {
498
+  white-space: nowrap;
499
+}
500
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image {
501
+  position: relative;
502
+  overflow: hidden;
503
+}
504
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image input[type=file] {
505
+  position: absolute;
506
+  right: 0px;
507
+  top: 0px;
508
+  opacity: 0;
509
+  font-size: 100px;
510
+  cursor: pointer;
511
+}
512
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-alignment {
513
+  width: 100%;
514
+}
515
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-alignment ul {
516
+  min-width: 100%;
517
+}
518
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-alignment .menu-item {
519
+  text-align: center;
520
+}
521
+.simditor .simditor-popover {
522
+  display: none;
523
+  padding: 5px 8px 0;
524
+  background: #ffffff;
525
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
526
+  border-radius: 2px;
527
+  position: absolute;
528
+  z-index: 2;
529
+}
530
+.simditor .simditor-popover .settings-field {
531
+  margin: 0 0 5px 0;
532
+  font-size: 12px;
533
+  height: 25px;
534
+  line-height: 25px;
535
+}
536
+.simditor .simditor-popover .settings-field label {
537
+  display: inline-block;
538
+  margin: 0 5px 0 0;
539
+}
540
+.simditor .simditor-popover .settings-field input[type=text] {
541
+  display: inline-block;
542
+  width: 200px;
543
+  box-sizing: border-box;
544
+  font-size: 12px;
545
+}
546
+.simditor .simditor-popover .settings-field input[type=text].image-size {
547
+  width: 83px;
548
+}
549
+.simditor .simditor-popover .settings-field .times {
550
+  display: inline-block;
551
+  width: 26px;
552
+  font-size: 12px;
553
+  text-align: center;
554
+}
555
+.simditor .simditor-popover.link-popover .btn-unlink, .simditor .simditor-popover.image-popover .btn-upload, .simditor .simditor-popover.image-popover .btn-restore {
556
+  display: inline-block;
557
+  margin: 0 0 0 5px;
558
+  color: #333333;
559
+  font-size: 14px;
560
+  outline: 0;
561
+}
562
+.simditor .simditor-popover.link-popover .btn-unlink span, .simditor .simditor-popover.image-popover .btn-upload span, .simditor .simditor-popover.image-popover .btn-restore span {
563
+  opacity: 0.6;
564
+}
565
+.simditor .simditor-popover.link-popover .btn-unlink:hover span, .simditor .simditor-popover.image-popover .btn-upload:hover span, .simditor .simditor-popover.image-popover .btn-restore:hover span {
566
+  opacity: 1;
567
+}
568
+.simditor .simditor-popover.image-popover .btn-upload {
569
+  position: relative;
570
+  display: inline-block;
571
+  overflow: hidden;
572
+  vertical-align: middle;
573
+}
574
+.simditor .simditor-popover.image-popover .btn-upload input[type=file] {
575
+  position: absolute;
576
+  right: 0px;
577
+  top: 0px;
578
+  opacity: 0;
579
+  height: 100%;
580
+  width: 28px;
581
+}
582
+.simditor.simditor-mobile .simditor-wrapper.toolbar-floating .simditor-toolbar {
583
+  position: absolute;
584
+  top: 0;
585
+  z-index: 10;
586
+  box-shadow: 0 0 6px rgba(0, 0, 0, 0.1);
587
+}
588
+
589
+.simditor .simditor-body, .editor-style {
590
+  font-size: 16px;
591
+  font-family: arial, sans-serif;
592
+  line-height: 1.6;
593
+  color: #333;
594
+  outline: none;
595
+  word-wrap: break-word;
596
+}
597
+.simditor .simditor-body > :first-child, .editor-style > :first-child {
598
+  margin-top: 0 !important;
599
+}
600
+.simditor .simditor-body a, .editor-style a {
601
+  color: #4298BA;
602
+  text-decoration: none;
603
+  word-break: break-all;
604
+}
605
+.simditor .simditor-body a:visited, .editor-style a:visited {
606
+  color: #4298BA;
607
+}
608
+.simditor .simditor-body a:hover, .editor-style a:hover {
609
+  color: #0F769F;
610
+}
611
+.simditor .simditor-body a:active, .editor-style a:active {
612
+  color: #9E792E;
613
+}
614
+.simditor .simditor-body a:hover, .simditor .simditor-body a:active, .editor-style a:hover, .editor-style a:active {
615
+  outline: 0;
616
+}
617
+.simditor .simditor-body h1, .simditor .simditor-body h2, .simditor .simditor-body h3, .simditor .simditor-body h4, .simditor .simditor-body h5, .simditor .simditor-body h6, .editor-style h1, .editor-style h2, .editor-style h3, .editor-style h4, .editor-style h5, .editor-style h6 {
618
+  font-weight: normal;
619
+  margin: 40px 0 20px;
620
+  color: #000000;
621
+}
622
+.simditor .simditor-body h1, .editor-style h1 {
623
+  font-size: 24px;
624
+}
625
+.simditor .simditor-body h2, .editor-style h2 {
626
+  font-size: 22px;
627
+}
628
+.simditor .simditor-body h3, .editor-style h3 {
629
+  font-size: 20px;
630
+}
631
+.simditor .simditor-body h4, .editor-style h4 {
632
+  font-size: 18px;
633
+}
634
+.simditor .simditor-body h5, .editor-style h5 {
635
+  font-size: 16px;
636
+}
637
+.simditor .simditor-body h6, .editor-style h6 {
638
+  font-size: 16px;
639
+}
640
+.simditor .simditor-body p, .simditor .simditor-body div, .editor-style p, .editor-style div {
641
+  word-wrap: break-word;
642
+  margin: 0 0 15px 0;
643
+  color: #333;
644
+  word-wrap: break-word;
645
+}
646
+.simditor .simditor-body b, .simditor .simditor-body strong, .editor-style b, .editor-style strong {
647
+  font-weight: bold;
648
+}
649
+.simditor .simditor-body i, .simditor .simditor-body em, .editor-style i, .editor-style em {
650
+  font-style: italic;
651
+}
652
+.simditor .simditor-body u, .editor-style u {
653
+  text-decoration: underline;
654
+}
655
+.simditor .simditor-body strike, .simditor .simditor-body del, .editor-style strike, .editor-style del {
656
+  text-decoration: line-through;
657
+}
658
+.simditor .simditor-body ul, .simditor .simditor-body ol, .editor-style ul, .editor-style ol {
659
+  list-style: disc outside none;
660
+  margin: 15px 0;
661
+  padding: 0 0 0 40px;
662
+  line-height: 1.6;
663
+}
664
+.simditor .simditor-body ul ul, .simditor .simditor-body ul ol, .simditor .simditor-body ol ul, .simditor .simditor-body ol ol, .editor-style ul ul, .editor-style ul ol, .editor-style ol ul, .editor-style ol ol {
665
+  padding-left: 30px;
666
+}
667
+.simditor .simditor-body ul ul, .simditor .simditor-body ol ul, .editor-style ul ul, .editor-style ol ul {
668
+  list-style: circle outside none;
669
+}
670
+.simditor .simditor-body ul ul ul, .simditor .simditor-body ol ul ul, .editor-style ul ul ul, .editor-style ol ul ul {
671
+  list-style: square outside none;
672
+}
673
+.simditor .simditor-body ol, .editor-style ol {
674
+  list-style: decimal;
675
+}
676
+.simditor .simditor-body blockquote, .editor-style blockquote {
677
+  border-left: 6px solid #ddd;
678
+  padding: 5px 0 5px 10px;
679
+  margin: 15px 0 15px 15px;
680
+}
681
+.simditor .simditor-body blockquote > :first-child, .editor-style blockquote > :first-child {
682
+  margin-top: 0;
683
+}
684
+.simditor .simditor-body code, .editor-style code {
685
+  display: inline-block;
686
+  padding: 0 4px;
687
+  margin: 0 5px;
688
+  background: #eeeeee;
689
+  border-radius: 3px;
690
+  font-size: 13px;
691
+  font-family: 'monaco', 'Consolas', "Liberation Mono", Courier, monospace;
692
+}
693
+.simditor .simditor-body pre, .editor-style pre {
694
+  padding: 10px 5px 10px 10px;
695
+  margin: 15px 0;
696
+  display: block;
697
+  line-height: 18px;
698
+  background: #F0F0F0;
699
+  border-radius: 3px;
700
+  font-size: 13px;
701
+  font-family: 'monaco', 'Consolas', "Liberation Mono", Courier, monospace;
702
+  white-space: pre;
703
+  word-wrap: normal;
704
+  overflow-x: auto;
705
+}
706
+.simditor .simditor-body pre code, .editor-style pre code {
707
+  display: block;
708
+  padding: 0;
709
+  margin: 0;
710
+  background: none;
711
+  border-radius: 0;
712
+}
713
+.simditor .simditor-body hr, .editor-style hr {
714
+  display: block;
715
+  height: 0px;
716
+  border: 0;
717
+  border-top: 1px solid #ccc;
718
+  margin: 15px 0;
719
+  padding: 0;
720
+}
721
+.simditor .simditor-body table, .editor-style table {
722
+  width: 100%;
723
+  table-layout: fixed;
724
+  border-collapse: collapse;
725
+  border-spacing: 0;
726
+  margin: 15px 0;
727
+}
728
+.simditor .simditor-body table thead, .editor-style table thead {
729
+  background-color: #f9f9f9;
730
+}
731
+.simditor .simditor-body table td, .simditor .simditor-body table th, .editor-style table td, .editor-style table th {
732
+  min-width: 40px;
733
+  height: 30px;
734
+  border: 1px solid #ccc;
735
+  vertical-align: top;
736
+  padding: 2px 4px;
737
+  text-align: left;
738
+  box-sizing: border-box;
739
+}
740
+.simditor .simditor-body table td.active, .simditor .simditor-body table th.active, .editor-style table td.active, .editor-style table th.active {
741
+  background-color: #ffffee;
742
+}
743
+.simditor .simditor-body img, .editor-style img {
744
+  margin: 0 5px;
745
+  vertical-align: middle;
746
+}

+ 8 - 0
simditor/static/simditor/styles/simditor.main.min.css

@@ -0,0 +1,8 @@
1
+/*!
2
+* Simditor v2.3.6
3
+* http://simditor.tower.im/
4
+* 2015-12-21
5
+*/@font-face{font-family:'Simditor';src:url(data:application/font-woff;charset=utf-8;base64,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) format("woff");font-weight:normal;font-style:normal}.simditor-icon{display:inline-block;font:normal normal normal 14px/1 'Simditor';font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.simditor-icon-code:before{content:'\f000'}.simditor-icon-bold:before{content:'\f001'}.simditor-icon-italic:before{content:'\f002'}.simditor-icon-underline:before{content:'\f003'}.simditor-icon-times:before{content:'\f004'}.simditor-icon-strikethrough:before{content:'\f005'}.simditor-icon-list-ol:before{content:'\f006'}.simditor-icon-list-ul:before{content:'\f007'}.simditor-icon-quote-left:before{content:'\f008'}.simditor-icon-table:before{content:'\f009'}.simditor-icon-link:before{content:'\f00a'}.simditor-icon-picture-o:before{content:'\f00b'}.simditor-icon-minus:before{content:'\f00c'}.simditor-icon-indent:before{content:'\f00d'}.simditor-icon-outdent:before{content:'\f00e'}.simditor-icon-unlink:before{content:'\f00f'}.simditor-icon-caret-down:before{content:'\f010'}.simditor-icon-caret-right:before{content:'\f011'}.simditor-icon-upload:before{content:'\f012'}.simditor-icon-undo:before{content:'\f013'}.simditor-icon-smile-o:before{content:'\f014'}.simditor-icon-tint:before{content:'\f015'}.simditor-icon-font:before{content:'\f016'}.simditor-icon-html5:before{content:'\f017'}.simditor-icon-mark:before{content:'\f018'}.simditor-icon-align-center:before{content:'\f019'}.simditor-icon-align-left:before{content:'\f01a'}.simditor-icon-align-right:before{content:'\f01b'}.simditor-icon-font-minus:before{content:'\f01c'}.simditor-icon-markdown:before{content:'\f01d'}.simditor-icon-checklist:before{content:'\f01e'}.simditor{position:relative;border:1px solid #c9d8db}.simditor .simditor-wrapper{position:relative;background:#fff}.simditor .simditor-wrapper>textarea{display:none!important;width:100%;box-sizing:border-box;font-family:monaco;font-size:16px;line-height:1.6;border:0;padding:22px 15px 40px;min-height:300px;outline:0;background:transparent;resize:none}.simditor .simditor-wrapper .simditor-placeholder{display:none;position:absolute;left:0;z-index:0;padding:22px 15px;font-size:16px;font-family:arial,sans-serif;line-height:1.5;color:#999;background:transparent}.simditor .simditor-wrapper.toolbar-floating .simditor-toolbar{position:fixed;top:0;z-index:10;box-shadow:0 0 6px rgba(0,0,0,0.1)}.simditor .simditor-wrapper .simditor-image-loading{width:100%;height:100%;position:absolute;top:0;left:0;z-index:2}.simditor .simditor-wrapper .simditor-image-loading .progress{width:100%;height:100%;background:rgba(0,0,0,0.4);position:absolute;bottom:0;left:0}.simditor .simditor-body{padding:22px 15px 40px;min-height:300px;outline:0;cursor:text;position:relative;z-index:1;background:transparent}.simditor .simditor-body a.selected{background:#b3d4fd}.simditor .simditor-body a.simditor-mention{cursor:pointer}.simditor .simditor-body .simditor-table{position:relative}.simditor .simditor-body .simditor-table.resizing{cursor:col-resize}.simditor .simditor-body .simditor-table .simditor-resize-handle{position:absolute;left:0;top:0;width:10px;height:100%;cursor:col-resize}.simditor .simditor-body pre{box-sizing:border-box;-moz-box-sizing:border-box;word-wrap:break-word!important;white-space:pre-wrap!important}.simditor .simditor-body img{cursor:pointer}.simditor .simditor-body img.selected{box-shadow:0 0 0 4px #ccc}.simditor .simditor-paste-bin{position:fixed;bottom:10px;right:10px;width:1px;height:20px;font-size:1px;line-height:1px;overflow:hidden;padding:0;margin:0;opacity:0;-webkit-user-select:text}.simditor .simditor-toolbar{border-bottom:1px solid #eee;background:#fff;width:100%}.simditor .simditor-toolbar>ul{margin:0;padding:0 0 0 6px;list-style:none}.simditor .simditor-toolbar>ul>li{position:relative;display:inline-block;font-size:0}.simditor .simditor-toolbar>ul>li>span.separator{display:inline-block;background:#cfcfcf;width:1px;height:18px;margin:11px 15px;vertical-align:middle}
6
+.simditor .simditor-toolbar>ul>li>.toolbar-item{display:inline-block;width:46px;height:40px;outline:0;color:#333;font-size:15px;line-height:40px;vertical-align:middle;text-align:center;text-decoration:none}.simditor .simditor-toolbar>ul>li>.toolbar-item span{opacity:.6}.simditor .simditor-toolbar>ul>li>.toolbar-item span.simditor-icon{display:inline;line-height:normal}.simditor .simditor-toolbar>ul>li>.toolbar-item:hover span{opacity:1}.simditor .simditor-toolbar>ul>li>.toolbar-item.active{background:#eee}.simditor .simditor-toolbar>ul>li>.toolbar-item.active span{opacity:1}.simditor .simditor-toolbar>ul>li>.toolbar-item.disabled{cursor:default}.simditor .simditor-toolbar>ul>li>.toolbar-item.disabled span{opacity:.3}.simditor .simditor-toolbar>ul>li>.toolbar-item.toolbar-item-title span:before{content:"H";font-size:19px;font-weight:bold;font-family:'Times New Roman'}.simditor .simditor-toolbar>ul>li>.toolbar-item.toolbar-item-title.active-h1 span:before{content:'H1';font-size:18px}.simditor .simditor-toolbar>ul>li>.toolbar-item.toolbar-item-title.active-h2 span:before{content:'H2';font-size:18px}.simditor .simditor-toolbar>ul>li>.toolbar-item.toolbar-item-title.active-h3 span:before{content:'H3';font-size:18px}.simditor .simditor-toolbar>ul>li>.toolbar-item.toolbar-item-image{position:relative;overflow:hidden}.simditor .simditor-toolbar>ul>li>.toolbar-item.toolbar-item-image>input[type=file]{position:absolute;right:0;top:0;opacity:0;font-size:100px;cursor:pointer}.simditor .simditor-toolbar>ul>li.menu-on .toolbar-item{position:relative;z-index:20;background:#fff;box-shadow:0 1px 4px rgba(0,0,0,0.3)}.simditor .simditor-toolbar>ul>li.menu-on .toolbar-item span{opacity:1}.simditor .simditor-toolbar>ul>li.menu-on .toolbar-menu{display:block}.simditor .simditor-toolbar .toolbar-menu{display:none;position:absolute;top:40px;left:0;z-index:21;background:#fff;text-align:left;box-shadow:0 0 4px rgba(0,0,0,0.3)}.simditor .simditor-toolbar .toolbar-menu:before{content:'';display:block;width:46px;height:4px;background:#fff;position:absolute;top:-3px;left:0}.simditor .simditor-toolbar .toolbar-menu ul{min-width:160px;list-style:none;margin:0;padding:10px 1px}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item{display:block;font-size:16px;line-height:2em;padding:0 10px;text-decoration:none;color:#666}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item:hover{background:#f6f6f6}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item.menu-item-h1{font-size:24px;color:#333}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item.menu-item-h2{font-size:22px;color:#333}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item.menu-item-h3{font-size:20px;color:#333}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item.menu-item-h4{font-size:18px;color:#333}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item.menu-item-h5{font-size:16px;color:#333}.simditor .simditor-toolbar .toolbar-menu ul>li .separator{display:block;border-top:1px solid #ccc;height:0;line-height:0;font-size:0;margin:6px 0}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color{width:96px}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list{height:40px;margin:10px 6px 6px 10px;padding:0;min-width:0}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li{float:left;margin:0 4px 4px 0}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color{display:block;width:16px;height:16px;background:#dfdfdf;border-radius:2px}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color:hover{opacity:.8}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color.font-color-default{background:#333}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-1{background:#e33737}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-2{background:#e28b41}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-3{background:#c8a732}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-4{background:#209361}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-5{background:#418caf}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-6{background:#aa8773}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-7{background:#999}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table{background:#fff;padding:1px}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table{border:0;border-collapse:collapse;border-spacing:0;table-layout:fixed}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td{padding:0;cursor:pointer}
7
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td:before{width:16px;height:16px;border:1px solid #fff;background:#f3f3f3;display:block;content:""}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td.selected:before{background:#cfcfcf}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table{display:none}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table ul li{white-space:nowrap}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image{position:relative;overflow:hidden}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image input[type=file]{position:absolute;right:0;top:0;opacity:0;font-size:100px;cursor:pointer}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-alignment{width:100%}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-alignment ul{min-width:100%}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-alignment .menu-item{text-align:center}.simditor .simditor-popover{display:none;padding:5px 8px 0;background:#fff;box-shadow:0 1px 4px rgba(0,0,0,0.4);border-radius:2px;position:absolute;z-index:2}.simditor .simditor-popover .settings-field{margin:0 0 5px 0;font-size:12px;height:25px;line-height:25px}.simditor .simditor-popover .settings-field label{display:inline-block;margin:0 5px 0 0}.simditor .simditor-popover .settings-field input[type=text]{display:inline-block;width:200px;box-sizing:border-box;font-size:12px}.simditor .simditor-popover .settings-field input[type=text].image-size{width:83px}.simditor .simditor-popover .settings-field .times{display:inline-block;width:26px;font-size:12px;text-align:center}.simditor .simditor-popover.link-popover .btn-unlink,.simditor .simditor-popover.image-popover .btn-upload,.simditor .simditor-popover.image-popover .btn-restore{display:inline-block;margin:0 0 0 5px;color:#333;font-size:14px;outline:0}.simditor .simditor-popover.link-popover .btn-unlink span,.simditor .simditor-popover.image-popover .btn-upload span,.simditor .simditor-popover.image-popover .btn-restore span{opacity:.6}.simditor .simditor-popover.link-popover .btn-unlink:hover span,.simditor .simditor-popover.image-popover .btn-upload:hover span,.simditor .simditor-popover.image-popover .btn-restore:hover span{opacity:1}.simditor .simditor-popover.image-popover .btn-upload{position:relative;display:inline-block;overflow:hidden;vertical-align:middle}.simditor .simditor-popover.image-popover .btn-upload input[type=file]{position:absolute;right:0;top:0;opacity:0;height:100%;width:28px}.simditor.simditor-mobile .simditor-wrapper.toolbar-floating .simditor-toolbar{position:absolute;top:0;z-index:10;box-shadow:0 0 6px rgba(0,0,0,0.1)}.simditor .simditor-body,.editor-style{font-size:16px;font-family:arial,sans-serif;line-height:1.6;color:#333;outline:0;word-wrap:break-word}.simditor .simditor-body>:first-child,.editor-style>:first-child{margin-top:0!important}.simditor .simditor-body a,.editor-style a{color:#4298ba;text-decoration:none;word-break:break-all}.simditor .simditor-body a:visited,.editor-style a:visited{color:#4298ba}.simditor .simditor-body a:hover,.editor-style a:hover{color:#0f769f}.simditor .simditor-body a:active,.editor-style a:active{color:#9e792e}.simditor .simditor-body a:hover,.simditor .simditor-body a:active,.editor-style a:hover,.editor-style a:active{outline:0}.simditor .simditor-body h1,.simditor .simditor-body h2,.simditor .simditor-body h3,.simditor .simditor-body h4,.simditor .simditor-body h5,.simditor .simditor-body h6,.editor-style h1,.editor-style h2,.editor-style h3,.editor-style h4,.editor-style h5,.editor-style h6{font-weight:normal;margin:40px 0 20px;color:#000}.simditor .simditor-body h1,.editor-style h1{font-size:24px}.simditor .simditor-body h2,.editor-style h2{font-size:22px}.simditor .simditor-body h3,.editor-style h3{font-size:20px}.simditor .simditor-body h4,.editor-style h4{font-size:18px}.simditor .simditor-body h5,.editor-style h5{font-size:16px}.simditor .simditor-body h6,.editor-style h6{font-size:16px}.simditor .simditor-body p,.simditor .simditor-body div,.editor-style p,.editor-style div{word-wrap:break-word;margin:0 0 15px 0;color:#333;word-wrap:break-word}.simditor .simditor-body b,.simditor .simditor-body strong,.editor-style b,.editor-style strong{font-weight:bold}.simditor .simditor-body i,.simditor .simditor-body em,.editor-style i,.editor-style em{font-style:italic}.simditor .simditor-body u,.editor-style u{text-decoration:underline}.simditor .simditor-body strike,.simditor .simditor-body del,.editor-style strike,.editor-style del{text-decoration:line-through}.simditor .simditor-body ul,.simditor .simditor-body ol,.editor-style ul,.editor-style ol{list-style:disc outside none;margin:15px 0;padding:0 0 0 40px;line-height:1.6}.simditor .simditor-body ul ul,.simditor .simditor-body ul ol,.simditor .simditor-body ol ul,.simditor .simditor-body ol ol,.editor-style ul ul,.editor-style ul ol,.editor-style ol ul,.editor-style ol ol{padding-left:30px}
8
+.simditor .simditor-body ul ul,.simditor .simditor-body ol ul,.editor-style ul ul,.editor-style ol ul{list-style:circle outside none}.simditor .simditor-body ul ul ul,.simditor .simditor-body ol ul ul,.editor-style ul ul ul,.editor-style ol ul ul{list-style:square outside none}.simditor .simditor-body ol,.editor-style ol{list-style:decimal}.simditor .simditor-body blockquote,.editor-style blockquote{border-left:6px solid #ddd;padding:5px 0 5px 10px;margin:15px 0 15px 15px}.simditor .simditor-body blockquote>:first-child,.editor-style blockquote>:first-child{margin-top:0}.simditor .simditor-body code,.editor-style code{display:inline-block;padding:0 4px;margin:0 5px;background:#eee;border-radius:3px;font-size:13px;font-family:'monaco','Consolas',"Liberation Mono",Courier,monospace}.simditor .simditor-body pre,.editor-style pre{padding:10px 5px 10px 10px;margin:15px 0;display:block;line-height:18px;background:#f0f0f0;border-radius:3px;font-size:13px;font-family:'monaco','Consolas',"Liberation Mono",Courier,monospace;white-space:pre;word-wrap:normal;overflow-x:auto}.simditor .simditor-body pre code,.editor-style pre code{display:block;padding:0;margin:0;background:0;border-radius:0}.simditor .simditor-body hr,.editor-style hr{display:block;height:0;border:0;border-top:1px solid #ccc;margin:15px 0;padding:0}.simditor .simditor-body table,.editor-style table{width:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0;margin:15px 0}.simditor .simditor-body table thead,.editor-style table thead{background-color:#f9f9f9}.simditor .simditor-body table td,.simditor .simditor-body table th,.editor-style table td,.editor-style table th{min-width:40px;height:30px;border:1px solid #ccc;vertical-align:top;padding:2px 4px;text-align:left;box-sizing:border-box}.simditor .simditor-body table td.active,.simditor .simditor-body table th.active,.editor-style table td.active,.editor-style table th.active{background-color:#ffe}.simditor .simditor-body img,.editor-style img{margin:0 5px;vertical-align:middle}.simditor .markdown-editor{display:none}.simditor .markdown-editor textarea{display:block;width:100%;min-height:200px;box-sizing:border-box;padding:22px 15px 40px;border:0;border-bottom:1px solid #dfdfdf;resize:none;outline:0;font-size:16px}.simditor.simditor-markdown .markdown-editor{display:block}.simditor.simditor-markdown .simditor-body{min-height:100px;background:#f3f3f3}.simditor.simditor-markdown .simditor-placeholder{display:none!important}.simditor .simditor-toolbar .toolbar-item.toolbar-item-markdown .simditor-icon{font-size:18px}.simditor .simditor-body .simditor-checklist{margin:15px 0;padding:0 0 0 40px;line-height:1.6;list-style-type:none}.simditor .simditor-body .simditor-checklist>li{margin:0;pointer-events:none}.simditor .simditor-body .simditor-checklist>li::before{content:'';pointer-events:all;display:inline-block;margin:0 5px 0 -25px;width:20px;height:20px;cursor:default;vertical-align:middle;background-image:url("data:image/gif;base64,R0lGODlhFAAUAPUAAP///9nZ2XV1dWNjY3Z2dv7+/mpqasbGxsPDw21tbfv7+2RkZM/Pz/X19crKymdnZ+/v725ubsvLy/Hx8XBwcO7u7nd3d83Nzezs7Hp6eoCAgNfX14SEhIqKitLS0uDg4I2NjZSUlNTU1Ojo6NXV1ZaWlp6entjY2J+fn6WlpeXl5ebm5qmpqY6OjvPz85CQkP39/Xt7e/Ly8t3d3dzc3P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAAA1ACwAAAAAFAAUAAAG/8BarVar1Wq1Wq1Wq9VqtVqtVqvVarVarVar1Wq1Wq1Wq9VqtVqtVqvVarVarVar1Wq1Wq1Wq9WAtVpAMBgMBoPBYEAI1Gq1Wq1WKxgOAAAAAAAAAIhEoVar1Wo1xYLRaDQajUaj4XgoarVarVaDACOSyWQymUwmEwkFUqvVarVaxXLBYDAYDAaDuWQqtVqtVqtVNIzNZrPZbDYbBqdSq9VqtVql4wF+Pp/P5/P5eECVWq1Wq9UqIdFoNBqNRqMRqVSp1Wq1Wq1i2kwmk8lkMpmcUJVarVar1SopFQAABAAAAABgxarUarVaraZoOVwul8vlcrkuL0WtVqvVajBHTGYgEAgEAoEg5oDVarVarVaDyWY0Gg1Io9FmMlitVqvVarVarVYoFAqFQqFQq9VqtVqtVqvVarVarVar1Wq1Wq1Wq9VqtVqtVqvVarUasFar1Wq1Wq1Wq9VqtVqtVqvVarVarVar1YIAOw==")}.simditor .simditor-body .simditor-checklist>li[checked]::before{background-image:url("data:image/gif;base64,R0lGODlhFAAUAPYAAAAAAHeHkD9QYB8wSOjo6Haw6C1huLbn8MfY8Ja42I630Ia48NjY2IefoJbH6Ja44H648D9CkCVZsE9XWFWY2D5wqI+foH6gwE9fYHeIoF93iPj4+J7P+J7A4IegyE54sPDw8I+nuB5BmAAHCEdXWC9BiFaAuFdveF2g4F9veB5JoA8PD12Y4GWg4CZRqKbI6GWo4BcoOK7Q8Cc4SDVwwAcPEEdQYA8YIDc/QBYykC1pwD9IWGaY0C8/SE2Q0B84UF6QyFWY4E2Q2D5omAcIGA8gMEZoiEZvkC5ZsE9ZmP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAABKACwAAAAAFAAUAAAH/4BKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKEys4SkpKSkpKSkpKSkpKSkpKShYAIyBKSkpKSkpKIUkRERERERERNwA2SkpKSkpKShslHggICAgICAEANyUbSkpKSkpKGzkoMjIyMjIdKwAVORtKSkpKSkogIhSAOz0ZMjI2ADZBIiBKSkpKSkogKkEaACsJFwArHUEqIEpKSkpKSiAuQSgxAD8xAEMoQS4gSkpKSkpKIEgoMDw1AAADMDAoSCBKSkpKSkogBigFBUcANTwFBS0GIEpKSkpKSiA0MAsLCzNHCwsLLTQgSkpKSkpKICYLHBwcDhwcgJYcHAsmIEpKSkpKShspCgcHBwcHBwcHCikbSkpKSkpKGxYYGBgYGBgYGBgYFhtKSkpKSkpKGyAMDAwMDAwMDCAbSkpKSkpKSkpKShsbGxsbGxsbSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkqASkpKSkpKSkpKSkpKSkpKSkpKSkpKSoEAOw==")}@font-face{font-family:'icomoon';src:url("../fonts/icomoon.eot?4vkjot");src:url("../fonts/icomoon.eot?#iefix4vkjot") format("embedded-opentype"),url("../fonts/icomoon.ttf?4vkjot") format("truetype"),url("../fonts/icomoon.woff?4vkjot") format("woff"),url("../fonts/icomoon.svg?4vkjot#icomoon") format("svg");font-weight:normal;font-style:normal}[class^="icon-"],[class*=" icon-"]{font-family:'icomoon';speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-fullscreen:before{content:"\e600"}.simditor-fullscreen{overflow:hidden}.simditor-fullscreen .simditor{position:fixed;top:0;left:0;z-index:9999;width:100%}.simditor-fullscreen .simditor .simditor-body{overflow:auto}

+ 8 - 0
simditor/static/simditor/styles/simditor.min.css

@@ -0,0 +1,8 @@
1
+/*!
2
+* Simditor v2.3.6
3
+* http://simditor.tower.im/
4
+* 2015-12-21
5
+*/@font-face{font-family:'Simditor';src:url(data:application/font-woff;charset=utf-8;base64,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) format("woff");font-weight:normal;font-style:normal}.simditor-icon{display:inline-block;font:normal normal normal 14px/1 'Simditor';font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.simditor-icon-code:before{content:'\f000'}.simditor-icon-bold:before{content:'\f001'}.simditor-icon-italic:before{content:'\f002'}.simditor-icon-underline:before{content:'\f003'}.simditor-icon-times:before{content:'\f004'}.simditor-icon-strikethrough:before{content:'\f005'}.simditor-icon-list-ol:before{content:'\f006'}.simditor-icon-list-ul:before{content:'\f007'}.simditor-icon-quote-left:before{content:'\f008'}.simditor-icon-table:before{content:'\f009'}.simditor-icon-link:before{content:'\f00a'}.simditor-icon-picture-o:before{content:'\f00b'}.simditor-icon-minus:before{content:'\f00c'}.simditor-icon-indent:before{content:'\f00d'}.simditor-icon-outdent:before{content:'\f00e'}.simditor-icon-unlink:before{content:'\f00f'}.simditor-icon-caret-down:before{content:'\f010'}.simditor-icon-caret-right:before{content:'\f011'}.simditor-icon-upload:before{content:'\f012'}.simditor-icon-undo:before{content:'\f013'}.simditor-icon-smile-o:before{content:'\f014'}.simditor-icon-tint:before{content:'\f015'}.simditor-icon-font:before{content:'\f016'}.simditor-icon-html5:before{content:'\f017'}.simditor-icon-mark:before{content:'\f018'}.simditor-icon-align-center:before{content:'\f019'}.simditor-icon-align-left:before{content:'\f01a'}.simditor-icon-align-right:before{content:'\f01b'}.simditor-icon-font-minus:before{content:'\f01c'}.simditor-icon-markdown:before{content:'\f01d'}.simditor-icon-checklist:before{content:'\f01e'}.simditor{position:relative;border:1px solid #c9d8db}.simditor .simditor-wrapper{position:relative;background:#fff}.simditor .simditor-wrapper>textarea{display:none!important;width:100%;box-sizing:border-box;font-family:monaco;font-size:16px;line-height:1.6;border:0;padding:22px 15px 40px;min-height:300px;outline:0;background:transparent;resize:none}.simditor .simditor-wrapper .simditor-placeholder{display:none;position:absolute;left:0;z-index:0;padding:22px 15px;font-size:16px;font-family:arial,sans-serif;line-height:1.5;color:#999;background:transparent}.simditor .simditor-wrapper.toolbar-floating .simditor-toolbar{position:fixed;top:0;z-index:10;box-shadow:0 0 6px rgba(0,0,0,0.1)}.simditor .simditor-wrapper .simditor-image-loading{width:100%;height:100%;position:absolute;top:0;left:0;z-index:2}.simditor .simditor-wrapper .simditor-image-loading .progress{width:100%;height:100%;background:rgba(0,0,0,0.4);position:absolute;bottom:0;left:0}.simditor .simditor-body{padding:22px 15px 40px;min-height:300px;outline:0;cursor:text;position:relative;z-index:1;background:transparent}.simditor .simditor-body a.selected{background:#b3d4fd}.simditor .simditor-body a.simditor-mention{cursor:pointer}.simditor .simditor-body .simditor-table{position:relative}.simditor .simditor-body .simditor-table.resizing{cursor:col-resize}.simditor .simditor-body .simditor-table .simditor-resize-handle{position:absolute;left:0;top:0;width:10px;height:100%;cursor:col-resize}.simditor .simditor-body pre{box-sizing:border-box;-moz-box-sizing:border-box;word-wrap:break-word!important;white-space:pre-wrap!important}.simditor .simditor-body img{cursor:pointer}.simditor .simditor-body img.selected{box-shadow:0 0 0 4px #ccc}.simditor .simditor-paste-bin{position:fixed;bottom:10px;right:10px;width:1px;height:20px;font-size:1px;line-height:1px;overflow:hidden;padding:0;margin:0;opacity:0;-webkit-user-select:text}.simditor .simditor-toolbar{border-bottom:1px solid #eee;background:#fff;width:100%}.simditor .simditor-toolbar>ul{margin:0;padding:0 0 0 6px;list-style:none}.simditor .simditor-toolbar>ul>li{position:relative;display:inline-block;font-size:0}.simditor .simditor-toolbar>ul>li>span.separator{display:inline-block;background:#cfcfcf;width:1px;height:18px;margin:11px 15px;vertical-align:middle}
6
+.simditor .simditor-toolbar>ul>li>.toolbar-item{display:inline-block;width:46px;height:40px;outline:0;color:#333;font-size:15px;line-height:40px;vertical-align:middle;text-align:center;text-decoration:none}.simditor .simditor-toolbar>ul>li>.toolbar-item span{opacity:.6}.simditor .simditor-toolbar>ul>li>.toolbar-item span.simditor-icon{display:inline;line-height:normal}.simditor .simditor-toolbar>ul>li>.toolbar-item:hover span{opacity:1}.simditor .simditor-toolbar>ul>li>.toolbar-item.active{background:#eee}.simditor .simditor-toolbar>ul>li>.toolbar-item.active span{opacity:1}.simditor .simditor-toolbar>ul>li>.toolbar-item.disabled{cursor:default}.simditor .simditor-toolbar>ul>li>.toolbar-item.disabled span{opacity:.3}.simditor .simditor-toolbar>ul>li>.toolbar-item.toolbar-item-title span:before{content:"H";font-size:19px;font-weight:bold;font-family:'Times New Roman'}.simditor .simditor-toolbar>ul>li>.toolbar-item.toolbar-item-title.active-h1 span:before{content:'H1';font-size:18px}.simditor .simditor-toolbar>ul>li>.toolbar-item.toolbar-item-title.active-h2 span:before{content:'H2';font-size:18px}.simditor .simditor-toolbar>ul>li>.toolbar-item.toolbar-item-title.active-h3 span:before{content:'H3';font-size:18px}.simditor .simditor-toolbar>ul>li>.toolbar-item.toolbar-item-image{position:relative;overflow:hidden}.simditor .simditor-toolbar>ul>li>.toolbar-item.toolbar-item-image>input[type=file]{position:absolute;right:0;top:0;opacity:0;font-size:100px;cursor:pointer}.simditor .simditor-toolbar>ul>li.menu-on .toolbar-item{position:relative;z-index:20;background:#fff;box-shadow:0 1px 4px rgba(0,0,0,0.3)}.simditor .simditor-toolbar>ul>li.menu-on .toolbar-item span{opacity:1}.simditor .simditor-toolbar>ul>li.menu-on .toolbar-menu{display:block}.simditor .simditor-toolbar .toolbar-menu{display:none;position:absolute;top:40px;left:0;z-index:21;background:#fff;text-align:left;box-shadow:0 0 4px rgba(0,0,0,0.3)}.simditor .simditor-toolbar .toolbar-menu:before{content:'';display:block;width:46px;height:4px;background:#fff;position:absolute;top:-3px;left:0}.simditor .simditor-toolbar .toolbar-menu ul{min-width:160px;list-style:none;margin:0;padding:10px 1px}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item{display:block;font-size:16px;line-height:2em;padding:0 10px;text-decoration:none;color:#666}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item:hover{background:#f6f6f6}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item.menu-item-h1{font-size:24px;color:#333}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item.menu-item-h2{font-size:22px;color:#333}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item.menu-item-h3{font-size:20px;color:#333}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item.menu-item-h4{font-size:18px;color:#333}.simditor .simditor-toolbar .toolbar-menu ul>li .menu-item.menu-item-h5{font-size:16px;color:#333}.simditor .simditor-toolbar .toolbar-menu ul>li .separator{display:block;border-top:1px solid #ccc;height:0;line-height:0;font-size:0;margin:6px 0}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color{width:96px}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list{height:40px;margin:10px 6px 6px 10px;padding:0;min-width:0}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li{float:left;margin:0 4px 4px 0}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color{display:block;width:16px;height:16px;background:#dfdfdf;border-radius:2px}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color:hover{opacity:.8}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color.font-color-default{background:#333}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-1{background:#e33737}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-2{background:#e28b41}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-3{background:#c8a732}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-4{background:#209361}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-5{background:#418caf}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-6{background:#aa8773}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-7{background:#999}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table{background:#fff;padding:1px}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table{border:0;border-collapse:collapse;border-spacing:0;table-layout:fixed}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td{padding:0;cursor:pointer}
7
+.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td:before{width:16px;height:16px;border:1px solid #fff;background:#f3f3f3;display:block;content:""}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td.selected:before{background:#cfcfcf}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table{display:none}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table ul li{white-space:nowrap}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image{position:relative;overflow:hidden}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image input[type=file]{position:absolute;right:0;top:0;opacity:0;font-size:100px;cursor:pointer}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-alignment{width:100%}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-alignment ul{min-width:100%}.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-alignment .menu-item{text-align:center}.simditor .simditor-popover{display:none;padding:5px 8px 0;background:#fff;box-shadow:0 1px 4px rgba(0,0,0,0.4);border-radius:2px;position:absolute;z-index:2}.simditor .simditor-popover .settings-field{margin:0 0 5px 0;font-size:12px;height:25px;line-height:25px}.simditor .simditor-popover .settings-field label{display:inline-block;margin:0 5px 0 0}.simditor .simditor-popover .settings-field input[type=text]{display:inline-block;width:200px;box-sizing:border-box;font-size:12px}.simditor .simditor-popover .settings-field input[type=text].image-size{width:83px}.simditor .simditor-popover .settings-field .times{display:inline-block;width:26px;font-size:12px;text-align:center}.simditor .simditor-popover.link-popover .btn-unlink,.simditor .simditor-popover.image-popover .btn-upload,.simditor .simditor-popover.image-popover .btn-restore{display:inline-block;margin:0 0 0 5px;color:#333;font-size:14px;outline:0}.simditor .simditor-popover.link-popover .btn-unlink span,.simditor .simditor-popover.image-popover .btn-upload span,.simditor .simditor-popover.image-popover .btn-restore span{opacity:.6}.simditor .simditor-popover.link-popover .btn-unlink:hover span,.simditor .simditor-popover.image-popover .btn-upload:hover span,.simditor .simditor-popover.image-popover .btn-restore:hover span{opacity:1}.simditor .simditor-popover.image-popover .btn-upload{position:relative;display:inline-block;overflow:hidden;vertical-align:middle}.simditor .simditor-popover.image-popover .btn-upload input[type=file]{position:absolute;right:0;top:0;opacity:0;height:100%;width:28px}.simditor.simditor-mobile .simditor-wrapper.toolbar-floating .simditor-toolbar{position:absolute;top:0;z-index:10;box-shadow:0 0 6px rgba(0,0,0,0.1)}.simditor .simditor-body,.editor-style{font-size:16px;font-family:arial,sans-serif;line-height:1.6;color:#333;outline:0;word-wrap:break-word}.simditor .simditor-body>:first-child,.editor-style>:first-child{margin-top:0!important}.simditor .simditor-body a,.editor-style a{color:#4298ba;text-decoration:none;word-break:break-all}.simditor .simditor-body a:visited,.editor-style a:visited{color:#4298ba}.simditor .simditor-body a:hover,.editor-style a:hover{color:#0f769f}.simditor .simditor-body a:active,.editor-style a:active{color:#9e792e}.simditor .simditor-body a:hover,.simditor .simditor-body a:active,.editor-style a:hover,.editor-style a:active{outline:0}.simditor .simditor-body h1,.simditor .simditor-body h2,.simditor .simditor-body h3,.simditor .simditor-body h4,.simditor .simditor-body h5,.simditor .simditor-body h6,.editor-style h1,.editor-style h2,.editor-style h3,.editor-style h4,.editor-style h5,.editor-style h6{font-weight:normal;margin:40px 0 20px;color:#000}.simditor .simditor-body h1,.editor-style h1{font-size:24px}.simditor .simditor-body h2,.editor-style h2{font-size:22px}.simditor .simditor-body h3,.editor-style h3{font-size:20px}.simditor .simditor-body h4,.editor-style h4{font-size:18px}.simditor .simditor-body h5,.editor-style h5{font-size:16px}.simditor .simditor-body h6,.editor-style h6{font-size:16px}.simditor .simditor-body p,.simditor .simditor-body div,.editor-style p,.editor-style div{word-wrap:break-word;margin:0 0 15px 0;color:#333;word-wrap:break-word}.simditor .simditor-body b,.simditor .simditor-body strong,.editor-style b,.editor-style strong{font-weight:bold}.simditor .simditor-body i,.simditor .simditor-body em,.editor-style i,.editor-style em{font-style:italic}.simditor .simditor-body u,.editor-style u{text-decoration:underline}.simditor .simditor-body strike,.simditor .simditor-body del,.editor-style strike,.editor-style del{text-decoration:line-through}.simditor .simditor-body ul,.simditor .simditor-body ol,.editor-style ul,.editor-style ol{list-style:disc outside none;margin:15px 0;padding:0 0 0 40px;line-height:1.6}.simditor .simditor-body ul ul,.simditor .simditor-body ul ol,.simditor .simditor-body ol ul,.simditor .simditor-body ol ol,.editor-style ul ul,.editor-style ul ol,.editor-style ol ul,.editor-style ol ol{padding-left:30px}
8
+.simditor .simditor-body ul ul,.simditor .simditor-body ol ul,.editor-style ul ul,.editor-style ol ul{list-style:circle outside none}.simditor .simditor-body ul ul ul,.simditor .simditor-body ol ul ul,.editor-style ul ul ul,.editor-style ol ul ul{list-style:square outside none}.simditor .simditor-body ol,.editor-style ol{list-style:decimal}.simditor .simditor-body blockquote,.editor-style blockquote{border-left:6px solid #ddd;padding:5px 0 5px 10px;margin:15px 0 15px 15px}.simditor .simditor-body blockquote>:first-child,.editor-style blockquote>:first-child{margin-top:0}.simditor .simditor-body code,.editor-style code{display:inline-block;padding:0 4px;margin:0 5px;background:#eee;border-radius:3px;font-size:13px;font-family:'monaco','Consolas',"Liberation Mono",Courier,monospace}.simditor .simditor-body pre,.editor-style pre{padding:10px 5px 10px 10px;margin:15px 0;display:block;line-height:18px;background:#f0f0f0;border-radius:3px;font-size:13px;font-family:'monaco','Consolas',"Liberation Mono",Courier,monospace;white-space:pre;word-wrap:normal;overflow-x:auto}.simditor .simditor-body pre code,.editor-style pre code{display:block;padding:0;margin:0;background:0;border-radius:0}.simditor .simditor-body hr,.editor-style hr{display:block;height:0;border:0;border-top:1px solid #ccc;margin:15px 0;padding:0}.simditor .simditor-body table,.editor-style table{width:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0;margin:15px 0}.simditor .simditor-body table thead,.editor-style table thead{background-color:#f9f9f9}.simditor .simditor-body table td,.simditor .simditor-body table th,.editor-style table td,.editor-style table th{min-width:40px;height:30px;border:1px solid #ccc;vertical-align:top;padding:2px 4px;text-align:left;box-sizing:border-box}.simditor .simditor-body table td.active,.simditor .simditor-body table th.active,.editor-style table td.active,.editor-style table th.active{background-color:#ffe}.simditor .simditor-body img,.editor-style img{margin:0 5px;vertical-align:middle}

+ 4 - 0
simditor/static/simditor/styles/simditor.scss

@@ -0,0 +1,4 @@
1
+@charset "UTF-8";
2
+
3
+@import 'fonticon';
4
+@import 'editor';

+ 3 - 0
simditor/templates/simditor/widget.html

@@ -0,0 +1,3 @@
1
+<div class="django-simditor-widget" data-field-id="{{id}}" style="display: inline-block;">
2
+    <textarea{{ final_attrs|safe }} data-processed="0" data-config='{{config|safe}}' data-id="{{id}}" data-type="simditortype">{{ value }}</textarea>
3
+</div>

+ 39 - 0
simditor/urls.py

@@ -0,0 +1,39 @@
1
+"""simditor urls."""
2
+from __future__ import absolute_import
3
+
4
+import django
5
+
6
+from django.conf import settings
7
+from django.conf.urls import url, static
8
+from django.contrib.admin.views.decorators import staff_member_required
9
+
10
+from . import views
11
+
12
+if django.VERSION >= (2, 0):
13
+    # pylint disable=C0103
14
+    from django.urls import path
15
+    urlpatterns = [
16
+        path('upload/', staff_member_required(views.UPLOAD),
17
+             name='simditor_upload'),
18
+    ]
19
+elif django.VERSION >= (1, 8):
20
+    # pylint disable=C0103
21
+    urlpatterns = [
22
+        url(r'^upload/', staff_member_required(views.UPLOAD),
23
+            name='simditor_upload'),
24
+    ]
25
+else:
26
+    from django.conf.urls import patterns    # pylint disable=C0411
27
+
28
+    # pylint disable=C0103
29
+    urlpatterns = patterns(
30
+        '',
31
+        url(r'^upload/', staff_member_required(views.UPLOAD),
32
+            name='simditor_upload'),
33
+    )
34
+
35
+if settings.DEBUG:
36
+    urlpatterns += static.static(settings.MEDIA_URL,
37
+                                 document_root=settings.MEDIA_ROOT)
38
+    urlpatterns += static.static(settings.STATIC_URL,
39
+                                 document_root=settings.STATIC_ROOT)

+ 46 - 0
simditor/utils.py

@@ -0,0 +1,46 @@
1
+"""simditor utils."""
2
+from __future__ import absolute_import
3
+
4
+import os.path
5
+import random
6
+
7
+import string
8
+
9
+from django.core.files.storage import default_storage
10
+from django.template.defaultfilters import slugify
11
+
12
+
13
+class NotAnImageException(Exception):
14
+    pass
15
+
16
+
17
+def get_random_string():
18
+    """Get random string."""
19
+    return ''.join(random.sample(string.ascii_lowercase * 6, 6))
20
+
21
+
22
+def get_slugified_name(filename):
23
+    """get_slugified_name."""
24
+    slugified = slugify(filename)
25
+    return slugified or get_random_string()
26
+
27
+
28
+def slugify_filename(filename):
29
+    """ Slugify filename """
30
+    name, ext = os.path.splitext(filename)
31
+    slugified = get_slugified_name(name)
32
+    return slugified + ext
33
+
34
+
35
+def get_media_url(path):
36
+    """
37
+    Determine system file's media URL.
38
+    """
39
+    return default_storage.url(path)
40
+
41
+
42
+def is_valid_image_extension(file_path):
43
+    """is_valid_image_extension."""
44
+    valid_extensions = ['.jpeg', '.jpg', '.gif', '.png']
45
+    _, extension = os.path.splitext(file_path)
46
+    return extension.lower() in valid_extensions

+ 84 - 0
simditor/views.py

@@ -0,0 +1,84 @@
1
+"""simditor views."""
2
+from __future__ import absolute_import
3
+
4
+import os
5
+from datetime import datetime
6
+
7
+from django.conf import settings
8
+from django.core.files.storage import default_storage
9
+
10
+from django.http import JsonResponse
11
+
12
+from django.views import generic
13
+from django.views.decorators.csrf import csrf_exempt
14
+
15
+from . import utils, image_processing
16
+
17
+
18
+def get_upload_filename(upload_name):
19
+    # Generate date based path to put uploaded file.
20
+    date_path = datetime.now().strftime('%Y/%m/%d')
21
+
22
+    # Complete upload path (upload_path + date_path).
23
+    upload_path = os.path.join(settings.SIMDITOR_UPLOAD_PATH, date_path)
24
+
25
+    if getattr(settings, 'SIMDITOR_UPLOAD_SLUGIFY_FILENAME', True):
26
+        upload_name = utils.slugify_filename(upload_name)
27
+
28
+    return default_storage.get_available_name(os.path.join(upload_path, upload_name))
29
+
30
+
31
+def upload_handler(request):
32
+    files = request.FILES
33
+
34
+    upload_config = settings.SIMDITOR_CONFIGS.get(
35
+        'upload', {'fileKey': 'upload'})
36
+    filekey = upload_config.get('fileKey', 'upload')
37
+
38
+    uploaded_file = files.get(filekey)
39
+
40
+    if not uploaded_file:
41
+        retdata = {'file_path': '', 'success': False,
42
+                   'msg': '图片上传失败,无法获取到图片对象!'}
43
+        return JsonResponse(retdata)
44
+
45
+    image_size = upload_config.get('image_size')
46
+    if image_size and uploaded_file.size > image_size:
47
+        retdata = {'file_path': '', 'success': False,
48
+                   'msg': '上传失败,已超出图片最大限制!'}
49
+        return JsonResponse(retdata)
50
+
51
+    backend = image_processing.get_backend()
52
+
53
+    if not getattr(settings, 'SIMDITOR_ALLOW_NONIMAGE_FILES', True):
54
+        try:
55
+            backend.image_verify(uploaded_file)
56
+        except utils.NotAnImageException:
57
+            retdata = {'file_path': '', 'success': False,
58
+                       'msg': '图片格式错误!'}
59
+            return JsonResponse(retdata)
60
+
61
+    filename = get_upload_filename(uploaded_file.name)
62
+    saved_path = default_storage.save(filename, uploaded_file)
63
+
64
+    url = utils.get_media_url(saved_path)
65
+
66
+    is_api = settings.SIMDITOR_CONFIGS.get('is_api', False)
67
+    url = request.META.get('HTTP_ORIGIN') + url if is_api else url
68
+
69
+    retdata = {'file_path': url, 'success': True, 'msg': '上传成功!'}
70
+
71
+    return JsonResponse(retdata)
72
+
73
+
74
+class ImageUploadView(generic.View):
75
+    """ImageUploadView."""
76
+
77
+    http_method_names = ['post']
78
+
79
+    def post(self, request, **kwargs):
80
+        """Post."""
81
+        return upload_handler(request)
82
+
83
+
84
+UPLOAD = csrf_exempt(ImageUploadView.as_view())

+ 170 - 0
simditor/widgets.py

@@ -0,0 +1,170 @@
1
+"""simditor widgets."""
2
+from __future__ import absolute_import
3
+
4
+from django import forms
5
+from django.conf import settings
6
+from django.core.exceptions import ImproperlyConfigured
7
+from django.core.serializers.json import DjangoJSONEncoder
8
+
9
+from django.template.loader import render_to_string
10
+from django.utils.encoding import force_text
11
+from django.utils.safestring import mark_safe
12
+from django.utils.html import conditional_escape
13
+from django.utils.functional import Promise
14
+
15
+try:
16
+    # Django >=2.1
17
+    from django.forms.widgets import get_default_renderer
18
+    IS_NEW_WIDGET = True
19
+except ImportError:
20
+    IS_NEW_WIDGET = False
21
+
22
+try:
23
+    # Django >=1.7
24
+    from django.forms.utils import flatatt
25
+except ImportError:
26
+    # Django <1.7
27
+    from django.forms.util import flatatt        # pylint disable=E0611, E0401
28
+
29
+
30
+class LazyEncoder(DjangoJSONEncoder):
31
+    """LazyEncoder."""
32
+
33
+    # pylint disable=E0202
34
+    def default(self, obj):
35
+        if isinstance(obj, Promise):
36
+            return force_text(obj)
37
+        return super(LazyEncoder, self).default(obj)
38
+
39
+
40
+JSON_ENCODE = LazyEncoder().encode
41
+
42
+
43
+FULL_TOOLBAR = [
44
+    'title', 'bold', 'italic', 'underline', 'strikethrough', 'fontScale',
45
+    'color', '|', 'ol', 'ul', 'blockquote', 'code', 'table', '|', 'link',
46
+    'image', 'hr', '|', 'indent', 'outdent', 'alignment', 'checklist',
47
+    'markdown', 'fullscreen'
48
+]
49
+
50
+DEFAULT_TOOLBAR = [
51
+    'title', 'bold', 'italic', 'underline', 'strikethrough', 'fontScale',
52
+    'color', '|', 'ol', 'ul', 'blockquote', 'table', '|', 'link',
53
+    'image', 'hr', '|', 'indent', 'outdent', 'alignment'
54
+]
55
+
56
+DEFAULT_CONFIG = {
57
+    'toolbar': DEFAULT_TOOLBAR,
58
+    'cleanPaste': True,
59
+    'tabIndent': True,
60
+    'pasteImage': True,
61
+    'upload': {
62
+        'url': '/',
63
+        'fileKey': 'file'
64
+    }
65
+}
66
+
67
+
68
+class SimditorWidget(forms.Textarea):
69
+    """
70
+    Widget providing Simditor for Rich Text Editing.abs
71
+    Supports direct image uploads and embed.
72
+    """
73
+    class Media:
74
+        """Media."""
75
+
76
+        css_list = [
77
+            'simditor/styles/simditor.min.css'
78
+        ]
79
+
80
+        if 'emoji' in settings.SIMDITOR_TOOLBAR:
81
+            css_list.append('simditor/styles/simditor-emoji.css')
82
+
83
+        if 'fullscreen' in settings.SIMDITOR_TOOLBAR:
84
+            css_list.append('simditor/styles/simditor-fullscreen.min.css')
85
+
86
+        if 'checklist' in settings.SIMDITOR_TOOLBAR:
87
+            css_list.append('simditor/styles/simditor-checklist.min.css')
88
+
89
+        if 'markdown' in settings.SIMDITOR_TOOLBAR:
90
+            css_list.append('simditor/styles/simditor-markdown.min.css')
91
+
92
+        css = {'all': tuple(settings.STATIC_URL + url for url in css_list)}
93
+
94
+        jquery_list = ['simditor/scripts/jquery.min.js',
95
+                       'simditor/scripts/module.min.js',
96
+                       'simditor/scripts/hotkeys.min.js',
97
+                       'simditor/scripts/uploader.min.js',
98
+                       'simditor/scripts/simditor.min.js']
99
+
100
+        if 'fullscreen' in settings.SIMDITOR_TOOLBAR:
101
+            jquery_list.append('simditor/scripts/simditor-fullscreen.min.js')
102
+
103
+        if 'checklist' in settings.SIMDITOR_TOOLBAR:
104
+            jquery_list.append('simditor/scripts/simditor-checklist.min.js')
105
+
106
+        if 'markdown' in settings.SIMDITOR_TOOLBAR:
107
+            jquery_list.append('simditor/scripts/marked.min.js')
108
+            jquery_list.append('simditor/scripts/to-markdown.min.js')
109
+            jquery_list.append('simditor/scripts/simditor-markdown.min.js')
110
+
111
+        if 'image' in settings.SIMDITOR_TOOLBAR:
112
+            jquery_list.append('simditor/scripts/simditor-dropzone.min.js')
113
+
114
+        if 'emoji' in settings.SIMDITOR_TOOLBAR:
115
+            jquery_list.append('simditor/scripts/simditor-emoji.js')
116
+
117
+        js = tuple(settings.STATIC_URL + url for url in jquery_list)
118
+
119
+        try:
120
+
121
+            js += (settings.STATIC_URL + 'simditor/simditor-init.js',)
122
+        except AttributeError:
123
+            raise ImproperlyConfigured("django-simditor requires \
124
+                     SIMDITOR_MEDIA_PREFIX setting. This setting specifies a \
125
+                    URL prefix to the ckeditor JS and CSS media (not \
126
+                    uploaded media). Make sure to use a trailing slash: \
127
+                    SIMDITOR_MEDIA_PREFIX = '/media/simditor/'")
128
+
129
+    def __init__(self, *args, **kwargs):
130
+        super(SimditorWidget, self).__init__(*args, **kwargs)
131
+        # Setup config from defaults.
132
+        self.config = DEFAULT_CONFIG.copy()
133
+
134
+        # Try to get valid config from settings.
135
+        configs = getattr(settings, 'SIMDITOR_CONFIGS', None)
136
+        if configs:
137
+            if isinstance(configs, dict):
138
+                self.config.update(configs)
139
+            else:
140
+                raise ImproperlyConfigured(
141
+                    'SIMDITOR_CONFIGS setting must be a dictionary type.')
142
+
143
+    def build_attrs(self, base_attrs, extra_attrs=None, **kwargs):
144
+        """
145
+        Helper function for building an attribute dictionary.
146
+        This is combination of the same method from Django<=1.10 and Django1.11
147
+        """
148
+        attrs = dict(base_attrs, **kwargs)
149
+        if extra_attrs:
150
+            attrs.update(extra_attrs)
151
+        return attrs
152
+
153
+    def render(self, name, value, attrs=None, renderer=None):
154
+        if value is None:
155
+            value = ''
156
+        final_attrs = self.build_attrs(self.attrs, attrs, name=name)
157
+
158
+        params = ('simditor/widget.html', {
159
+            'final_attrs': flatatt(final_attrs),
160
+            'value': conditional_escape(force_text(value)),
161
+            'id': final_attrs['id'],
162
+            'config': JSON_ENCODE(self.config)
163
+        })
164
+
165
+        if renderer is None and IS_NEW_WIDGET:
166
+            renderer = get_default_renderer()
167
+
168
+        data = renderer.render(*params) if IS_NEW_WIDGET else render_to_string(*params)
169
+
170
+        return mark_safe(data)

サインイン - Gogs: Go Git Service

サインイン