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

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

                        }
C
campaign 已提交
66
                        if (!node.firstChild()) {
C
campaign 已提交
67 68 69 70
                            node.innerHTML(UE.browser.ie ? '&nbsp;' : '<br>')
                        }
                        break;
                    case 'div':
C
campaign 已提交
71 72 73 74 75
                        //针对代码这里不处理插入代码的div
                        val = node.getAttr('class');
                        if(val && /^line number\d+/.test(val)){
                            break;
                        }
C
campaign 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
                        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 已提交
107 108
                        UE.utils.each(tmpNodes, function (n) {
                            node.parentNode.insertAfter(n, node);
C
campaign 已提交
109 110 111 112 113 114
                        });
                }

            }
        })

C
campaign 已提交
115 116 117 118 119
    });

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

C
campaign 已提交
120 121 122
        var val;
        root.traversal(function (node) {
            if (node.type == 'element') {
C
campaign 已提交
123 124

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

C
campaign 已提交
126
                    if (!node.firstChild()) node.parentNode.removeChild(node);
C
campaign 已提交
127
                    else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) {
C
campaign 已提交
128
                        node.parentNode.removeChild(node, true)
C
campaign 已提交
129
                    }
C
campaign 已提交
130
                    return;
C
campaign 已提交
131
                }
C
campaign 已提交
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
                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 已提交
160

C
campaign 已提交
161 162
    });
};