@ -30,13 +30,6 @@ weechat.filter('irclinky', ['$filter', function($filter) {
return text ;
return text ;
}
}
// First, escape entities to prevent escaping issues because it's a bad idea
// to parse/modify HTML with regexes, which we do a couple of lines down...
var entities = { "<" : "<" , ">" : ">" , '"' : '"' , "'" : ''' , "&" : "&" , "/" : '/' } ;
text = text . replace ( /[<>"'&\/]/g , function ( char ) {
return entities [ char ] ;
} ) ;
// This regex in no way matches all IRC channel names (they could also begin with &, + or an
// This regex in no way matches all IRC channel names (they could also begin with &, + or an
// exclamation mark followed by 5 alphanumeric characters, and are bounded in length by 50).
// exclamation mark followed by 5 alphanumeric characters, and are bounded in length by 50).
// However, it matches all *common* IRC channels while trying to minimise false positives.
// However, it matches all *common* IRC channels while trying to minimise false positives.
@ -73,6 +66,15 @@ weechat.filter('DOMfilter', ['$filter', '$sce', function($filter, $sce) {
return text ;
return text ;
}
}
var escape _html = function ( text ) {
// First, escape entities to prevent escaping issues because it's a bad idea
// to parse/modify HTML with regexes, which we do a couple of lines down...
var entities = { "<" : "<" , ">" : ">" , '"' : '"' , "'" : ''' , "&" : "&" , "/" : '/' } ;
return text . replace ( /[<>"'&\/]/g , function ( char ) {
return entities [ char ] ;
} ) ;
} ;
// hacky way to pass extra arguments without using .apply, which
// hacky way to pass extra arguments without using .apply, which
// would require assembling an argument array. PERFORMANCE!!!
// would require assembling an argument array. PERFORMANCE!!!
var extraArgument = ( arguments . length > 2 ) ? arguments [ 2 ] : null ;
var extraArgument = ( arguments . length > 2 ) ? arguments [ 2 ] : null ;
@ -85,8 +87,12 @@ weechat.filter('DOMfilter', ['$filter', '$sce', function($filter, $sce) {
// Recursive DOM-walking function applying the filter to the text nodes
// Recursive DOM-walking function applying the filter to the text nodes
var process = function ( node ) {
var process = function ( node ) {
if ( node . nodeType === 3 ) { // text node
if ( node . nodeType === 3 ) { // text node
var value = filterFunction ( node . nodeValue , extraArgument , thirdArgument ) ;
// apply the filter to *escaped* HTML, and only commit changes if
if ( value !== node . nodeValue ) {
// it changed the escaped value. This is because setting the result
// as innerHTML causes it to be unescaped.
var input = escape _html ( node . nodeValue ) ;
var value = filterFunction ( input , extraArgument , thirdArgument ) ;
if ( value !== input ) {
// we changed something. create a new node to replace the current one
// we changed something. create a new node to replace the current one
// we could also only add its children but that would probably incur
// we could also only add its children but that would probably incur
// more overhead than it would gain us
// more overhead than it would gain us
@ -141,18 +147,6 @@ weechat.filter('getBufferQuickKeys', function () {
} ;
} ;
} ) ;
} ) ;
weechat . filter ( 'escape' , [ '$sanitize' , function ( $sanitize ) {
return function ( text ) {
// manual escaping because ng-sanitize is shit
return text
. replace ( /&/g , "&" )
. replace ( /</g , "<" )
. replace ( />/g , ">" )
. replace ( /"/g , """ )
. replace ( /'/g , "'" ) ;
} ;
} ] ) ;
// Emojifis the string using https://github.com/Ranks/emojione
// Emojifis the string using https://github.com/Ranks/emojione
weechat . filter ( 'emojify' , function ( ) {
weechat . filter ( 'emojify' , function ( ) {
return function ( text , enable _JS _Emoji ) {
return function ( text , enable _JS _Emoji ) {