defaultfilter.js 7.8 KB
Newer Older
C
campaign 已提交
1
///import core
C
campaign 已提交
2 3
///plugin 编辑器默认的过滤转换机制

C
campaign 已提交
4
UE.plugins['defaultfilter'] = function () {
C
campaign 已提交
5
    var me = this;
C
campaign 已提交
6
    me.setOpt('allowDivTransToP',true);
C
campaign 已提交
7 8 9
    //默认的过滤处理
    //进入编辑器的内容处理
    me.addInputRule(function (root) {
C
campaign 已提交
10
        var allowDivTransToP = this.options.allowDivTransToP;
C
campaign 已提交
11 12 13 14
        var val;
        //进行默认的处理
        root.traversal(function (node) {
            if (node.type == 'element') {
C
campaign 已提交
15
                if (!dtd.$cdata[node.tagName] && me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) {
C
campaign 已提交
16 17 18 19 20 21
                    if (!node.firstChild()) node.parentNode.removeChild(node);
                    else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) {
                        node.parentNode.removeChild(node, true)
                    }
                    return;
                }
C
campaign 已提交
22 23 24 25 26 27 28 29 30 31 32 33 34
                switch (node.tagName) {
                    case 'style':
                    case 'script':
                        node.setAttr({
                            cdata_tag: node.tagName,
                            cdata_data: encodeURIComponent(node.innerText() || '')
                        });
                        node.tagName = 'div';
                        node.removeChild(node.firstChild());
                        break;
                    case 'a':
                        if (val = node.getAttr('href')) {
                            node.setAttr('_href', val)
C
campaign 已提交
35
                        }
C
campaign 已提交
36 37 38 39 40 41 42
                        break;
                    case 'img':
                        //todo base64暂时去掉,后边做远程图片上传后,干掉这个
                        if (val = node.getAttr('src')) {
                            if (/^data:/.test(val)) {
                                node.parentNode.removeChild(node);
                                break;
C
campaign 已提交
43
                            }
C
campaign 已提交
44
                        }
C
campaign 已提交
45 46 47 48 49 50
                        node.setAttr('_src', node.getAttr('src'));
                        break;
                    case 'span':
                        if (browser.webkit && (val = node.getStyle('white-space'))) {
                            if (/nowrap|normal/.test(val)) {
                                node.setStyle('white-space', '');
C
campaign 已提交
51
                                if (me.options.autoClearEmptyNode && utils.isEmptyObject(node.attrs)) {
C
campaign 已提交
52 53 54 55 56
                                    node.parentNode.removeChild(node, true)
                                }
                            }
                        }
                        break;
C
campaign 已提交
57
                    case 'p':
C
campaign 已提交
58 59 60 61
                        if (val = node.getAttr('align')) {
                            node.setAttr('align');
                            node.setStyle('text-align', val)
                        }
C
campaign 已提交
62
                        var cssStyle = node.getAttr('style');
C
campaign 已提交
63 64 65
                        if (cssStyle) {
                            cssStyle = cssStyle.replace(/(margin|padding)[^;]+/g, '');
                            node.setAttr('style', cssStyle)
C
campaign 已提交
66 67

                        }
C
campaign 已提交
68
                        if (!node.firstChild()) {
C
campaign 已提交
69 70 71 72
                            node.innerHTML(UE.browser.ie ? '&nbsp;' : '<br>')
                        }
                        break;
                    case 'div':
C
campaign 已提交
73 74 75
                        if(node.getAttr('cdata_tag')){
                            break;
                        }
C
campaign 已提交
76 77 78 79 80
                        //针对代码这里不处理插入代码的div
                        val = node.getAttr('class');
                        if(val && /^line number\d+/.test(val)){
                            break;
                        }
C
campaign 已提交
81 82 83
                        if(!allowDivTransToP){
                            break;
                        }
C
campaign 已提交
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
                        var tmpNode, p = UE.uNode.createElement('p');
                        while (tmpNode = node.firstChild()) {
                            if (tmpNode.type == 'text' || !UE.dom.dtd.$block[tmpNode.tagName]) {
                                p.appendChild(tmpNode);
                            } else {
                                if (p.firstChild()) {
                                    node.parentNode.insertBefore(p, node);
                                    p = UE.uNode.createElement('p');
                                } else {
                                    node.parentNode.insertBefore(tmpNode, node);
                                }
                            }
                        }
                        if (p.firstChild()) {
                            node.parentNode.insertBefore(p, node);
                        }
                        node.parentNode.removeChild(node);
                        break;
                    case 'dl':
                        node.tagName = 'ul';
                        break;
                    case 'dt':
                    case 'dd':
                        node.tagName = 'li';
                        break;
                    case 'li':
                        var className = node.getAttr('class');
                        if (!className || !/list\-/.test(className)) {
                            node.setAttr()
                        }
                        var tmpNodes = node.getNodesByTagName('ol ul');
C
campaign 已提交
115 116
                        UE.utils.each(tmpNodes, function (n) {
                            node.parentNode.insertAfter(n, node);
C
campaign 已提交
117
                        });
C
campaign 已提交
118 119 120 121
                        break;
                    case 'td':
                    case 'th':
                    case 'caption':
C
campaign 已提交
122
                        if(!node.children || !node.children.length){
C
campaign 已提交
123 124 125

                            node.appendChild(browser.ie ? UE.uNode.createText(' ') : UE.uNode.createElement('br'))
                        }
C
campaign 已提交
126 127 128
                }

            }
C
campaign 已提交
129 130 131
            if(node.type == 'comment'){
                node.parentNode.removeChild(node);
            }
C
campaign 已提交
132 133
        })

C
campaign 已提交
134 135 136 137 138
    });

    //从编辑器出去的内容处理
    me.addOutputRule(function (root) {

C
campaign 已提交
139 140 141
        var val;
        root.traversal(function (node) {
            if (node.type == 'element') {
C
campaign 已提交
142 143

                if (me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) {
C
campaign 已提交
144

C
campaign 已提交
145
                    if (!node.firstChild()) node.parentNode.removeChild(node);
C
campaign 已提交
146
                    else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) {
C
campaign 已提交
147
                        node.parentNode.removeChild(node, true)
C
campaign 已提交
148
                    }
C
campaign 已提交
149
                    return;
C
campaign 已提交
150
                }
C
campaign 已提交
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
                switch (node.tagName) {
                    case 'div':
                        if (val = node.getAttr('cdata_tag')) {
                            node.tagName = val;
                            node.appendChild(UE.uNode.createText(node.getAttr('cdata_data')));
                            node.setAttr({cdata_tag: '', cdata_data: ''});
                        }
                        break;
                    case 'a':
                        if (val = node.getAttr('_href')) {
                            node.setAttr({
                                'href': val,
                                '_href': ''
                            })
                        }
                        break;
                    case 'img':
                        if (val = node.getAttr('_src')) {
                            node.setAttr({
                                'src': node.getAttr('_src'),
                                '_src': ''
                            })
                        }
C
campaign 已提交
174

C
campaign 已提交
175 176 177 178 179
                }
            }

        })

C
campaign 已提交
180

C
campaign 已提交
181 182
    });
};