WIP: Note editing, markdown to html
[oweals/karmaworld.git] / karmaworld / apps / wysihtml5 / static / wysihtml5 / wysihtml-0.4.17 / src / quirks / clean_pasted_html.js
1 /**
2  * Fix most common html formatting misbehaviors of browsers implementation when inserting
3  * content via copy & paste contentEditable
4  *
5  * @author Christopher Blum
6  */
7 wysihtml5.quirks.cleanPastedHTML = (function() {
8
9   var styleToRegex = function (styleStr) {
10     var trimmedStr = wysihtml5.lang.string(styleStr).trim(),
11         escapedStr = trimmedStr.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
12
13     return new RegExp("^((?!^" + escapedStr + "$).)*$", "i");
14   };
15
16   var extendRulesWithStyleExceptions = function (rules, exceptStyles) {
17     var newRules = wysihtml5.lang.object(rules).clone(true),
18         tag, style;
19
20     for (tag in newRules.tags) {
21
22       if (newRules.tags.hasOwnProperty(tag)) {
23         if (newRules.tags[tag].keep_styles) {
24           for (style in newRules.tags[tag].keep_styles) {
25             if (newRules.tags[tag].keep_styles.hasOwnProperty(style)) {
26               if (exceptStyles[style]) {
27                 newRules.tags[tag].keep_styles[style] = styleToRegex(exceptStyles[style]);
28               }
29             }
30           }
31         }
32       }
33     }
34
35     return newRules;
36   };
37
38   var pickRuleset = function(ruleset, html) {
39     var pickedSet, defaultSet;
40
41     if (!ruleset) {
42       return null;
43     }
44
45     for (var i = 0, max = ruleset.length; i < max; i++) {
46       if (!ruleset[i].condition) {
47         defaultSet = ruleset[i].set;
48       }
49       if (ruleset[i].condition && ruleset[i].condition.test(html)) {
50         return ruleset[i].set;
51       }
52     }
53
54     return defaultSet;
55   };
56
57   return function(html, options) {
58     var exceptStyles = {
59           'color': wysihtml5.dom.getStyle("color").from(options.referenceNode),
60           'fontSize': wysihtml5.dom.getStyle("font-size").from(options.referenceNode)
61         },
62         rules = extendRulesWithStyleExceptions(pickRuleset(options.rules, html) || {}, exceptStyles),
63         newHtml;
64
65     newHtml = wysihtml5.dom.parse(html, {
66       "rules": rules,
67       "cleanUp": true, // <span> elements, empty or without attributes, should be removed/replaced with their content
68       "context": options.referenceNode.ownerDocument,
69       "uneditableClass": options.uneditableClass,
70       "clearInternals" : true, // don't paste temprorary selection and other markings
71       "unjoinNbsps" : true
72     });
73
74     return newHtml;
75   };
76
77 })();