@@ -154,10 +154,31 @@ function container(pos,elem) {
154154 return div;
155155}
156156
157−function rawHtml(html) {
158− var e = newElement('div');
159− e.innerHTML = html;
160− return e;
157+function rawHtml(elem) {
158+ var html = elem.html;
159+ var args = elem.args;
160+ var guid = elem.guid;
161+
162+ var div = newElement('div');
163+ div.innerHTML = html;
164+ div.style.visibility = "hidden";
165+ document.body.appendChild(div);
166+
167+ for (var i = args.length; i--; ) {
168+ var arg = args[i];
169+ var span = document.getElementById('md-' + guid + '-' + i);
170+ if (arg.isText) {
171+ span.innerHTML = arg;
172+ } else {
173+ span.style.display = 'block';
174+ span.style.width = arg.props.width + 'px';
175+ span.style.height = arg.props.height + 'px';
176+ span.appendChild(render(arg));
177+ }
178+ }
179+ document.body.removeChild(div);
180+ div.style.visibility = 'visible';
181+ return div;
161182}
162183
163184function render(elem) { return setProps(elem.props, makeElement(elem)); }
@@ -168,7 +189,7 @@ function makeElement(e) {
168189 case 'Flow': return flow(elem._0, elem._1);
169190 case 'Container': return container(elem._0, elem._1);
170191 case 'Spacer': return newElement('div');
171− case 'RawHtml': return rawHtml(elem._0);
192+ case 'RawHtml': return rawHtml(elem);
172193 case 'Custom': return elem.render(elem.model);
173194 }
174195}
@@ -184,7 +205,31 @@ function update(node, curr, next) {
184205 switch(nextE.ctor) {
185206 case "Spacer": break;
186207 case "RawHtml":
187− if (nextE._0 !== currE._0) node.innerHTML = nextE._0;
208+ if (nextE.guid !== currE.guid) {
209+ node.parentNode.replaceChild(render(next),node);
210+ return true;
211+ }
212+ var nargs = nextE.args;
213+ var cargs = currE.args;
214+ for (var i = nargs.length; i--; ) {
215+ var narg = nargs[i];
216+ var carg = cargs[i]
217+ if (narg == carg) continue;
218+ var span = document.getElementById('md-' + currE.guid + '-' + i);
219+ if (narg.isElement) {
220+ if (carg.isElement) {
221+ update(span, carg, narg);
222+ } else {
223+ span.style.display = 'block';
224+ var e = render(narg);
225+ span.innerHTML = '';
226+ span.appendChild(e);
227+ }
228+ } else {
229+ span.style.display = 'inline';
230+ span.innerHTML = narg;
231+ }
232+ }
188233 break;
189234 case "Image":
190235 if (nextE._0.ctor === 'Plain') {