X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=editor.coffee;h=4805550979a69b215dfc4c6aa99f2ac92751165d;hb=8709cb94761099e91b480781b64323b169130d3a;hp=4de3b8179d8c312fb1e024070b3e9a21c71e0a3a;hpb=a7cff3a244ba086034aed2f284235b6bcb6b7f98;p=peach-html5-editor.git diff --git a/editor.coffee b/editor.coffee index 4de3b81..4805550 100644 --- a/editor.coffee +++ b/editor.coffee @@ -14,3 +14,85 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +# encode text so it can be safely placed inside an html attribute +enc_attr_regex = new RegExp '(&)|(")|(\u00A0)', 'g' +enc_attr = (txt) -> + return txt.replace enc_attr_regex, (match, amp, quote) -> + return '&' if (amp) + return '"' if (quote) + return ' ' + +void_elements = { + area: true + base: true + br: true + col: true + embed: true + hr: true + img: true + input: true + keygen: true + link: true + meta: true + param: true + source: true + track: true + wbr: true +} +dom_to_html = (dom) -> + ret = '' + for el in dom + switch el.type + when wheic_parser.TYPE_TAG + ret += '<' + el.name + attr_keys = [] + for k of el.attrs + attr_keys.unshift k + #attr_keys.sort() + for k in attr_keys + ret += " #{k}" + if el.attrs[k].length > 0 + ret += "=\"#{enc_attr el.attrs[k]}\"" + ret += '>' + unless void_elements[el.name] + if el.children.length + ret += dom_to_html el.children + ret += "" + when wheic_parser.TYPE_TEXT + ret += el.text + when wheic_parser.TYPE_COMMENT + ret += "" + when wheic_parser.TYPE_DOCTYPE + ret += " 0 + ret += " \"#{el.public_identifier}\"" + if el.system_identifier? and el.system_identifier.length > 0 + ret += " \"#{el.system_identifier}\"" + ret += ">\n" + return ret + +wysiwyg = (el, options = {}) -> + opt_fragment = options.fragment ? true + parser_opts = {} + if opt_fragment + parser_opts.fragment = 'body' + editor_instance = { + dom: wheic_parser.parse el.value, parser_opts + iframe: document.createElement('iframe') + load_html: (html) -> + @dom = wheic_parser.parse el.value, parser_opts + } + idoc = editor_instance.iframe.contentDocument + if options.stylesheet # TODO test this + istyle = idoc.createElement 'style' + istyle.setAttribute 'src', options.stylesheet + idoc.head.appendChild istyle + el.parentNode.appendChild editor_instance.iframe + return editor_instance + +window.wheic = { + wysiwyg: wysiwyg + dom_to_html: dom_to_html +} + +# test in browser: wheic(document.getElementsByTagName('textarea')[0])