@md2do/core 0.3.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +6 -6
  3. package/dist/index.d.mts +40 -10
  4. package/dist/index.d.ts +40 -10
  5. package/dist/index.js +59 -11
  6. package/dist/index.mjs +61 -12
  7. package/package.json +1 -1
  8. package/src/parser/index.ts +28 -5
  9. package/src/parser/patterns.ts +8 -5
  10. package/src/scanner/index.ts +17 -0
  11. package/src/types/index.ts +4 -0
  12. package/src/utils/dates.ts +58 -10
  13. package/coverage/base.css +0 -224
  14. package/coverage/block-navigation.js +0 -87
  15. package/coverage/coverage-final.json +0 -10
  16. package/coverage/favicon.png +0 -0
  17. package/coverage/index.html +0 -206
  18. package/coverage/lcov-report/base.css +0 -224
  19. package/coverage/lcov-report/block-navigation.js +0 -87
  20. package/coverage/lcov-report/favicon.png +0 -0
  21. package/coverage/lcov-report/index.html +0 -206
  22. package/coverage/lcov-report/prettify.css +0 -1
  23. package/coverage/lcov-report/prettify.js +0 -2
  24. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  25. package/coverage/lcov-report/sorter.js +0 -210
  26. package/coverage/lcov-report/src/filters/index.html +0 -116
  27. package/coverage/lcov-report/src/filters/index.ts.html +0 -1156
  28. package/coverage/lcov-report/src/index.html +0 -116
  29. package/coverage/lcov-report/src/index.ts.html +0 -157
  30. package/coverage/lcov-report/src/parser/index.html +0 -131
  31. package/coverage/lcov-report/src/parser/index.ts.html +0 -1102
  32. package/coverage/lcov-report/src/parser/patterns.ts.html +0 -661
  33. package/coverage/lcov-report/src/scanner/index.html +0 -116
  34. package/coverage/lcov-report/src/scanner/index.ts.html +0 -658
  35. package/coverage/lcov-report/src/sorting/index.html +0 -116
  36. package/coverage/lcov-report/src/sorting/index.ts.html +0 -736
  37. package/coverage/lcov-report/src/utils/dates.ts.html +0 -499
  38. package/coverage/lcov-report/src/utils/id.ts.html +0 -169
  39. package/coverage/lcov-report/src/utils/index.html +0 -131
  40. package/coverage/lcov-report/src/writer/index.html +0 -116
  41. package/coverage/lcov-report/src/writer/index.ts.html +0 -1093
  42. package/coverage/lcov.info +0 -2294
  43. package/coverage/prettify.css +0 -1
  44. package/coverage/prettify.js +0 -2
  45. package/coverage/sort-arrow-sprite.png +0 -0
  46. package/coverage/sorter.js +0 -210
  47. package/coverage/src/filters/index.html +0 -116
  48. package/coverage/src/filters/index.ts.html +0 -1156
  49. package/coverage/src/index.html +0 -116
  50. package/coverage/src/index.ts.html +0 -157
  51. package/coverage/src/parser/index.html +0 -131
  52. package/coverage/src/parser/index.ts.html +0 -1102
  53. package/coverage/src/parser/patterns.ts.html +0 -661
  54. package/coverage/src/scanner/index.html +0 -116
  55. package/coverage/src/scanner/index.ts.html +0 -658
  56. package/coverage/src/sorting/index.html +0 -116
  57. package/coverage/src/sorting/index.ts.html +0 -736
  58. package/coverage/src/utils/dates.ts.html +0 -499
  59. package/coverage/src/utils/id.ts.html +0 -169
  60. package/coverage/src/utils/index.html +0 -131
  61. package/coverage/src/writer/index.html +0 -116
  62. package/coverage/src/writer/index.ts.html +0 -1093
