mirror of
				https://github.com/fooflington/selfdefined.git
				synced 2025-10-31 14:18:32 +00:00 
			
		
		
		
	
		
			
	
	
		
			118 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			118 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|   | // ~~strike through~~
 | ||
|  | //
 | ||
|  | 'use strict'; | ||
|  | 
 | ||
|  | 
 | ||
|  | // Insert each marker as a separate text token, and add it to delimiter list
 | ||
|  | //
 | ||
|  | module.exports.tokenize = function strikethrough(state, silent) { | ||
|  |   var i, scanned, token, len, ch, | ||
|  |       start = state.pos, | ||
|  |       marker = state.src.charCodeAt(start); | ||
|  | 
 | ||
|  |   if (silent) { return false; } | ||
|  | 
 | ||
|  |   if (marker !== 0x7E/* ~ */) { return false; } | ||
|  | 
 | ||
|  |   scanned = state.scanDelims(state.pos, true); | ||
|  |   len = scanned.length; | ||
|  |   ch = String.fromCharCode(marker); | ||
|  | 
 | ||
|  |   if (len < 2) { return false; } | ||
|  | 
 | ||
|  |   if (len % 2) { | ||
|  |     token         = state.push('text', '', 0); | ||
|  |     token.content = ch; | ||
|  |     len--; | ||
|  |   } | ||
|  | 
 | ||
|  |   for (i = 0; i < len; i += 2) { | ||
|  |     token         = state.push('text', '', 0); | ||
|  |     token.content = ch + ch; | ||
|  | 
 | ||
|  |     state.delimiters.push({ | ||
|  |       marker: marker, | ||
|  |       jump:   i, | ||
|  |       token:  state.tokens.length - 1, | ||
|  |       level:  state.level, | ||
|  |       end:    -1, | ||
|  |       open:   scanned.can_open, | ||
|  |       close:  scanned.can_close | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   state.pos += scanned.length; | ||
|  | 
 | ||
|  |   return true; | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | // Walk through delimiter list and replace text tokens with tags
 | ||
|  | //
 | ||
|  | module.exports.postProcess = function strikethrough(state) { | ||
|  |   var i, j, | ||
|  |       startDelim, | ||
|  |       endDelim, | ||
|  |       token, | ||
|  |       loneMarkers = [], | ||
|  |       delimiters = state.delimiters, | ||
|  |       max = state.delimiters.length; | ||
|  | 
 | ||
|  |   for (i = 0; i < max; i++) { | ||
|  |     startDelim = delimiters[i]; | ||
|  | 
 | ||
|  |     if (startDelim.marker !== 0x7E/* ~ */) { | ||
|  |       continue; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (startDelim.end === -1) { | ||
|  |       continue; | ||
|  |     } | ||
|  | 
 | ||
|  |     endDelim = delimiters[startDelim.end]; | ||
|  | 
 | ||
|  |     token         = state.tokens[startDelim.token]; | ||
|  |     token.type    = 's_open'; | ||
|  |     token.tag     = 's'; | ||
|  |     token.nesting = 1; | ||
|  |     token.markup  = '~~'; | ||
|  |     token.content = ''; | ||
|  | 
 | ||
|  |     token         = state.tokens[endDelim.token]; | ||
|  |     token.type    = 's_close'; | ||
|  |     token.tag     = 's'; | ||
|  |     token.nesting = -1; | ||
|  |     token.markup  = '~~'; | ||
|  |     token.content = ''; | ||
|  | 
 | ||
|  |     if (state.tokens[endDelim.token - 1].type === 'text' && | ||
|  |         state.tokens[endDelim.token - 1].content === '~') { | ||
|  | 
 | ||
|  |       loneMarkers.push(endDelim.token - 1); | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   // If a marker sequence has an odd number of characters, it's splitted
 | ||
|  |   // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the
 | ||
|  |   // start of the sequence.
 | ||
|  |   //
 | ||
|  |   // So, we have to move all those markers after subsequent s_close tags.
 | ||
|  |   //
 | ||
|  |   while (loneMarkers.length) { | ||
|  |     i = loneMarkers.pop(); | ||
|  |     j = i + 1; | ||
|  | 
 | ||
|  |     while (j < state.tokens.length && state.tokens[j].type === 's_close') { | ||
|  |       j++; | ||
|  |     } | ||
|  | 
 | ||
|  |     j--; | ||
|  | 
 | ||
|  |     if (i !== j) { | ||
|  |       token = state.tokens[j]; | ||
|  |       state.tokens[j] = state.tokens[i]; | ||
|  |       state.tokens[i] = token; | ||
|  |     } | ||
|  |   } | ||
|  | }; |