mirror of
				https://github.com/fooflington/selfdefined.git
				synced 2025-10-31 14:18:32 +00:00 
			
		
		
		
	
		
			
	
	
		
			49 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			49 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|   | // Process html entity - {, ¯, ", ...
 | ||
|  | 
 | ||
|  | 'use strict'; | ||
|  | 
 | ||
|  | var entities          = require('../common/entities'); | ||
|  | var has               = require('../common/utils').has; | ||
|  | var isValidEntityCode = require('../common/utils').isValidEntityCode; | ||
|  | var fromCodePoint     = require('../common/utils').fromCodePoint; | ||
|  | 
 | ||
|  | 
 | ||
|  | var DIGITAL_RE = /^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i; | ||
|  | var NAMED_RE   = /^&([a-z][a-z0-9]{1,31});/i; | ||
|  | 
 | ||
|  | 
 | ||
|  | module.exports = function entity(state, silent) { | ||
|  |   var ch, code, match, pos = state.pos, max = state.posMax; | ||
|  | 
 | ||
|  |   if (state.src.charCodeAt(pos) !== 0x26/* & */) { return false; } | ||
|  | 
 | ||
|  |   if (pos + 1 < max) { | ||
|  |     ch = state.src.charCodeAt(pos + 1); | ||
|  | 
 | ||
|  |     if (ch === 0x23 /* # */) { | ||
|  |       match = state.src.slice(pos).match(DIGITAL_RE); | ||
|  |       if (match) { | ||
|  |         if (!silent) { | ||
|  |           code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10); | ||
|  |           state.pending += isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD); | ||
|  |         } | ||
|  |         state.pos += match[0].length; | ||
|  |         return true; | ||
|  |       } | ||
|  |     } else { | ||
|  |       match = state.src.slice(pos).match(NAMED_RE); | ||
|  |       if (match) { | ||
|  |         if (has(entities, match[1])) { | ||
|  |           if (!silent) { state.pending += entities[match[1]]; } | ||
|  |           state.pos += match[0].length; | ||
|  |           return true; | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   if (!silent) { state.pending += '&'; } | ||
|  |   state.pos++; | ||
|  |   return true; | ||
|  | }; |