@@ -15,6 +15,7 @@ var d3 = require('d3');
15
15
16
16
var Lib = require ( '../lib' ) ;
17
17
var xmlnsNamespaces = require ( '../constants/xmlns_namespaces' ) ;
18
+ var stringMappings = require ( '../constants/string_mappings' ) ;
18
19
19
20
// Append SVG
20
21
@@ -67,6 +68,7 @@ exports.convertToTspans = function(_context, _callback) {
67
68
var str = _context . text ( ) ;
68
69
var converted = convertToSVG ( str ) ;
69
70
var that = _context ;
71
+
70
72
// Until we get tex integrated more fully (so it can be used along with non-tex)
71
73
// allow some elements to prohibit it by attaching 'data-notex' to the original
72
74
var tex = ( ! that . attr ( 'data-notex' ) ) && converted . match ( / ( [ ^ $ ] * ) ( [ $ ] + [ ^ $ ] * [ $ ] + ) ( [ ^ $ ] * ) / ) ;
@@ -233,22 +235,48 @@ var PROTOCOLS = ['http:', 'https:', 'mailto:'];
233
235
234
236
var STRIP_TAGS = new RegExp ( '</?(' + Object . keys ( TAG_STYLES ) . join ( '|' ) + ')( [^>]*)?/?>' , 'g' ) ;
235
237
238
+ var ENTITY_TO_UNICODE = Object . keys ( stringMappings . entityToUnicode ) . map ( function ( k ) {
239
+ return {
240
+ regExp : new RegExp ( '&' + k + ';' , 'g' ) ,
241
+ sub : stringMappings . entityToUnicode [ k ]
242
+ } ;
243
+ } ) ;
244
+
245
+ var UNICODE_TO_ENTITY = Object . keys ( stringMappings . unicodeToEntity ) . map ( function ( k ) {
246
+ return {
247
+ regExp : new RegExp ( k , 'g' ) ,
248
+ sub : '&' + stringMappings . unicodeToEntity [ k ] + ';'
249
+ } ;
250
+ } ) ;
251
+
236
252
exports . plainText = function ( _str ) {
237
253
// strip out our pseudo-html so we have a readable
238
254
// version to put into text fields
239
255
return ( _str || '' ) . replace ( STRIP_TAGS , ' ' ) ;
240
256
} ;
241
257
258
+ function replaceFromMapObject ( _str , list ) {
259
+ var out = _str || '' ;
260
+
261
+ for ( var i = 0 ; i < list . length ; i ++ ) {
262
+ var item = list [ i ] ;
263
+ out = out . replace ( item . regExp , item . sub ) ;
264
+ }
265
+
266
+ return out ;
267
+ }
268
+
269
+ function convertEntities ( _str ) {
270
+ return replaceFromMapObject ( _str , ENTITY_TO_UNICODE ) ;
271
+ }
272
+
242
273
function encodeForHTML ( _str ) {
243
- return ( _str || '' ) . replace ( / & / g, '&' )
244
- . replace ( / < / g, '<' )
245
- . replace ( / > / g, '>' )
246
- . replace ( / " / g, '"' )
247
- . replace ( / ' / g, ''' )
248
- . replace ( / \/ / g, '/' ) ;
274
+ return replaceFromMapObject ( _str , UNICODE_TO_ENTITY ) ;
249
275
}
250
276
251
277
function convertToSVG ( _str ) {
278
+ _str = convertEntities ( _str ) ;
279
+
252
280
var result = _str
253
281
. split ( / ( < [ ^ < > ] * > ) / ) . map ( function ( d ) {
254
282
var match = d . match ( / < ( \/ ? ) ( [ ^ > ] * ) \s * ( .* ) > / i) ,
@@ -267,6 +295,7 @@ function convertToSVG(_str) {
267
295
* resurrect it.
268
296
*/
269
297
extraStyle = extra . match ( / ^ s t y l e \s * = \s * " ( [ ^ " ] + ) " \s * / i) ;
298
+
270
299
// anchor and br are the only ones that don't turn into a tspan
271
300
if ( tag === 'a' ) {
272
301
if ( close ) return '</a>' ;
0 commit comments