Cscott has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/134979

Change subject: WIP: for discussion: escape all \n in <pre>
......................................................................

WIP: for discussion: escape all \n in <pre>

Change-Id: I268b7c6e494f07c606d80d4d6892566e48819f68
---
M lib/XMLSerializer.js
M lib/mediawiki.DOMUtils.js
M lib/wts.TagHandlers.js
3 files changed, 23 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/parsoid 
refs/changes/79/134979/1

diff --git a/lib/XMLSerializer.js b/lib/XMLSerializer.js
index a7d2fab..7b98f6c 100644
--- a/lib/XMLSerializer.js
+++ b/lib/XMLSerializer.js
@@ -77,6 +77,15 @@
                default: return '&#' + c.charCodeAt() + ';';
        }
 }
+/**
+ * Protect <pre> from broken browser serializers
+ */
+function _preXmlEncoder(c) {
+       if (c === '\n') {
+               return "<br\n/>";
+       }
+       return _xmlEncoder(c);
+}
 
 function serializeToString(node, options, cb){
        var child;
@@ -120,6 +129,15 @@
                                if(child){
                                        cb(child.data);
                                }
+                       } else if (child && nodeName === 'pre' && 
options.protectPre) {
+                               while (child) {
+                                       if (child.nodeType === TEXT_NODE) {
+                                               
cb(child.data.replace(/[<&\n]/g, _preXmlEncoder));
+                                       } else {
+                                               serializeToString(child, 
options, cb);
+                                       }
+                                       child = child.nextSibling;
+                               }
                        } else {
                                if (child && newlineStrippingElements[localName]
                                                && child.nodeType === TEXT_NODE 
&& /^\n/.test(child.data)) {
diff --git a/lib/mediawiki.DOMUtils.js b/lib/mediawiki.DOMUtils.js
index bda23dd..d7b29cd 100644
--- a/lib/mediawiki.DOMUtils.js
+++ b/lib/mediawiki.DOMUtils.js
@@ -1780,7 +1780,8 @@
        if (!options) {
                options = {
                        smartQuote: true,
-                       innerXML: false
+                       innerXML: false,
+                       protectPre: true
                };
        }
        if (doc.nodeName==='#document') {
diff --git a/lib/wts.TagHandlers.js b/lib/wts.TagHandlers.js
index a421c32..1ba71ab 100644
--- a/lib/wts.TagHandlers.js
+++ b/lib/wts.TagHandlers.js
@@ -872,6 +872,9 @@
        h6: buildHeadingHandler("======"),
        br: {
                handle: function(node, state, cb) {
+                       if (state.inHTMLPre) { // XXX too broad?
+                               return cb('', node);
+                       }
                        if (DU.getDataParsoid( node ).stx === 'html' || 
node.parentNode.nodeName !== 'P') {
                                cb('<br>', node);
                        } else {

-- 
To view, visit https://gerrit.wikimedia.org/r/134979
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I268b7c6e494f07c606d80d4d6892566e48819f68
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: Cscott <canan...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to