.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / remark-parse / lib / tokenize / code-indented.js
1 'use strict';
2
3 var repeat = require('repeat-string');
4 var trim = require('trim-trailing-lines');
5
6 module.exports = indentedCode;
7
8 var C_NEWLINE = '\n';
9 var C_TAB = '\t';
10 var C_SPACE = ' ';
11
12 var CODE_INDENT_COUNT = 4;
13 var CODE_INDENT = repeat(C_SPACE, CODE_INDENT_COUNT);
14
15 /* Tokenise indented code. */
16 function indentedCode(eat, value, silent) {
17   var index = -1;
18   var length = value.length;
19   var subvalue = '';
20   var content = '';
21   var subvalueQueue = '';
22   var contentQueue = '';
23   var character;
24   var blankQueue;
25   var indent;
26
27   while (++index < length) {
28     character = value.charAt(index);
29
30     if (indent) {
31       indent = false;
32
33       subvalue += subvalueQueue;
34       content += contentQueue;
35       subvalueQueue = '';
36       contentQueue = '';
37
38       if (character === C_NEWLINE) {
39         subvalueQueue = character;
40         contentQueue = character;
41       } else {
42         subvalue += character;
43         content += character;
44
45         while (++index < length) {
46           character = value.charAt(index);
47
48           if (!character || character === C_NEWLINE) {
49             contentQueue = character;
50             subvalueQueue = character;
51             break;
52           }
53
54           subvalue += character;
55           content += character;
56         }
57       }
58     } else if (
59       character === C_SPACE &&
60       value.charAt(index + 1) === character &&
61       value.charAt(index + 2) === character &&
62       value.charAt(index + 3) === character
63     ) {
64       subvalueQueue += CODE_INDENT;
65       index += 3;
66       indent = true;
67     } else if (character === C_TAB) {
68       subvalueQueue += character;
69       indent = true;
70     } else {
71       blankQueue = '';
72
73       while (character === C_TAB || character === C_SPACE) {
74         blankQueue += character;
75         character = value.charAt(++index);
76       }
77
78       if (character !== C_NEWLINE) {
79         break;
80       }
81
82       subvalueQueue += blankQueue + character;
83       contentQueue += character;
84     }
85   }
86
87   if (content) {
88     if (silent) {
89       return true;
90     }
91
92     return eat(subvalue)({
93       type: 'code',
94       lang: null,
95       value: trim(content)
96     });
97   }
98 }