Blame view

node_modules/markdown-it/lib/rules_inline/entity.js 1.4 KB
290144e9   易尊强   第一次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  // 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;
  };