X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=editor.coffee;h=4805550979a69b215dfc4c6aa99f2ac92751165d;hb=8709cb94761099e91b480781b64323b169130d3a;hp=32c1d4df02cacc585e77bde399986d7ef45a8008;hpb=c052fef9484e52df1ac860610ce1620c9a3420c2;p=peach-html5-editor.git diff --git a/editor.coffee b/editor.coffee index 32c1d4d..4805550 100644 --- a/editor.coffee +++ b/editor.coffee @@ -15,9 +15,12 @@ # 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) -> - # FIXME implement - return txt + return txt.replace enc_attr_regex, (match, amp, quote) -> + return '&' if (amp) + return '"' if (quote) + return ' ' void_elements = { area: true @@ -44,12 +47,14 @@ dom_to_html = (dom) -> ret += '<' + el.name attr_keys = [] for k of el.attrs - attr_keys.push k - attr_keys.sort() + attr_keys.unshift k + #attr_keys.sort() for k in attr_keys - ret += " #{k}=\"#{enc_attr el.attrs[k]}\"" + ret += " #{k}" + if el.attrs[k].length > 0 + ret += "=\"#{enc_attr el.attrs[k]}\"" ret += '>' - unless ret.name in void_elements + unless void_elements[el.name] if el.children.length ret += dom_to_html el.children ret += "" @@ -63,16 +68,31 @@ dom_to_html = (dom) -> ret += " \"#{el.public_identifier}\"" if el.system_identifier? and el.system_identifier.length > 0 ret += " \"#{el.system_identifier}\"" + ret += ">\n" return ret -make_wysiwyg = (el, options = {}) -> +wysiwyg = (el, options = {}) -> opt_fragment = options.fragment ? true parser_opts = {} if opt_fragment parser_opts.fragment = 'body' - dom = wheic_parser.parse(el.value, parser_opts) - el.value = dom_to_html dom + 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 = make_wysiwyg +window.wheic = { + wysiwyg: wysiwyg + dom_to_html: dom_to_html +} # test in browser: wheic(document.getElementsByTagName('textarea')[0])