@@ -1,1102 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/parser/index.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">src/parser</a> index.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">100% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>339/339</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">96.05% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>73/76</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>8/8</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>339/339</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line high'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
406
- <span class="cline-any cline-yes">1x</span>
407
- <span class="cline-any cline-yes">1x</span>
408
- <span class="cline-any cline-yes">1x</span>
409
- <span class="cline-any cline-yes">1x</span>
410
- <span class="cline-any cline-yes">1x</span>
411
- <span class="cline-any cline-yes">1x</span>
412
- <span class="cline-any cline-yes">1x</span>
413
- <span class="cline-any cline-yes">1x</span>
414
- <span class="cline-any cline-yes">1x</span>
415
- <span class="cline-any cline-yes">1x</span>
416
- <span class="cline-any cline-yes">1x</span>
417
- <span class="cline-any cline-yes">1x</span>
418
- <span class="cline-any cline-yes">1x</span>
419
- <span class="cline-any cline-yes">1x</span>
420
- <span class="cline-any cline-yes">1x</span>
421
- <span class="cline-any cline-yes">1x</span>
422
- <span class="cline-any cline-yes">1x</span>
423
- <span class="cline-any cline-yes">1x</span>
424
- <span class="cline-any cline-yes">1x</span>
425
- <span class="cline-any cline-yes">1x</span>
426
- <span class="cline-any cline-yes">124x</span>
427
- <span class="cline-any cline-yes">124x</span>
428
- <span class="cline-any cline-yes">124x</span>
429
- <span class="cline-any cline-yes">1x</span>
430
- <span class="cline-any cline-yes">1x</span>
431
- <span class="cline-any cline-yes">1x</span>
432
- <span class="cline-any cline-yes">1x</span>
433
- <span class="cline-any cline-yes">1x</span>
434
- <span class="cline-any cline-yes">1x</span>
435
- <span class="cline-any cline-yes">1x</span>
436
- <span class="cline-any cline-yes">1x</span>
437
- <span class="cline-any cline-yes">1x</span>
438
- <span class="cline-any cline-yes">1x</span>
439
- <span class="cline-any cline-yes">1x</span>
440
- <span class="cline-any cline-yes">1x</span>
441
- <span class="cline-any cline-yes">1x</span>
442
- <span class="cline-any cline-yes">1x</span>
443
- <span class="cline-any cline-yes">125x</span>
444
- <span class="cline-any cline-yes">125x</span>
445
- <span class="cline-any cline-yes">125x</span>
446
- <span class="cline-any cline-yes">108x</span>
447
- <span class="cline-any cline-yes">108x</span>
448
- <span class="cline-any cline-yes">1x</span>
449
- <span class="cline-any cline-yes">1x</span>
450
- <span class="cline-any cline-yes">1x</span>
451
- <span class="cline-any cline-yes">1x</span>
452
- <span class="cline-any cline-yes">1x</span>
453
- <span class="cline-any cline-yes">1x</span>
454
- <span class="cline-any cline-yes">1x</span>
455
- <span class="cline-any cline-yes">1x</span>
456
- <span class="cline-any cline-yes">1x</span>
457
- <span class="cline-any cline-yes">1x</span>
458
- <span class="cline-any cline-yes">1x</span>
459
- <span class="cline-any cline-yes">1x</span>
460
- <span class="cline-any cline-yes">124x</span>
461
- <span class="cline-any cline-yes">124x</span>
462
- <span class="cline-any cline-yes">124x</span>
463
- <span class="cline-any cline-yes">124x</span>
464
- <span class="cline-any cline-yes">124x</span>
465
- <span class="cline-any cline-yes">1x</span>
466
- <span class="cline-any cline-yes">1x</span>
467
- <span class="cline-any cline-yes">1x</span>
468
- <span class="cline-any cline-yes">1x</span>
469
- <span class="cline-any cline-yes">1x</span>
470
- <span class="cline-any cline-yes">1x</span>
471
- <span class="cline-any cline-yes">1x</span>
472
- <span class="cline-any cline-yes">1x</span>
473
- <span class="cline-any cline-yes">1x</span>
474
- <span class="cline-any cline-yes">1x</span>
475
- <span class="cline-any cline-yes">1x</span>
476
- <span class="cline-any cline-yes">123x</span>
477
- <span class="cline-any cline-yes">123x</span>
478
- <span class="cline-any cline-yes">123x</span>
479
- <span class="cline-any cline-yes">1x</span>
480
- <span class="cline-any cline-yes">1x</span>
481
- <span class="cline-any cline-yes">1x</span>
482
- <span class="cline-any cline-yes">1x</span>
483
- <span class="cline-any cline-yes">1x</span>
484
- <span class="cline-any cline-yes">1x</span>
485
- <span class="cline-any cline-yes">1x</span>
486
- <span class="cline-any cline-yes">1x</span>
487
- <span class="cline-any cline-yes">1x</span>
488
- <span class="cline-any cline-yes">1x</span>
489
- <span class="cline-any cline-yes">1x</span>
490
- <span class="cline-any cline-yes">123x</span>
491
- <span class="cline-any cline-yes">123x</span>
492
- <span class="cline-any cline-yes">8x</span>
493
- <span class="cline-any cline-yes">8x</span>
494
- <span class="cline-any cline-yes">115x</span>
495
- <span class="cline-any cline-yes">123x</span>
496
- <span class="cline-any cline-yes">1x</span>
497
- <span class="cline-any cline-yes">1x</span>
498
- <span class="cline-any cline-yes">1x</span>
499
- <span class="cline-any cline-yes">1x</span>
500
- <span class="cline-any cline-yes">1x</span>
501
- <span class="cline-any cline-yes">1x</span>
502
- <span class="cline-any cline-yes">1x</span>
503
- <span class="cline-any cline-yes">1x</span>
504
- <span class="cline-any cline-yes">1x</span>
505
- <span class="cline-any cline-yes">1x</span>
506
- <span class="cline-any cline-yes">1x</span>
507
- <span class="cline-any cline-yes">1x</span>
508
- <span class="cline-any cline-yes">129x</span>
509
- <span class="cline-any cline-yes">129x</span>
510
- <span class="cline-any cline-yes">129x</span>
511
- <span class="cline-any cline-yes">129x</span>
512
- <span class="cline-any cline-yes">129x</span>
513
- <span class="cline-any cline-yes">129x</span>
514
- <span class="cline-any cline-yes">23x</span>
515
- <span class="cline-any cline-yes">23x</span>
516
- <span class="cline-any cline-yes">23x</span>
517
- <span class="cline-any cline-yes">106x</span>
518
- <span class="cline-any cline-yes">106x</span>
519
- <span class="cline-any cline-yes">106x</span>
520
- <span class="cline-any cline-yes">129x</span>
521
- <span class="cline-any cline-yes">5x</span>
522
- <span class="cline-any cline-yes">5x</span>
523
- <span class="cline-any cline-yes">5x</span>
524
- <span class="cline-any cline-yes">101x</span>
525
- <span class="cline-any cline-yes">101x</span>
526
- <span class="cline-any cline-yes">101x</span>
527
- <span class="cline-any cline-yes">129x</span>
528
- <span class="cline-any cline-yes">19x</span>
529
- <span class="cline-any cline-yes">6x</span>
530
- <span class="cline-any cline-yes">6x</span>
531
- <span class="cline-any cline-yes">6x</span>
532
- <span class="cline-any cline-yes">6x</span>
533
- <span class="cline-any cline-yes">6x</span>
534
- <span class="cline-any cline-yes">6x</span>
535
- <span class="cline-any cline-yes">6x</span>
536
- <span class="cline-any cline-yes">6x</span>
537
- <span class="cline-any cline-yes">6x</span>
538
- <span class="cline-any cline-yes">6x</span>
539
- <span class="cline-any cline-yes">6x</span>
540
- <span class="cline-any cline-yes">6x</span>
541
- <span class="cline-any cline-yes">13x</span>
542
- <span class="cline-any cline-yes">13x</span>
543
- <span class="cline-any cline-yes">19x</span>
544
- <span class="cline-any cline-yes">19x</span>
545
- <span class="cline-any cline-yes">82x</span>
546
- <span class="cline-any cline-yes">82x</span>
547
- <span class="cline-any cline-yes">82x</span>
548
- <span class="cline-any cline-yes">1x</span>
549
- <span class="cline-any cline-yes">1x</span>
550
- <span class="cline-any cline-yes">1x</span>
551
- <span class="cline-any cline-yes">1x</span>
552
- <span class="cline-any cline-yes">1x</span>
553
- <span class="cline-any cline-yes">1x</span>
554
- <span class="cline-any cline-yes">1x</span>
555
- <span class="cline-any cline-yes">1x</span>
556
- <span class="cline-any cline-yes">1x</span>
557
- <span class="cline-any cline-yes">1x</span>
558
- <span class="cline-any cline-yes">1x</span>
559
- <span class="cline-any cline-yes">1x</span>
560
- <span class="cline-any cline-yes">1x</span>
561
- <span class="cline-any cline-yes">1x</span>
562
- <span class="cline-any cline-yes">1x</span>
563
- <span class="cline-any cline-yes">1x</span>
564
- <span class="cline-any cline-yes">1x</span>
565
- <span class="cline-any cline-yes">1x</span>
566
- <span class="cline-any cline-yes">1x</span>
567
- <span class="cline-any cline-yes">1x</span>
568
- <span class="cline-any cline-yes">132x</span>
569
- <span class="cline-any cline-yes">132x</span>
570
- <span class="cline-any cline-yes">132x</span>
571
- <span class="cline-any cline-yes">132x</span>
572
- <span class="cline-any cline-yes">132x</span>
573
- <span class="cline-any cline-yes">132x</span>
574
- <span class="cline-any cline-yes">132x</span>
575
- <span class="cline-any cline-yes">132x</span>
576
- <span class="cline-any cline-yes">132x</span>
577
- <span class="cline-any cline-yes">132x</span>
578
- <span class="cline-any cline-yes">132x</span>
579
- <span class="cline-any cline-yes">132x</span>
580
- <span class="cline-any cline-yes">132x</span>
581
- <span class="cline-any cline-yes">132x</span>
582
- <span class="cline-any cline-yes">132x</span>
583
- <span class="cline-any cline-yes">132x</span>
584
- <span class="cline-any cline-yes">132x</span>
585
- <span class="cline-any cline-yes">132x</span>
586
- <span class="cline-any cline-yes">132x</span>
587
- <span class="cline-any cline-yes">132x</span>
588
- <span class="cline-any cline-yes">132x</span>
589
- <span class="cline-any cline-yes">1x</span>
590
- <span class="cline-any cline-yes">1x</span>
591
- <span class="cline-any cline-yes">1x</span>
592
- <span class="cline-any cline-yes">1x</span>
593
- <span class="cline-any cline-yes">1x</span>
594
- <span class="cline-any cline-yes">1x</span>
595
- <span class="cline-any cline-yes">1x</span>
596
- <span class="cline-any cline-yes">1x</span>
597
- <span class="cline-any cline-yes">1x</span>
598
- <span class="cline-any cline-yes">1x</span>
599
- <span class="cline-any cline-yes">1x</span>
600
- <span class="cline-any cline-yes">1x</span>
601
- <span class="cline-any cline-yes">1x</span>
602
- <span class="cline-any cline-yes">1x</span>
603
- <span class="cline-any cline-yes">1x</span>
604
- <span class="cline-any cline-yes">1x</span>
605
- <span class="cline-any cline-yes">1x</span>
606
- <span class="cline-any cline-yes">1x</span>
607
- <span class="cline-any cline-yes">1x</span>
608
- <span class="cline-any cline-yes">145x</span>
609
- <span class="cline-any cline-yes">145x</span>
610
- <span class="cline-any cline-yes">145x</span>
611
- <span class="cline-any cline-yes">145x</span>
612
- <span class="cline-any cline-yes">145x</span>
613
- <span class="cline-any cline-yes">145x</span>
614
- <span class="cline-any cline-yes">145x</span>
615
- <span class="cline-any cline-yes">145x</span>
616
- <span class="cline-any cline-yes">145x</span>
617
- <span class="cline-any cline-yes">145x</span>
618
- <span class="cline-any cline-yes">2x</span>
619
- <span class="cline-any cline-yes">2x</span>
620
- <span class="cline-any cline-yes">2x</span>
621
- <span class="cline-any cline-yes">2x</span>
622
- <span class="cline-any cline-yes">2x</span>
623
- <span class="cline-any cline-yes">2x</span>
624
- <span class="cline-any cline-yes">2x</span>
625
- <span class="cline-any cline-yes">2x</span>
626
- <span class="cline-any cline-yes">2x</span>
627
- <span class="cline-any cline-yes">143x</span>
628
- <span class="cline-any cline-yes">143x</span>
629
- <span class="cline-any cline-yes">145x</span>
630
- <span class="cline-any cline-yes">2x</span>
631
- <span class="cline-any cline-yes">2x</span>
632
- <span class="cline-any cline-yes">2x</span>
633
- <span class="cline-any cline-yes">2x</span>
634
- <span class="cline-any cline-yes">2x</span>
635
- <span class="cline-any cline-yes">2x</span>
636
- <span class="cline-any cline-yes">2x</span>
637
- <span class="cline-any cline-yes">2x</span>
638
- <span class="cline-any cline-yes">2x</span>
639
- <span class="cline-any cline-yes">141x</span>
640
- <span class="cline-any cline-yes">141x</span>
641
- <span class="cline-any cline-yes">145x</span>
642
- <span class="cline-any cline-yes">1x</span>
643
- <span class="cline-any cline-yes">1x</span>
644
- <span class="cline-any cline-yes">1x</span>
645
- <span class="cline-any cline-yes">1x</span>
646
- <span class="cline-any cline-yes">1x</span>
647
- <span class="cline-any cline-yes">1x</span>
648
- <span class="cline-any cline-yes">1x</span>
649
- <span class="cline-any cline-yes">1x</span>
650
- <span class="cline-any cline-yes">140x</span>
651
- <span class="cline-any cline-yes">140x</span>
652
- <span class="cline-any cline-yes">145x</span>
653
- <span class="cline-any cline-yes">1x</span>
654
- <span class="cline-any cline-yes">1x</span>
655
- <span class="cline-any cline-yes">1x</span>
656
- <span class="cline-any cline-yes">1x</span>
657
- <span class="cline-any cline-yes">1x</span>
658
- <span class="cline-any cline-yes">1x</span>
659
- <span class="cline-any cline-yes">1x</span>
660
- <span class="cline-any cline-yes">1x</span>
661
- <span class="cline-any cline-yes">139x</span>
662
- <span class="cline-any cline-yes">139x</span>
663
- <span class="cline-any cline-yes">139x</span>
664
- <span class="cline-any cline-yes">145x</span>
665
- <span class="cline-any cline-yes">20x</span>
666
- <span class="cline-any cline-yes">20x</span>
667
- <span class="cline-any cline-yes">119x</span>
668
- <span class="cline-any cline-yes">119x</span>
669
- <span class="cline-any cline-yes">119x</span>
670
- <span class="cline-any cline-yes">119x</span>
671
- <span class="cline-any cline-yes">119x</span>
672
- <span class="cline-any cline-yes">119x</span>
673
- <span class="cline-any cline-yes">119x</span>
674
- <span class="cline-any cline-yes">119x</span>
675
- <span class="cline-any cline-yes">119x</span>
676
- <span class="cline-any cline-yes">119x</span>
677
- <span class="cline-any cline-yes">119x</span>
678
- <span class="cline-any cline-yes">119x</span>
679
- <span class="cline-any cline-yes">119x</span>
680
- <span class="cline-any cline-yes">119x</span>
681
- <span class="cline-any cline-yes">119x</span>
682
- <span class="cline-any cline-yes">119x</span>
683
- <span class="cline-any cline-yes">145x</span>
684
- <span class="cline-any cline-yes">4x</span>
685
- <span class="cline-any cline-yes">4x</span>
686
- <span class="cline-any cline-yes">4x</span>
687
- <span class="cline-any cline-yes">4x</span>
688
- <span class="cline-any cline-yes">4x</span>
689
- <span class="cline-any cline-yes">4x</span>
690
- <span class="cline-any cline-yes">119x</span>
691
- <span class="cline-any cline-yes">119x</span>
692
- <span class="cline-any cline-yes">119x</span>
693
- <span class="cline-any cline-yes">145x</span>
694
- <span class="cline-any cline-yes">58x</span>
695
- <span class="cline-any cline-yes">58x</span>
696
- <span class="cline-any cline-yes">58x</span>
697
- <span class="cline-any cline-yes">58x</span>
698
- <span class="cline-any cline-yes">58x</span>
699
- <span class="cline-any cline-yes">58x</span>
700
- <span class="cline-any cline-yes">58x</span>
701
- <span class="cline-any cline-yes">58x</span>
702
- <span class="cline-any cline-yes">119x</span>
703
- <span class="cline-any cline-yes">119x</span>
704
- <span class="cline-any cline-yes">145x</span>
705
- <span class="cline-any cline-yes">8x</span>
706
- <span class="cline-any cline-yes">8x</span>
707
- <span class="cline-any cline-yes">8x</span>
708
- <span class="cline-any cline-yes">8x</span>
709
- <span class="cline-any cline-yes">8x</span>
710
- <span class="cline-any cline-yes">8x</span>
711
- <span class="cline-any cline-yes">8x</span>
712
- <span class="cline-any cline-yes">8x</span>
713
- <span class="cline-any cline-yes">119x</span>
714
- <span class="cline-any cline-yes">119x</span>
715
- <span class="cline-any cline-yes">119x</span>
716
- <span class="cline-any cline-yes">119x</span>
717
- <span class="cline-any cline-yes">119x</span>
718
- <span class="cline-any cline-yes">119x</span>
719
- <span class="cline-any cline-yes">119x</span>
720
- <span class="cline-any cline-yes">119x</span>
721
- <span class="cline-any cline-yes">119x</span>
722
- <span class="cline-any cline-yes">119x</span>
723
- <span class="cline-any cline-yes">119x</span>
724
- <span class="cline-any cline-yes">119x</span>
725
- <span class="cline-any cline-yes">119x</span>
726
- <span class="cline-any cline-yes">119x</span>
727
- <span class="cline-any cline-yes">119x</span>
728
- <span class="cline-any cline-yes">119x</span>
729
- <span class="cline-any cline-yes">119x</span>
730
- <span class="cline-any cline-yes">119x</span>
731
- <span class="cline-any cline-yes">145x</span>
732
- <span class="cline-any cline-yes">145x</span>
733
- <span class="cline-any cline-yes">145x</span>
734
- <span class="cline-any cline-yes">145x</span>
735
- <span class="cline-any cline-yes">145x</span>
736
- <span class="cline-any cline-yes">145x</span>
737
- <span class="cline-any cline-yes">145x</span>
738
- <span class="cline-any cline-yes">145x</span>
739
- <span class="cline-any cline-yes">119x</span>
740
- <span class="cline-any cline-yes">145x</span>
741
- <span class="cline-any cline-yes">119x</span>
742
- <span class="cline-any cline-yes">119x</span>
743
- <span class="cline-any cline-yes">119x</span>
744
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type {
745
- Task,
746
- ParsingContext,
747
- Priority,
748
- Warning,
749
- } from '../types/index.js';
750
- import { PATTERNS } from './patterns.js';
751
- import { parseAbsoluteDate, resolveRelativeDate } from '../utils/dates.js';
752
- import { generateTaskId } from '../utils/id.js';
753
- &nbsp;
754
- /**
755
- * Extract assignee from task text
756
- *
757
- * @param text - Task text
758
- * @returns Username without @ symbol, or undefined
759
- *
760
- * @example
761
- * extractAssignee("@nick Review PR") // =&gt; "nick"
762
- * extractAssignee("Review PR") // =&gt; undefined
763
- */
764
- export function extractAssignee(text: string): string | undefined {
765
- const match = text.match(PATTERNS.ASSIGNEE);
766
- return match?.[1];
767
- }
768
- &nbsp;
769
- /**
770
- * Extract priority level from task text
771
- *
772
- * Priority is determined by exclamation marks:
773
- * - !!! = urgent
774
- * - !! = high
775
- * - ! = normal
776
- * - (none) = low
777
- *
778
- * @param text - Task text
779
- * @returns Priority level or undefined if no priority markers
780
- */
781
- export function extractPriority(text: string): Priority | undefined {
782
- if (PATTERNS.PRIORITY_URGENT.test(text)) return 'urgent';
783
- if (PATTERNS.PRIORITY_HIGH.test(text)) return 'high';
784
- if (PATTERNS.PRIORITY_NORMAL.test(text)) return 'normal';
785
- return undefined;
786
- }
787
- &nbsp;
788
- /**
789
- * Extract all tags from task text
790
- *
791
- * @param text - Task text
792
- * @returns Array of tag names (without # symbol)
793
- *
794
- * @example
795
- * extractTags("Review PR #backend #urgent") // =&gt; ["backend", "urgent"]
796
- * extractTags("No tags here") // =&gt; []
797
- */
798
- export function extractTags(text: string): string[] {
799
- const matches = text.matchAll(PATTERNS.TAG);
800
- return Array.from(matches, (match) =&gt; match[1]).filter(
801
- (tag): tag is string =&gt; tag !== undefined,
802
- );
803
- }
804
- &nbsp;
805
- /**
806
- * Extract Todoist ID from task text
807
- *
808
- * @param text - Task text
809
- * @returns Todoist ID string or undefined
810
- *
811
- * @example
812
- * extractTodoistId("Task [todoist:123456]") // =&gt; "123456"
813
- */
814
- export function extractTodoistId(text: string): string | undefined {
815
- const match = text.match(PATTERNS.TODOIST_ID);
816
- return match?.[1];
817
- }
818
- &nbsp;
819
- /**
820
- * Extract completion date from task text
821
- *
822
- * @param text - Task text
823
- * @returns Parsed Date or undefined
824
- *
825
- * @example
826
- * extractCompletedDate("[completed: 2026-01-18]") // =&gt; Date(2026-01-18)
827
- */
828
- export function extractCompletedDate(text: string): Date | undefined {
829
- const match = text.match(PATTERNS.COMPLETED_DATE);
830
- if (!match?.[1]) return undefined;
831
- &nbsp;
832
- const date = parseAbsoluteDate(match[1]);
833
- return <span class="branch-0 cbranch-no" title="branch not covered" >date ?? undefined;</span>
834
- }
835
- &nbsp;
836
- /**
837
- * Extract due date from task text with context awareness
838
- *
839
- * Handles both absolute dates ([due: 2026-01-25]) and relative dates
840
- * ([due: tomorrow]) which require context.
841
- *
842
- * @param text - Task text
843
- * @param context - Parsing context (for relative dates)
844
- * @returns Object with parsed date and optional warning
845
- */
846
- export function extractDueDate(
847
- text: string,
848
- context: ParsingContext,
849
- ): { date: Date | undefined; warning?: Warning } {
850
- // Try absolute date first
851
- const absoluteMatch = text.match(PATTERNS.DUE_DATE_ABSOLUTE);
852
- if (absoluteMatch?.[1]) {
853
- const date = parseAbsoluteDate(absoluteMatch[1]);
854
- return { date: <span class="branch-0 cbranch-no" title="branch not covered" >date ?? undefined }</span>;
855
- }
856
- &nbsp;
857
- // Try short format (M/D or M/D/YY)
858
- const shortMatch = text.match(PATTERNS.DUE_DATE_SHORT);
859
- if (shortMatch?.[1]) {
860
- const date = parseAbsoluteDate(shortMatch[1]);
861
- return { date: date ?? undefined };
862
- }
863
- &nbsp;
864
- // Try relative date
865
- const relativeMatch = text.match(PATTERNS.DUE_DATE_RELATIVE);
866
- if (relativeMatch?.[1]) {
867
- if (!context.currentDate) {
868
- // Relative date without context - create warning
869
- return {
870
- date: undefined,
871
- warning: {
872
- file: '', // Will be filled in by caller
873
- line: 0, // Will be filled in by caller
874
- text: text.trim(),
875
- reason:
876
- 'Relative due date without context date from heading. Add a heading with a date above this task.',
877
- },
878
- };
879
- }
880
- &nbsp;
881
- const date = resolveRelativeDate(relativeMatch[1], context.currentDate);
882
- return { date: <span class="branch-0 cbranch-no" title="branch not covered" >date ?? undefined }</span>;
883
- }
884
- &nbsp;
885
- return { date: undefined };
886
- }
887
- &nbsp;
888
- /**
889
- * Clean task text by removing metadata markers
890
- *
891
- * Removes:
892
- * - Assignees (@username)
893
- * - Due dates ([due: ...])
894
- * - Priority markers (!, !!, !!!)
895
- * - Tags (#tag)
896
- * - Todoist IDs ([todoist:...])
897
- * - Completion dates ([completed:...])
898
- *
899
- * @param text - Raw task text
900
- * @returns Cleaned text for display
901
- *
902
- * @example
903
- * cleanTaskText("@nick Review PR !! #backend [due: 2026-01-25]")
904
- * // =&gt; "Review PR"
905
- */
906
- export function cleanTaskText(text: string): string {
907
- return (
908
- text
909
- // Remove metadata in brackets
910
- .replace(PATTERNS.DUE_DATE_ABSOLUTE, '')
911
- .replace(PATTERNS.DUE_DATE_RELATIVE, '')
912
- .replace(PATTERNS.DUE_DATE_SHORT, '')
913
- .replace(PATTERNS.TODOIST_ID, '')
914
- .replace(PATTERNS.COMPLETED_DATE, '')
915
- // Remove assignee
916
- .replace(PATTERNS.ASSIGNEE, '')
917
- // Remove tags
918
- .replace(PATTERNS.TAG, '')
919
- // Remove priority markers
920
- .replace(/!!!/g, '')
921
- .replace(/!!/g, '')
922
- .replace(/!/g, '')
923
- // Clean up extra whitespace
924
- .replace(/\s+/g, ' ')
925
- .trim()
926
- );
927
- }
928
- &nbsp;
929
- /**
930
- * Parse a single line as a task
931
- *
932
- * This is the main parser entry point. It:
933
- * 1. Checks if the line is a task
934
- * 2. Extracts completion status
935
- * 3. Parses all metadata (assignee, priority, dates, tags)
936
- * 4. Cleans the text
937
- * 5. Generates a stable ID
938
- * 6. Applies context (project, person, heading date)
939
- *
940
- * @param line - Line of text to parse
941
- * @param lineNumber - Line number in file (1-indexed)
942
- * @param file - Relative file path
943
- * @param context - Parsing context
944
- * @returns Parsed Task object or null if line is not a task, plus any warnings
945
- */
946
- export function parseTask(
947
- line: string,
948
- lineNumber: number,
949
- file: string,
950
- context: ParsingContext,
951
- ): { task: Task | null; warnings: Warning[] } {
952
- const warnings: Warning[] = [];
953
- &nbsp;
954
- // Detect malformed checkboxes and provide helpful warnings
955
- // Check for asterisk/plus bullet markers (not supported)
956
- if (/^\s*[*+]\s+\[[ xX]\]/.test(line)) {
957
- warnings.push({
958
- file,
959
- line: lineNumber,
960
- text: line.trim(),
961
- reason:
962
- 'Unsupported bullet marker (* or +). Use dash (-) for task lists.',
963
- });
964
- return { task: null, warnings };
965
- }
966
- &nbsp;
967
- // Check for extra spaces inside checkbox: [x ] or [ x]
968
- if (/^\s*-\s+\[[xX]\s+\]/.test(line) || /^\s*-\s+\[\s+[xX]\]/.test(line)) {
969
- warnings.push({
970
- file,
971
- line: lineNumber,
972
- text: line.trim(),
973
- reason:
974
- 'Malformed checkbox with extra spaces. Use [x] or [ ] without extra spaces.',
975
- });
976
- return { task: null, warnings };
977
- }
978
- &nbsp;
979
- // Check for missing space after checkbox: [x]Task
980
- if (/^\s*-\s+\[[ xX]\][^\s]/.test(line)) {
981
- warnings.push({
982
- file,
983
- line: lineNumber,
984
- text: line.trim(),
985
- reason: 'Missing space after checkbox. Use "- [x] Task" format.',
986
- });
987
- return { task: null, warnings };
988
- }
989
- &nbsp;
990
- // Check for missing space before checkbox: -[x]
991
- if (/^\s*-\[[ xX]\]/.test(line)) {
992
- warnings.push({
993
- file,
994
- line: lineNumber,
995
- text: line.trim(),
996
- reason: 'Missing space before checkbox. Use "- [x] Task" format.',
997
- });
998
- return { task: null, warnings };
999
- }
1000
- &nbsp;
1001
- // Check if line is a task
1002
- const taskMatch = line.match(PATTERNS.TASK_CHECKBOX);
1003
- if (!taskMatch?.[0] || !taskMatch[2]) {
1004
- return { task: null, warnings };
1005
- }
1006
- &nbsp;
1007
- // Extract completion status
1008
- const completed = taskMatch[2].toLowerCase() === 'x';
1009
- &nbsp;
1010
- // Extract text (everything after checkbox)
1011
- const fullText = line.substring(taskMatch[0].length);
1012
- &nbsp;
1013
- // Parse metadata from text
1014
- const assignee = extractAssignee(fullText);
1015
- const priority = extractPriority(fullText);
1016
- const tags = extractTags(fullText);
1017
- const todoistId = extractTodoistId(fullText);
1018
- const completedDate = extractCompletedDate(fullText);
1019
- &nbsp;
1020
- // Extract due date (may produce warning)
1021
- const dueDateResult = extractDueDate(fullText, context);
1022
- if (dueDateResult.warning) {
1023
- warnings.push({
1024
- ...dueDateResult.warning,
1025
- file,
1026
- line: lineNumber,
1027
- });
1028
- }
1029
- &nbsp;
1030
- // Warn about missing dates
1031
- // Incomplete tasks without any date (no explicit due date and no context date)
1032
- if (!completed &amp;&amp; !dueDateResult.date &amp;&amp; !context.currentDate) {
1033
- warnings.push({
1034
- file,
1035
- line: lineNumber,
1036
- text: fullText.trim(),
1037
- reason:
1038
- 'Task has no due date. Add [due: YYYY-MM-DD] or place under a heading with a date.',
1039
- });
1040
- }
1041
- &nbsp;
1042
- // Completed tasks should have completion dates
1043
- if (completed &amp;&amp; !completedDate) {
1044
- warnings.push({
1045
- file,
1046
- line: lineNumber,
1047
- text: fullText.trim(),
1048
- reason:
1049
- 'Completed task missing completion date. Add [completed: YYYY-MM-DD].',
1050
- });
1051
- }
1052
- &nbsp;
1053
- // Clean text (remove metadata markers)
1054
- const cleanText = cleanTaskText(fullText);
1055
- &nbsp;
1056
- // Generate stable ID
1057
- const id = generateTaskId(file, lineNumber, cleanText);
1058
- &nbsp;
1059
- // Build task object with only defined properties
1060
- const task: Task = {
1061
- id,
1062
- text: cleanText,
1063
- completed,
1064
- file,
1065
- line: lineNumber,
1066
- tags,
1067
- };
1068
- &nbsp;
1069
- // Add optional fields only if defined
1070
- if (assignee !== undefined) task.assignee = assignee;
1071
- if (priority !== undefined) task.priority = priority;
1072
- if (dueDateResult.date !== undefined) task.dueDate = dueDateResult.date;
1073
- if (todoistId !== undefined) task.todoistId = todoistId;
1074
- if (completedDate !== undefined) task.completedDate = completedDate;
1075
- if (context.project !== undefined) task.project = context.project;
1076
- if (context.person !== undefined) task.person = context.person;
1077
- if (context.currentDate !== undefined) task.contextDate = context.currentDate;
1078
- if (context.currentHeading !== undefined)
1079
- task.contextHeading = context.currentHeading;
1080
- &nbsp;
1081
- return { task, warnings };
1082
- }
1083
- &nbsp;</pre></td></tr></table></pre>
1084
-
1085
- <div class='push'></div><!-- for sticky footer -->
1086
- </div><!-- /wrapper -->
1087
- <div class='footer quiet pad2 space-top1 center small'>
1088
- Code coverage generated by
1089
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1090
- at 2026-01-26T03:50:53.053Z
1091
- </div>
1092
- <script src="../../prettify.js"></script>
1093
- <script>
1094
- window.onload = function () {
1095
- prettyPrint();
1096
- };
1097
- </script>
1098
- <script src="../../sorter.js"></script>
1099
- <script src="../../block-navigation.js"></script>
1100
- </body>
1101
- </html>
1102
-