summaryrefslogtreecommitdiff
path: root/httemplate/elements/ckeditor/plugins/blockprotect/plugin.js
blob: 61c993a9f679bc6414b047fe6f79c68ef3d46b31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**
 * The "blockprotect" plugin.  Adapted from the "placeholder" plugin.
 */

(function() {
        var delim_o = '{';
        var delim_c = '}';

        var create_block = function(content) {
          // fix nbsp's
          content = content.replace(/ /gi, ' ');
          // escape the content
          var el = document.createElement('SPAN');
          // IE8 compat
          if( typeof(el.textContent) != 'undefined' ) {
            el.textContent = content;
          } else if( typeof(el.innerText) != 'undefined' ) {
            el.innerText = content;
          }
          el.setAttribute('class', 'cke_blockprotect');
          return el.outerHTML;
        };
        var block_writeHtml = function( element ) {
          // to unescape the element contents, write it out as HTML,
          // stick that into a SPAN element, and then extract the text
          // content of that.
          var inner_writer = new CKEDITOR.htmlParser.basicWriter;
          element.writeChildrenHtml(inner_writer);

          var el = document.createElement('SPAN');
          el.innerHTML = inner_writer.getHtml();
          if( typeof(el.textContent) != 'undefined' ) {
            return el.textContent;
          } else if( typeof(el.innerText) != 'undefined' ) {
            return el.innerText;
          }
        };
        var to_protected_html = function(data) {
          var depth = 0;
          var chunk = '';
          var out = '';
          var p = 0; // position in the string
          while( 1 ) {
            // find the next delimiter of either kind
            var i = data.indexOf(delim_o, p);
            var j = data.indexOf(delim_c, p);
            if (i == -1 && j == -1) {
              // then there are no more delimiters
              break;
            } else if ((i < j || j == -1) && i != -1) {
              // next delimiter is an open
              // push everything from current position to 
              // the delimiter
              if ( i > p ) chunk += data.substr(p, i - p);
              p = i + 1;
              if ( depth == 0 ) {
                // start of a protected block
                out += chunk;
                chunk = '';
              }
              chunk += delim_o;
              depth++;
            } else if ((j < i || i == -1) && j != -1) {
              // next delimiter is a close
              if ( j > p ) chunk += data.substr(p, j - p);
              p = j + 1;
              depth--;
              chunk += delim_c
                if ( depth == 0 ) {
                  // end of a protected block
                  out += create_block(chunk);
                  chunk = '';
                } else if ( depth < 0 ) {
                  depth = 0;
                }
            } else {
              // can't happen
            }
          }
          // append any text after the last delimiter
          if ( depth ) {
            out += create_block(data.substr(p));
          } else {
            out += data.substr(p);
          }
          return out;
        };

	CKEDITOR.plugins.add( 'blockprotect', {
		afterInit: function( editor ) {
			CKEDITOR.addCss( '.cke_blockprotect' +
			'{' +
					'background-color: #ffff88;' +
					( CKEDITOR.env.gecko ? 'cursor: default;' : '' ) +
				'}'
                        );
                      
                        // keep these from getting stripped out 
                        editor.filter.allow('span(cke_blockprotect)',
                                            'blockprotect', true);

                        // add filter at the front of toHtml
                        editor.on( 'toHtml',
                          function( evt ) {
                            evt.data.dataValue =
                              to_protected_html(evt.data.dataValue);
                            return evt;
                          },
                          this, null, 0
                        );

                        editor.dataProcessor.htmlFilter.addRules({
                          elements: {
                            span: function( element ) {
                              if ( element.className = 'cke_blockprotect' ) {
                                // defeat HTML escaping
                                var content = block_writeHtml(element);
                                element.writeHtml = function(writer, filter) {
                                  writer.text(content);
                                }
                              }
                            } // span function
                          } // elements
                        });
                }
        }); // plugins.add
}) ();