mirror of
				https://github.com/vector-im/element-web.git
				synced 2025-11-04 02:02:14 +01:00 
			
		
		
		
	Move HtmlUtils to react SDK
This commit is contained in:
		
							parent
							
								
									40b974f22d
								
							
						
					
					
						commit
						a5d00c73b2
					
				
							
								
								
									
										108
									
								
								src/HtmlUtils.js
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								src/HtmlUtils.js
									
									
									
									
									
								
							@ -1,108 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2015 OpenMarket Ltd
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
var React = require('react');
 | 
			
		||||
var sanitizeHtml = require('sanitize-html');
 | 
			
		||||
var highlight = require('highlight.js');
 | 
			
		||||
 | 
			
		||||
var sanitizeHtmlParams = {
 | 
			
		||||
    allowedTags: [
 | 
			
		||||
        'font', // custom to matrix. deliberately no h1/h2 to stop people shouting.
 | 
			
		||||
        'h3', 'h4', 'h5', 'h6', 'blockquote', 'p', 'a', 'ul', 'ol',
 | 
			
		||||
        'nl', 'li', 'b', 'i', 'strong', 'em', 'strike', 'code', 'hr', 'br', 'div',
 | 
			
		||||
        'table', 'thead', 'caption', 'tbody', 'tr', 'th', 'td', 'pre'
 | 
			
		||||
    ],
 | 
			
		||||
    allowedAttributes: {
 | 
			
		||||
        // custom ones first:
 | 
			
		||||
        font: [ 'color' ], // custom to matrix
 | 
			
		||||
        a: [ 'href', 'name', 'target' ], // remote target: custom to matrix
 | 
			
		||||
        // We don't currently allow img itself by default, but this
 | 
			
		||||
        // would make sense if we did
 | 
			
		||||
        img: [ 'src' ],
 | 
			
		||||
    },
 | 
			
		||||
    // Lots of these won't come up by default because we don't allow them
 | 
			
		||||
    selfClosing: [ 'img', 'br', 'hr', 'area', 'base', 'basefont', 'input', 'link', 'meta' ],
 | 
			
		||||
    // URL schemes we permit
 | 
			
		||||
    allowedSchemes: [ 'http', 'https', 'ftp', 'mailto' ],
 | 
			
		||||
    allowedSchemesByTag: {},
 | 
			
		||||
    
 | 
			
		||||
    transformTags: { // custom to matrix
 | 
			
		||||
        // add blank targets to all hyperlinks
 | 
			
		||||
        'a': sanitizeHtml.simpleTransform('a', { target: '_blank'} )
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    bodyToHtml: function(content, searchTerm) {
 | 
			
		||||
        var originalBody = content.body;
 | 
			
		||||
        var body;
 | 
			
		||||
 | 
			
		||||
        if (searchTerm) {
 | 
			
		||||
            var lastOffset = 0;
 | 
			
		||||
            var bodyList = [];
 | 
			
		||||
            var k = 0;
 | 
			
		||||
            var offset;
 | 
			
		||||
 | 
			
		||||
            // XXX: rather than searching for the search term in the body,
 | 
			
		||||
            // we should be looking at the match delimiters returned by the FTS engine
 | 
			
		||||
            if (content.format === "org.matrix.custom.html") {
 | 
			
		||||
 | 
			
		||||
                var safeBody = sanitizeHtml(content.formatted_body, sanitizeHtmlParams);
 | 
			
		||||
                var safeSearchTerm = sanitizeHtml(searchTerm, sanitizeHtmlParams);
 | 
			
		||||
                while ((offset = safeBody.indexOf(safeSearchTerm, lastOffset)) >= 0) {
 | 
			
		||||
                    // FIXME: we need to apply the search highlighting to only the text elements of HTML, which means
 | 
			
		||||
                    // hooking into the sanitizer parser rather than treating it as a string.  Otherwise
 | 
			
		||||
                    // the act of highlighting a <b/> or whatever will break the HTML badly.
 | 
			
		||||
                    bodyList.push(<span key={ k++ } dangerouslySetInnerHTML={{ __html: safeBody.substring(lastOffset, offset) }} />);
 | 
			
		||||
                    bodyList.push(<span key={ k++ } dangerouslySetInnerHTML={{ __html: safeSearchTerm }} className="mx_MessageTile_searchHighlight" />);
 | 
			
		||||
                    lastOffset = offset + safeSearchTerm.length;
 | 
			
		||||
                }
 | 
			
		||||
                bodyList.push(<span className="markdown-body" key={ k++ } dangerouslySetInnerHTML={{ __html: safeBody.substring(lastOffset) }} />);
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                while ((offset = originalBody.indexOf(searchTerm, lastOffset)) >= 0) {
 | 
			
		||||
                    bodyList.push(<span key={ k++ } >{ originalBody.substring(lastOffset, offset) }</span>);
 | 
			
		||||
                    bodyList.push(<span key={ k++ } className="mx_MessageTile_searchHighlight">{ searchTerm }</span>);
 | 
			
		||||
                    lastOffset = offset + searchTerm.length;
 | 
			
		||||
                }
 | 
			
		||||
                bodyList.push(<span key={ k++ }>{ originalBody.substring(lastOffset) }</span>);
 | 
			
		||||
            }
 | 
			
		||||
            body = bodyList;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            if (content.format === "org.matrix.custom.html") {
 | 
			
		||||
                var safeBody = sanitizeHtml(content.formatted_body, sanitizeHtmlParams);
 | 
			
		||||
                body = <span className="markdown-body" dangerouslySetInnerHTML={{ __html: safeBody }} />;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                body = originalBody;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return body;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    highlightDom: function(element) {
 | 
			
		||||
        var blocks = element.getElementsByTagName("code");
 | 
			
		||||
        for (var i = 0; i < blocks.length; i++) {
 | 
			
		||||
            highlight.highlightBlock(blocks[i]);
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user