aview-app 1.0.2

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.

Potentially problematic release.


This version of aview-app might be problematic. Click here for more details.

Files changed (1127) hide show
  1. package/README.md +18 -0
  2. package/aardio/aardio.exe +0 -0
  3. package/aardio/config/CFG.BIN +0 -0
  4. package/aardio/config/RECENT.PROJECT.TABLE +8 -0
  5. package/aardio/config/SYS.CFG +1 -0
  6. package/aardio/config/SYS.THEME +124 -0
  7. package/aardio/config/USR.CFG +16 -0
  8. package/aardio/config/USR.THEME +124 -0
  9. package/aardio/config/intellisense/kernel.txt +634 -0
  10. package/aardio/config/intellisense/unimportant.txt +108 -0
  11. package/aardio/config/intellisense/web.layout.behavior.txt +81 -0
  12. package/aardio/config/intellisense/web.sciter.behavior.txt +94 -0
  13. package/aardio/config/intellisense/winform.txt +215 -0
  14. package/aardio/config/lang/lib.txt +210 -0
  15. package/aardio/config/themes/dark.xml +124 -0
  16. package/aardio/config/themes/light.xml +124 -0
  17. package/aardio/extensions/extlibver.table +13 -0
  18. package/aardio/extensions/ide.aardio +386 -0
  19. package/aardio/extensions/plugin/view/bbx.aardio +52 -0
  20. package/aardio/extensions/plugin/view/config.aardio +52 -0
  21. package/aardio/extensions/plugin/view/dsktip.aardio +84 -0
  22. package/aardio/extensions/plugin/view/res/content/getting-started.htm +15 -0
  23. package/aardio/extensions/plugin/view/res/images/body-back.png +0 -0
  24. package/aardio/extensions/plugin/view/res/images/loading.png +0 -0
  25. package/aardio/extensions/plugin/view/res/images/panel-back.png +0 -0
  26. package/aardio/extensions/plugin/view/res/images/panel-caption-back.png +0 -0
  27. package/aardio/extensions/plugin/view/res/start-page.htm +216 -0
  28. package/aardio/extensions/plugin/view/startPage.aardio +329 -0
  29. package/aardio/extensions/plugin/view/startPage.aardio.plugin +329 -0
  30. package/aardio/extensions/res/app.ico +0 -0
  31. package/aardio/extensions/trigger/before-publish.aardio +57 -0
  32. package/aardio/extensions/trigger/copyCodeAsHtml.aardio +26 -0
  33. package/aardio/extensions/trigger/default.aproj +10 -0
  34. package/aardio/extensions/trigger/edit-default.aardio +71 -0
  35. package/aardio/extensions/trigger/edit.aardio +83 -0
  36. package/aardio/extensions/trigger/gotoFile.aardio +1 -0
  37. package/aardio/extensions/trigger/init.aardio +17 -0
  38. package/aardio/extensions/trigger/lib/config.aardio +8 -0
  39. package/aardio/extensions/trigger/openProject.aardio +39 -0
  40. package/aardio/extensions/trigger/publish-website.aardio +168 -0
  41. package/aardio/extensions/trigger/publish.aardio +386 -0
  42. package/aardio/extensions/trigger/res/config/publish.table +5 -0
  43. package/aardio/extensions/wizard/files/console.aardio +5 -0
  44. package/aardio/extensions/wizard/files/default.main.aardio +8 -0
  45. package/aardio/extensions/wizard/files/layout-blank.aardio +231 -0
  46. package/aardio/extensions/wizard/files/layout.aardio +15 -0
  47. package/aardio/extensions/wizard/files/webform-blank.aardio +84 -0
  48. package/aardio/extensions/wizard/files/webform.aardio +17 -0
  49. package/aardio/extensions/wizard/files/website.main.aardio +14 -0
  50. package/aardio/extensions/wizard/files/winform.aardio +9 -0
  51. package/aardio/extensions/wizard/project/win/default.aproj +4 -0
  52. package/aardio/extensions/wizard/project2/.build//351/253/230/347/272/247/351/200/211/351/241/271/345/215/241.Manifest.xml +60 -0
  53. package/aardio/extensions/wizard/project2/.build//351/253/230/347/272/247/351/200/211/351/241/271/345/215/241.init.aardio +2 -0
  54. package/aardio/extensions/wizard/project2/.build//351/253/230/347/272/247/351/200/211/351/241/271/345/215/241.main.aardio +6 -0
  55. package/aardio/extensions/wizard/project2/forms/console/console.aardio +16 -0
  56. package/aardio/extensions/wizard/project2/forms/console/service.aardio +41 -0
  57. package/aardio/extensions/wizard/project2/forms/console.aardio +90 -0
  58. package/aardio/extensions/wizard/project2/forms/fastcgi.aardio +168 -0
  59. package/aardio/extensions/wizard/project2/forms/images/console.jpg +0 -0
  60. package/aardio/extensions/wizard/project2/forms/images/electron.jpg +0 -0
  61. package/aardio/extensions/wizard/project2/forms/images/htmlayout.jpg +0 -0
  62. package/aardio/extensions/wizard/project2/forms/images/winform.jpg +0 -0
  63. package/aardio/extensions/wizard/project2/forms/plus/first.aardio +17 -0
  64. package/aardio/extensions/wizard/project2/forms/plus/icon.aardio +122 -0
  65. package/aardio/extensions/wizard/project2/forms/plus/images/1.jpg +0 -0
  66. package/aardio/extensions/wizard/project2/forms/plus/tabs.aardio +119 -0
  67. package/aardio/extensions/wizard/project2/forms/plus.aardio +94 -0
  68. package/aardio/extensions/wizard/project2/forms/web/chromeApp.aardio +62 -0
  69. package/aardio/extensions/wizard/project2/forms/web/electron.aardio +19 -0
  70. package/aardio/extensions/wizard/project2/forms/web/htmlayout.aardio +16 -0
  71. package/aardio/extensions/wizard/project2/forms/web/sciter.aardio +16 -0
  72. package/aardio/extensions/wizard/project2/forms/web/view.aardio +67 -0
  73. package/aardio/extensions/wizard/project2/forms/web/webform.aardio +60 -0
  74. package/aardio/extensions/wizard/project2/forms/web/webkit.aardio +49 -0
  75. package/aardio/extensions/wizard/project2/forms/web.aardio +105 -0
  76. package/aardio/extensions/wizard/project2/forms/website.aardio +175 -0
  77. package/aardio/extensions/wizard/project2/forms/winform/bat.aardio +46 -0
  78. package/aardio/extensions/wizard/project2/forms/winform/blank.aardio +20 -0
  79. package/aardio/extensions/wizard/project2/forms/winform/demo.aardio +20 -0
  80. package/aardio/extensions/wizard/project2/forms/winform/images/paint.png +0 -0
  81. package/aardio/extensions/wizard/project2/forms/winform/java.aardio +67 -0
  82. package/aardio/extensions/wizard/project2/forms/winform/paint.aardio +21 -0
  83. package/aardio/extensions/wizard/project2/forms/winform/python.aardio +101 -0
  84. package/aardio/extensions/wizard/project2/forms/winform.aardio +82 -0
  85. package/aardio/extensions/wizard/project2/lib/style/_.aardio +4 -0
  86. package/aardio/extensions/wizard/project2/lib/style/main.aardio +47 -0
  87. package/aardio/extensions/wizard/project2/main.aardio +248 -0
  88. package/aardio/extensions/wizard/project2/res/icons/console.png +0 -0
  89. package/aardio/extensions/wizard/project2/res/icons/fastcgi.png +0 -0
  90. package/aardio/extensions/wizard/project2/res/icons/plus.png +0 -0
  91. package/aardio/extensions/wizard/project2/res/icons/web.png +0 -0
  92. package/aardio/extensions/wizard/project2/res/icons/website.png +0 -0
  93. package/aardio/extensions/wizard/project2/res/icons/winform.png +0 -0
  94. package/aardio/extensions/wizard/project2/res/images/bg.gif +0 -0
  95. package/aardio/extensions/wizard/project2/res/images/check-active1.png +0 -0
  96. package/aardio/extensions/wizard/project2/res/images/check-disabled1.png +0 -0
  97. package/aardio/extensions/wizard/project2/res/images/check-hover1.png +0 -0
  98. package/aardio/extensions/wizard/project2/res/images/check1.png +0 -0
  99. package/aardio/extensions/wizard/project2/res/images/main-nav-bg-active.png +0 -0
  100. package/aardio/extensions/wizard/project2/res/images/main-nav-bg-hover.png +0 -0
  101. package/aardio/extensions/wizard/project2/res/images/main-nav-bg.png +0 -0
  102. package/aardio/extensions/wizard/project2/res/images/uncheck-active1.png +0 -0
  103. package/aardio/extensions/wizard/project2/res/images/uncheck-disabled1.png +0 -0
  104. package/aardio/extensions/wizard/project2/res/images/uncheck-hover1.png +0 -0
  105. package/aardio/extensions/wizard/project2/res/images/uncheck1.png +0 -0
  106. package/aardio/extensions/wizard/project2/template/bat/bat/bat.aardio +33 -0
  107. package/aardio/extensions/wizard/project2/template/bat/bat/bat2.aardio +17 -0
  108. package/aardio/extensions/wizard/project2/template/bat/default.aproj +9 -0
  109. package/aardio/extensions/wizard/project2/template/bat/lib/config.aardio +17 -0
  110. package/aardio/extensions/wizard/project2/template/bat/lib/style.aardio +72 -0
  111. package/aardio/extensions/wizard/project2/template/bat/main.aardio +52 -0
  112. package/aardio/extensions/wizard/project2/template/console/default.aproj +5 -0
  113. package/aardio/extensions/wizard/project2/template/console/lib/config.aardio +17 -0
  114. package/aardio/extensions/wizard/project2/template/console/main.aardio +23 -0
  115. package/aardio/extensions/wizard/project2/template/fastcgi/.build/default.Manifest.xml +60 -0
  116. package/aardio/extensions/wizard/project2/template/fastcgi/.build/default.init.aardio +4 -0
  117. package/aardio/extensions/wizard/project2/template/fastcgi/.build/default.main.aardio +6 -0
  118. package/aardio/extensions/wizard/project2/template/fastcgi/default.aproj +5 -0
  119. package/aardio/extensions/wizard/project2/template/fastcgi/lib/config.aardio +17 -0
  120. package/aardio/extensions/wizard/project2/template/fastcgi/main.aardio +77 -0
  121. package/aardio/extensions/wizard/project2/template/java/default/default.aproj +14 -0
  122. package/aardio/extensions/wizard/project2/template/java/default/java/aardio/sample/HelloworldApp.class +0 -0
  123. package/aardio/extensions/wizard/project2/template/java/default/java/aardio/sample/HelloworldApp.java +33 -0
  124. package/aardio/extensions/wizard/project2/template/java/default/lib/config.aardio +17 -0
  125. package/aardio/extensions/wizard/project2/template/java/default/main.aardio +33 -0
  126. package/aardio/extensions/wizard/project2/template/java/default/res/py.aardio +12 -0
  127. package/aardio/extensions/wizard/project2/template/paint/default.aproj +6 -0
  128. package/aardio/extensions/wizard/project2/template/paint/lib/config.aardio +17 -0
  129. package/aardio/extensions/wizard/project2/template/paint/lib/fonts/.res/painttest.ttf +0 -0
  130. package/aardio/extensions/wizard/project2/template/paint/lib/fonts/painttest.aardio +10 -0
  131. package/aardio/extensions/wizard/project2/template/paint/lib/style.aardio +46 -0
  132. package/aardio/extensions/wizard/project2/template/paint/main.aardio +125 -0
  133. package/aardio/extensions/wizard/project2/template/plus/1/default.aproj +20 -0
  134. package/aardio/extensions/wizard/project2/template/plus/1/forms/page1.aardio +89 -0
  135. package/aardio/extensions/wizard/project2/template/plus/1/forms/page2.aardio +70 -0
  136. package/aardio/extensions/wizard/project2/template/plus/1/forms/page3.aardio +21 -0
  137. package/aardio/extensions/wizard/project2/template/plus/1/include/images/bg.gif +0 -0
  138. package/aardio/extensions/wizard/project2/template/plus/1/include//350/257/264/346/230/216.txt +1 -0
  139. package/aardio/extensions/wizard/project2/template/plus/1/main.aardio +69 -0
  140. package/aardio/extensions/wizard/project2/template/plus/1/res/images/bg.png +0 -0
  141. package/aardio/extensions/wizard/project2/template/plus/1/res/images/excel.png +0 -0
  142. package/aardio/extensions/wizard/project2/template/plus/1/res/images/feed.png +0 -0
  143. package/aardio/extensions/wizard/project2/template/plus/1/res/images/main-nav-bg-active.png +0 -0
  144. package/aardio/extensions/wizard/project2/template/plus/1/res/images/main-nav-bg-hover.png +0 -0
  145. package/aardio/extensions/wizard/project2/template/plus/1/res/images/main-nav-bg.png +0 -0
  146. package/aardio/extensions/wizard/project2/template/plus/1/res/images/ppt.png +0 -0
  147. package/aardio/extensions/wizard/project2/template/plus/1/res/images/rss.png +0 -0
  148. package/aardio/extensions/wizard/project2/template/plus/icon/default.aproj +12 -0
  149. package/aardio/extensions/wizard/project2/template/plus/icon/forms/main/frmPage1.aardio +11 -0
  150. package/aardio/extensions/wizard/project2/template/plus/icon/forms/main/frmPage2.aardio +9 -0
  151. package/aardio/extensions/wizard/project2/template/plus/icon/forms/main/frmPage3.aardio +9 -0
  152. package/aardio/extensions/wizard/project2/template/plus/icon/lib/config.aardio +17 -0
  153. package/aardio/extensions/wizard/project2/template/plus/icon/main.aardio +52 -0
  154. package/aardio/extensions/wizard/project2/template/plus/tabs/default.aproj +11 -0
  155. package/aardio/extensions/wizard/project2/template/plus/tabs/dlg/first.aardio +20 -0
  156. package/aardio/extensions/wizard/project2/template/plus/tabs/dlg/help.aardio +25 -0
  157. package/aardio/extensions/wizard/project2/template/plus/tabs/dlg/hotkey.aardio +20 -0
  158. package/aardio/extensions/wizard/project2/template/plus/tabs/dlg/setting.aardio +20 -0
  159. package/aardio/extensions/wizard/project2/template/plus/tabs/lib/config.aardio +17 -0
  160. package/aardio/extensions/wizard/project2/template/plus/tabs/lib/style.aardio +72 -0
  161. package/aardio/extensions/wizard/project2/template/plus/tabs/main.aardio +50 -0
  162. package/aardio/extensions/wizard/project2/template/python/process/default.aproj +14 -0
  163. package/aardio/extensions/wizard/project2/template/python/process/lib/config.aardio +17 -0
  164. package/aardio/extensions/wizard/project2/template/python/process/lib/py3/export/aardio.aardio +17 -0
  165. package/aardio/extensions/wizard/project2/template/python/process/main.aardio +36 -0
  166. package/aardio/extensions/wizard/project2/template/python/process/py/pyMain.py +17 -0
  167. package/aardio/extensions/wizard/project2/template/python/process/res/py.aardio +12 -0
  168. package/aardio/extensions/wizard/project2/template/python/process/tools/pip.aardio +15 -0
  169. package/aardio/extensions/wizard/project2/template/python/py2/default.aproj +9 -0
  170. package/aardio/extensions/wizard/project2/template/python/py2/lib/config.aardio +17 -0
  171. package/aardio/extensions/wizard/project2/template/python/py2/lib/py2/export/aardio.aardio +16 -0
  172. package/aardio/extensions/wizard/project2/template/python/py2/main.aardio +19 -0
  173. package/aardio/extensions/wizard/project2/template/python/py2/py/pyMain.py +14 -0
  174. package/aardio/extensions/wizard/project2/template/python/py3/default.aproj +12 -0
  175. package/aardio/extensions/wizard/project2/template/python/py3/lib/config.aardio +17 -0
  176. package/aardio/extensions/wizard/project2/template/python/py3/lib/py3/export/aardio.aardio +17 -0
  177. package/aardio/extensions/wizard/project2/template/python/py3/main.aardio +20 -0
  178. package/aardio/extensions/wizard/project2/template/python/py3/py/pyMain.py +15 -0
  179. package/aardio/extensions/wizard/project2/template/python/py3/tools/pip.aardio +28 -0
  180. package/aardio/extensions/wizard/project2/template/service/.build/default.init.aardio +4 -0
  181. package/aardio/extensions/wizard/project2/template/service/default.aproj +5 -0
  182. package/aardio/extensions/wizard/project2/template/service/lib/config.aardio +17 -0
  183. package/aardio/extensions/wizard/project2/template/service/lib/service/threads/_.aardio +35 -0
  184. package/aardio/extensions/wizard/project2/template/service/main.aardio +68 -0
  185. package/aardio/extensions/wizard/project2/template/web/chrome-app/default.aproj +10 -0
  186. package/aardio/extensions/wizard/project2/template/web/chrome-app/lib/config.aardio +17 -0
  187. package/aardio/extensions/wizard/project2/template/web/chrome-app/main.aardio +22 -0
  188. package/aardio/extensions/wizard/project2/template/web/chrome-app/web/index.html +15 -0
  189. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/.yarnrc +1 -0
  190. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/package.json +45 -0
  191. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/public/favicon.ico +0 -0
  192. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/public/index.html +33 -0
  193. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/src/App.css +20 -0
  194. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/src/App.test.tsx +9 -0
  195. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/src/App.tsx +37 -0
  196. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/src/Counter.tsx +40 -0
  197. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/src/index.css +11 -0
  198. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/src/index.tsx +26 -0
  199. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/src/react-app-env.d.ts +1 -0
  200. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/src/reportWebVitals.ts +15 -0
  201. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/src/setupTests.ts +5 -0
  202. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/src/store/index.ts +11 -0
  203. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/src/store/useCounterController.ts +39 -0
  204. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/src/store/useUserController.ts +24 -0
  205. package/aardio/extensions/wizard/project2/template/web/chrome-app/web.src/tsconfig.json +26 -0
  206. package/aardio/extensions/wizard/project2/template/web/chrome-htmx/default.aproj +16 -0
  207. package/aardio/extensions/wizard/project2/template/web/chrome-htmx/lib/config.aardio +17 -0
  208. package/aardio/extensions/wizard/project2/template/web/chrome-htmx/main.aardio +12 -0
  209. package/aardio/extensions/wizard/project2/template/web/chrome-htmx/web/api/index.aardio +20 -0
  210. package/aardio/extensions/wizard/project2/template/web/chrome-htmx/web/htmx.js +1 -0
  211. package/aardio/extensions/wizard/project2/template/web/chrome-htmx/web/images/loading.gif +0 -0
  212. package/aardio/extensions/wizard/project2/template/web/chrome-htmx/web/index.css +34 -0
  213. package/aardio/extensions/wizard/project2/template/web/chrome-htmx/web/index.html +65 -0
  214. package/aardio/extensions/wizard/project2/template/web/chrome-vue/default.aproj +10 -0
  215. package/aardio/extensions/wizard/project2/template/web/chrome-vue/lib/config.aardio +17 -0
  216. package/aardio/extensions/wizard/project2/template/web/chrome-vue/main.aardio +21 -0
  217. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web/index.html +15 -0
  218. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/.vscode/extensions.json +3 -0
  219. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/README.md +40 -0
  220. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/env.d.ts +1 -0
  221. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/index.html +13 -0
  222. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/package.json +25 -0
  223. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/public/favicon.ico +0 -0
  224. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/src/App.vue +58 -0
  225. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/src/assets/base.css +74 -0
  226. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/src/assets/logo.svg +1 -0
  227. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/src/assets/main.css +35 -0
  228. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/src/components/HelloWorld.vue +40 -0
  229. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/src/components/TheWelcome.vue +86 -0
  230. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/src/components/WelcomeItem.vue +86 -0
  231. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/src/components/icons/IconCommunity.vue +7 -0
  232. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/src/components/icons/IconDocumentation.vue +7 -0
  233. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/src/components/icons/IconEcosystem.vue +7 -0
  234. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/src/components/icons/IconSupport.vue +7 -0
  235. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/src/components/icons/IconTooling.vue +19 -0
  236. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/src/main.ts +6 -0
  237. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/tsconfig.config.json +8 -0
  238. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/tsconfig.json +16 -0
  239. package/aardio/extensions/wizard/project2/template/web/chrome-vue/web.src/vite.config.ts +20 -0
  240. package/aardio/extensions/wizard/project2/template/web/electron/default.aproj +8 -0
  241. package/aardio/extensions/wizard/project2/template/web/electron/electron.app/.aardio-ignore +6 -0
  242. package/aardio/extensions/wizard/project2/template/web/electron/electron.app/.yarnrc +1 -0
  243. package/aardio/extensions/wizard/project2/template/web/electron/electron.app/app.ico +0 -0
  244. package/aardio/extensions/wizard/project2/template/web/electron/forms/remoteDebugging.aardio +122 -0
  245. package/aardio/extensions/wizard/project2/template/web/electron/lib/config.aardio +22 -0
  246. package/aardio/extensions/wizard/project2/template/web/electron/main.aardio +80 -0
  247. package/aardio/extensions/wizard/project2/template/web/electron/res/.vscode/settings.json +3 -0
  248. package/aardio/extensions/wizard/project2/template/web/electron/res/index.aardio +78 -0
  249. package/aardio/extensions/wizard/project2/template/web/layoutUi/default.aproj +20 -0
  250. package/aardio/extensions/wizard/project2/template/web/layoutUi/layout/images/begin.png +0 -0
  251. package/aardio/extensions/wizard/project2/template/web/layoutUi/layout/images/document.png +0 -0
  252. package/aardio/extensions/wizard/project2/template/web/layoutUi/layout/images/download.png +0 -0
  253. package/aardio/extensions/wizard/project2/template/web/layoutUi/layout/images/home.png +0 -0
  254. package/aardio/extensions/wizard/project2/template/web/layoutUi/layout/images/logo.png +0 -0
  255. package/aardio/extensions/wizard/project2/template/web/layoutUi/layout/tabs.css +123 -0
  256. package/aardio/extensions/wizard/project2/template/web/layoutUi/layout/ui.css +67 -0
  257. package/aardio/extensions/wizard/project2/template/web/layoutUi/layout/ui.html +49 -0
  258. package/aardio/extensions/wizard/project2/template/web/layoutUi/main.aardio +26 -0
  259. package/aardio/extensions/wizard/project2/template/web/sciter/default.aproj +21 -0
  260. package/aardio/extensions/wizard/project2/template/web/sciter/layout/hooks.js +2 -0
  261. package/aardio/extensions/wizard/project2/template/web/sciter/layout/images/begin.png +0 -0
  262. package/aardio/extensions/wizard/project2/template/web/sciter/layout/images/document.png +0 -0
  263. package/aardio/extensions/wizard/project2/template/web/sciter/layout/images/download.png +0 -0
  264. package/aardio/extensions/wizard/project2/template/web/sciter/layout/images/home.png +0 -0
  265. package/aardio/extensions/wizard/project2/template/web/sciter/layout/images/logo.png +0 -0
  266. package/aardio/extensions/wizard/project2/template/web/sciter/layout/preact.js +2 -0
  267. package/aardio/extensions/wizard/project2/template/web/sciter/layout/tabs.css +123 -0
  268. package/aardio/extensions/wizard/project2/template/web/sciter/layout/ui.css +67 -0
  269. package/aardio/extensions/wizard/project2/template/web/sciter/layout/ui.html +100 -0
  270. package/aardio/extensions/wizard/project2/template/web/sciter/main.aardio +31 -0
  271. package/aardio/extensions/wizard/project2/template/web/view/default.aproj +10 -0
  272. package/aardio/extensions/wizard/project2/template/web/view/lib/config.aardio +17 -0
  273. package/aardio/extensions/wizard/project2/template/web/view/main.aardio +30 -0
  274. package/aardio/extensions/wizard/project2/template/web/view/web/index.html +15 -0
  275. package/aardio/extensions/wizard/project2/template/web/view/web.src/.yarnrc +1 -0
  276. package/aardio/extensions/wizard/project2/template/web/view/web.src/package.json +44 -0
  277. package/aardio/extensions/wizard/project2/template/web/view/web.src/public/favicon.ico +0 -0
  278. package/aardio/extensions/wizard/project2/template/web/view/web.src/public/index.html +33 -0
  279. package/aardio/extensions/wizard/project2/template/web/view/web.src/src/App.css +20 -0
  280. package/aardio/extensions/wizard/project2/template/web/view/web.src/src/App.test.tsx +9 -0
  281. package/aardio/extensions/wizard/project2/template/web/view/web.src/src/App.tsx +37 -0
  282. package/aardio/extensions/wizard/project2/template/web/view/web.src/src/Counter.tsx +39 -0
  283. package/aardio/extensions/wizard/project2/template/web/view/web.src/src/aardio/index.d.ts +7 -0
  284. package/aardio/extensions/wizard/project2/template/web/view/web.src/src/index.css +9 -0
  285. package/aardio/extensions/wizard/project2/template/web/view/web.src/src/index.tsx +26 -0
  286. package/aardio/extensions/wizard/project2/template/web/view/web.src/src/react-app-env.d.ts +1 -0
  287. package/aardio/extensions/wizard/project2/template/web/view/web.src/src/reportWebVitals.ts +15 -0
  288. package/aardio/extensions/wizard/project2/template/web/view/web.src/src/setupTests.ts +5 -0
  289. package/aardio/extensions/wizard/project2/template/web/view/web.src/src/store/index.ts +11 -0
  290. package/aardio/extensions/wizard/project2/template/web/view/web.src/src/store/useCounterController.ts +39 -0
  291. package/aardio/extensions/wizard/project2/template/web/view/web.src/src/store/useUserController.ts +24 -0
  292. package/aardio/extensions/wizard/project2/template/web/view/web.src/tsconfig.json +26 -0
  293. package/aardio/extensions/wizard/project2/template/web/view-htmx/default.aproj +16 -0
  294. package/aardio/extensions/wizard/project2/template/web/view-htmx/lib/config.aardio +17 -0
  295. package/aardio/extensions/wizard/project2/template/web/view-htmx/main.aardio +21 -0
  296. package/aardio/extensions/wizard/project2/template/web/view-htmx/web/api/index.aardio +20 -0
  297. package/aardio/extensions/wizard/project2/template/web/view-htmx/web/htmx.js +1 -0
  298. package/aardio/extensions/wizard/project2/template/web/view-htmx/web/images/loading.gif +0 -0
  299. package/aardio/extensions/wizard/project2/template/web/view-htmx/web/index.css +34 -0
  300. package/aardio/extensions/wizard/project2/template/web/view-htmx/web/index.html +64 -0
  301. package/aardio/extensions/wizard/project2/template/web/view-vue/.build/default.Manifest.xml +60 -0
  302. package/aardio/extensions/wizard/project2/template/web/view-vue/.build/default.init.aardio +2 -0
  303. package/aardio/extensions/wizard/project2/template/web/view-vue/.build/default.main.aardio +6 -0
  304. package/aardio/extensions/wizard/project2/template/web/view-vue/default.aproj +10 -0
  305. package/aardio/extensions/wizard/project2/template/web/view-vue/lib/config.aardio +17 -0
  306. package/aardio/extensions/wizard/project2/template/web/view-vue/main.aardio +29 -0
  307. package/aardio/extensions/wizard/project2/template/web/view-vue/web/index.html +15 -0
  308. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/.vscode/extensions.json +3 -0
  309. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/README.md +40 -0
  310. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/aardio/index.d.ts +7 -0
  311. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/env.d.ts +1 -0
  312. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/index.html +13 -0
  313. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/package.json +24 -0
  314. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/public/favicon.ico +0 -0
  315. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/src/App.vue +57 -0
  316. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/src/assets/base.css +74 -0
  317. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/src/assets/logo.svg +1 -0
  318. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/src/assets/main.css +35 -0
  319. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/src/components/HelloWorld.vue +40 -0
  320. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/src/components/TheWelcome.vue +86 -0
  321. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/src/components/WelcomeItem.vue +86 -0
  322. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/src/components/icons/IconCommunity.vue +7 -0
  323. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/src/components/icons/IconDocumentation.vue +7 -0
  324. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/src/components/icons/IconEcosystem.vue +7 -0
  325. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/src/components/icons/IconSupport.vue +7 -0
  326. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/src/components/icons/IconTooling.vue +19 -0
  327. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/src/main.ts +6 -0
  328. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/tsconfig.config.json +8 -0
  329. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/tsconfig.json +16 -0
  330. package/aardio/extensions/wizard/project2/template/web/view-vue/web.src/vite.config.ts +20 -0
  331. package/aardio/extensions/wizard/project2/template/web/webform/default.aproj +19 -0
  332. package/aardio/extensions/wizard/project2/template/web/webform/forms/main/frmPage2.aardio +9 -0
  333. package/aardio/extensions/wizard/project2/template/web/webform/forms/main/frmPage3.aardio +9 -0
  334. package/aardio/extensions/wizard/project2/template/web/webform/forms/main/webPage.aardio +32 -0
  335. package/aardio/extensions/wizard/project2/template/web/webform/lib/config.aardio +17 -0
  336. package/aardio/extensions/wizard/project2/template/web/webform/main.aardio +52 -0
  337. package/aardio/extensions/wizard/project2/template/web/webform/web/api/index.aardio +21 -0
  338. package/aardio/extensions/wizard/project2/template/web/webform/web/htmx.js +1 -0
  339. package/aardio/extensions/wizard/project2/template/web/webform/web/images/loading.gif +0 -0
  340. package/aardio/extensions/wizard/project2/template/web/webform/web/index.css +34 -0
  341. package/aardio/extensions/wizard/project2/template/web/webform/web/index.html +65 -0
  342. package/aardio/extensions/wizard/project2/template/web/webkit/default.aproj +16 -0
  343. package/aardio/extensions/wizard/project2/template/web/webkit/forms/main/frmPage2.aardio +9 -0
  344. package/aardio/extensions/wizard/project2/template/web/webkit/forms/main/frmPage3.aardio +9 -0
  345. package/aardio/extensions/wizard/project2/template/web/webkit/forms/main/webPage.aardio +28 -0
  346. package/aardio/extensions/wizard/project2/template/web/webkit/lib/config.aardio +17 -0
  347. package/aardio/extensions/wizard/project2/template/web/webkit/main.aardio +52 -0
  348. package/aardio/extensions/wizard/project2/template/web/webkit/web/index.html +11 -0
  349. package/aardio/extensions/wizard/project2/template/web/webkit/web/index.js +173 -0
  350. package/aardio/extensions/wizard/project2/template/web/webkit/web.src/.babelrc +20 -0
  351. package/aardio/extensions/wizard/project2/template/web/webkit/web.src/package.json +25 -0
  352. package/aardio/extensions/wizard/project2/template/web/webkit/web.src/src/App.css +27 -0
  353. package/aardio/extensions/wizard/project2/template/web/webkit/web.src/src/App.jsx +49 -0
  354. package/aardio/extensions/wizard/project2/template/web/webkit/web.src/src/index.js +7 -0
  355. package/aardio/extensions/wizard/project2/template/web/webkit/web.src/webpack.config.js +43 -0
  356. package/aardio/extensions/wizard/project2/template/web-server/default.aproj +18 -0
  357. package/aardio/extensions/wizard/project2/template/web-server/lib/config.aardio +17 -0
  358. package/aardio/extensions/wizard/project2/template/web-server/main.aardio +343 -0
  359. package/aardio/extensions/wizard/project2/template/website/.build/default.main.aardio +9 -0
  360. package/aardio/extensions/wizard/project2/template/website/default.aproj +8 -0
  361. package/aardio/extensions/wizard/project2/template/website/help/main.aardio +58 -0
  362. package/aardio/extensions/wizard/project2/template/website/lib/config.aardio +17 -0
  363. package/aardio/extensions/wizard/project2/template/website/main.aardio +59 -0
  364. package/aardio/extensions/wizard/project2/template/winform/default.aproj +18 -0
  365. package/aardio/extensions/wizard/project2/template/winform/dlg/login/loading.aardio +17 -0
  366. package/aardio/extensions/wizard/project2/template/winform/dlg/login/login.aardio +51 -0
  367. package/aardio/extensions/wizard/project2/template/winform/dlg/login/reg.aardio +20 -0
  368. package/aardio/extensions/wizard/project2/template/winform/dlg/main/tabs1.aardio +52 -0
  369. package/aardio/extensions/wizard/project2/template/winform/dlg/main/tabs2.aardio +51 -0
  370. package/aardio/extensions/wizard/project2/template/winform/dlg/main/tabs3.aardio +55 -0
  371. package/aardio/extensions/wizard/project2/template/winform/dlg/main/userInfo.aardio +40 -0
  372. package/aardio/extensions/wizard/project2/template/winform/lib/config.aardio +17 -0
  373. package/aardio/extensions/wizard/project2/template/winform/main.aardio +18 -0
  374. package/aardio/extensions/wizard/project2/template/winform-blank/default.aproj +6 -0
  375. package/aardio/extensions/wizard/project2/template/winform-blank/lib/config.aardio +17 -0
  376. package/aardio/extensions/wizard/project2/template/winform-blank/main.aardio +8 -0
  377. package/aardio/extensions/wizard/project2//345/267/245/347/250/213/345/220/221/345/257/274.aproj +71 -0
  378. package/aardio/lib/System/Array.aardio +7 -0
  379. package/aardio/lib/System/Collections/_.aardio +6 -0
  380. package/aardio/lib/System/Console.aardio +7 -0
  381. package/aardio/lib/System/Data/_.aardio +7 -0
  382. package/aardio/lib/System/Delegate.aardio +7 -0
  383. package/aardio/lib/System/Drawing/_.aardio +6 -0
  384. package/aardio/lib/System/IO/Compression/ZipFile.aardio +11 -0
  385. package/aardio/lib/System/IO/_.aardio +6 -0
  386. package/aardio/lib/System/Text/_.aardio +6 -0
  387. package/aardio/lib/System/Type.aardio +9 -0
  388. package/aardio/lib/System/ValueTuple.aardio +33 -0
  389. package/aardio/lib/System/Windows/Automation/_.aardio +74 -0
  390. package/aardio/lib/System/Windows/Forms/_.aardio +26 -0
  391. package/aardio/lib/System/Windows/_.aardio +6 -0
  392. package/aardio/lib/System/_.aardio +6 -0
  393. package/aardio/lib/access/_.aardio +713 -0
  394. package/aardio/lib/access/oleDb12.aardio +26 -0
  395. package/aardio/lib/access/query.aardio +19 -0
  396. package/aardio/lib/bencoding/_.aardio +2 -0
  397. package/aardio/lib/bencoding/decoder.aardio +131 -0
  398. package/aardio/lib/bencoding/encoder.aardio +61 -0
  399. package/aardio/lib/bencoding/magnet.aardio +24 -0
  400. package/aardio/lib/chrome/app.aardio +581 -0
  401. package/aardio/lib/chrome/dev.aardio +152 -0
  402. package/aardio/lib/chrome/driver.aardio +743 -0
  403. package/aardio/lib/chrome/edge.aardio +35 -0
  404. package/aardio/lib/chrome/edge.history.aardio +57 -0
  405. package/aardio/lib/chrome/extensions.aardio +33 -0
  406. package/aardio/lib/chrome/history.aardio +70 -0
  407. package/aardio/lib/chrome/path.aardio +140 -0
  408. package/aardio/lib/chrome/remote.aardio +75 -0
  409. package/aardio/lib/chrome/time.aardio +17 -0
  410. package/aardio/lib/color/_.aardio +210 -0
  411. package/aardio/lib/color/table.aardio +374 -0
  412. package/aardio/lib/color/view.aardio +244 -0
  413. package/aardio/lib/color/viewForm.aardio +342 -0
  414. package/aardio/lib/com/activeX.aardio +275 -0
  415. package/aardio/lib/com/cad/_.aardio +403 -0
  416. package/aardio/lib/com/excel.aardio +180 -0
  417. package/aardio/lib/com/interface/IApplicationActivationManager.aardio +31 -0
  418. package/aardio/lib/com/interface/IApplicationAssociationRegistration.aardio +359 -0
  419. package/aardio/lib/com/interface/IAudioMeterInformation.aardio +17 -0
  420. package/aardio/lib/com/interface/IClassFactory.aardio +26 -0
  421. package/aardio/lib/com/interface/IClassFactory2.aardio +47 -0
  422. package/aardio/lib/com/interface/IComThreadingInfo.aardio +37 -0
  423. package/aardio/lib/com/interface/IDirect3D9.aardio +188 -0
  424. package/aardio/lib/com/interface/IEnumCodePage.aardio +14 -0
  425. package/aardio/lib/com/interface/IEnumGUID.aardio +26 -0
  426. package/aardio/lib/com/interface/IEnumShellItems.aardio +29 -0
  427. package/aardio/lib/com/interface/IFileDialog.aardio +101 -0
  428. package/aardio/lib/com/interface/IFileOpenDialog.aardio +97 -0
  429. package/aardio/lib/com/interface/IFileSaveDialog.aardio +22 -0
  430. package/aardio/lib/com/interface/IKsPropertySet.aardio +17 -0
  431. package/aardio/lib/com/interface/IModalWindow.aardio +13 -0
  432. package/aardio/lib/com/interface/IMultiLanguage2.aardio +285 -0
  433. package/aardio/lib/com/interface/IOleControl.aardio +41 -0
  434. package/aardio/lib/com/interface/IOleWindow.aardio +29 -0
  435. package/aardio/lib/com/interface/IPersist.aardio +12 -0
  436. package/aardio/lib/com/interface/IPersistFile.aardio +18 -0
  437. package/aardio/lib/com/interface/IPersistStreamInit.aardio +56 -0
  438. package/aardio/lib/com/interface/IPicture.aardio +187 -0
  439. package/aardio/lib/com/interface/IServiceProvider.aardio +16 -0
  440. package/aardio/lib/com/interface/IShellItem.aardio +48 -0
  441. package/aardio/lib/com/interface/IShellItemArray.aardio +20 -0
  442. package/aardio/lib/com/interface/IShellLink.aardio +35 -0
  443. package/aardio/lib/com/interface/IStream.aardio +26 -0
  444. package/aardio/lib/com/interface/ITaskbarList3.aardio +62 -0
  445. package/aardio/lib/com/interface/ITfInputProcessorProfileMgr.aardio +75 -0
  446. package/aardio/lib/com/interface/ITfInputProcessorProfiles.aardio +125 -0
  447. package/aardio/lib/com/interface/IUniformResourceLocator.aardio +18 -0
  448. package/aardio/lib/com/interface/IViewObject2.aardio +38 -0
  449. package/aardio/lib/com/interface/_.aardio +231 -0
  450. package/aardio/lib/com/lite.aardio +183 -0
  451. package/aardio/lib/com/oleDb.aardio +57 -0
  452. package/aardio/lib/com/picture.aardio +235 -0
  453. package/aardio/lib/com/sapi/voice.aardio +178 -0
  454. package/aardio/lib/com/shell.aardio +69 -0
  455. package/aardio/lib/com/smtp.aardio +286 -0
  456. package/aardio/lib/com/tlbDoc.aardio +145 -0
  457. package/aardio/lib/com/typeAttrs.aardio +35 -0
  458. package/aardio/lib/com/wmi.aardio +208 -0
  459. package/aardio/lib/console/_.aardio +917 -0
  460. package/aardio/lib/console/int.aardio +55 -0
  461. package/aardio/lib/console/progress.aardio +141 -0
  462. package/aardio/lib/console/wine.aardio +393 -0
  463. package/aardio/lib/coroutine/_.aardio +46 -0
  464. package/aardio/lib/crypt/_.aardio +919 -0
  465. package/aardio/lib/crypt/aes.aardio +58 -0
  466. package/aardio/lib/crypt/bin.aardio +68 -0
  467. package/aardio/lib/crypt/des.aardio +55 -0
  468. package/aardio/lib/crypt/hash.aardio +110 -0
  469. package/aardio/lib/crypt/hmac.aardio +64 -0
  470. package/aardio/lib/crypt/jwt.aardio +78 -0
  471. package/aardio/lib/crypt/protectData.aardio +51 -0
  472. package/aardio/lib/crypt/provParam.aardio +32 -0
  473. package/aardio/lib/crypt/rc4.aardio +32 -0
  474. package/aardio/lib/crypt/rsa.aardio +244 -0
  475. package/aardio/lib/debug/_.aardio +172 -0
  476. package/aardio/lib/debug/log.aardio +144 -0
  477. package/aardio/lib/dotNet/.res/Aardio.InteropServices/CCodeCompiler.cs +202 -0
  478. package/aardio/lib/dotNet/.res/Aardio.InteropServices/DispatchableDelegate.cs +362 -0
  479. package/aardio/lib/dotNet/.res/Aardio.InteropServices/Utility.cs +1469 -0
  480. package/aardio/lib/dotNet/.res/Aardio.InteropServices.csproj +51 -0
  481. package/aardio/lib/dotNet/.res/Aardio.PS/Aardio.PS.DynObject.cs +194 -0
  482. package/aardio/lib/dotNet/.res/Aardio.PS/Aardio.PS.cs +446 -0
  483. package/aardio/lib/dotNet/.res/Properties/AssemblyInfo.cs +20 -0
  484. package/aardio/lib/dotNet/.res/bin/Release/Aardio.InteropServices.dll +0 -0
  485. package/aardio/lib/dotNet/_.aardio +258 -0
  486. package/aardio/lib/dotNet/appDomain.aardio +967 -0
  487. package/aardio/lib/dotNet/audio/.res/Audio.dll +0 -0
  488. package/aardio/lib/dotNet/audio/.res/NAudio.dll +0 -0
  489. package/aardio/lib/dotNet/audio/.res/build.aardio +206 -0
  490. package/aardio/lib/dotNet/audio/_.aardio +94 -0
  491. package/aardio/lib/dotNet/clr.aardio +210 -0
  492. package/aardio/lib/dotNet/interface/IAppDomainSetup.aardio +31 -0
  493. package/aardio/lib/dotNet/interface/ICLRMetaHost.aardio +17 -0
  494. package/aardio/lib/dotNet/interface/ICLRRuntimeHost.aardio +35 -0
  495. package/aardio/lib/dotNet/interface/ICLRRuntimeInfo.aardio +23 -0
  496. package/aardio/lib/dotNet/interface/ICorRuntimeHost.aardio +30 -0
  497. package/aardio/lib/dotNet/nuget.aardio +67 -0
  498. package/aardio/lib/dotNet/ocr/.res/ocr.dll +0 -0
  499. package/aardio/lib/dotNet/ocr/_.aardio +275 -0
  500. package/aardio/lib/dotNet/ps.aardio +177 -0
  501. package/aardio/lib/dotNet/uwpCompiler.aardio +61 -0
  502. package/aardio/lib/dotNet/v2.aardio +19 -0
  503. package/aardio/lib/dotNet/v4.aardio +57 -0
  504. package/aardio/lib/dotNet/version.aardio +74 -0
  505. package/aardio/lib/electron/app/.build/aardio/index.d.ts +173 -0
  506. package/aardio/lib/electron/app/.build/aardio/index.js +636 -0
  507. package/aardio/lib/electron/app/.build/main.aardio +298 -0
  508. package/aardio/lib/electron/app/.build/ws.asar +0 -0
  509. package/aardio/lib/electron/app/_.aardio +731 -0
  510. package/aardio/lib/electron/runtime/_.aardio +50 -0
  511. package/aardio/lib/fastcgi/_.aardio +2 -0
  512. package/aardio/lib/fastcgi/client/_.aardio +807 -0
  513. package/aardio/lib/fastcgi/iisInstall.aardio +124 -0
  514. package/aardio/lib/fastcgi/nameValuePairs.aardio +93 -0
  515. package/aardio/lib/fastcgi/stream.aardio +100 -0
  516. package/aardio/lib/fonts/.res/FontAwesome.ttf +0 -0
  517. package/aardio/lib/fonts/.res/FontAwesomeDlg.ttf +0 -0
  518. package/aardio/lib/fonts/_.aardio +71 -0
  519. package/aardio/lib/fonts/fontAwesome.aardio +14 -0
  520. package/aardio/lib/fonts/fontAwesomeDlg.aardio +10 -0
  521. package/aardio/lib/fonts/httpFamily.aardio +21 -0
  522. package/aardio/lib/fsys/_.aardio +538 -0
  523. package/aardio/lib/fsys/acl.aardio +116 -0
  524. package/aardio/lib/fsys/asar/reader.aardio +346 -0
  525. package/aardio/lib/fsys/asar/writer.aardio +241 -0
  526. package/aardio/lib/fsys/batch.aardio +99 -0
  527. package/aardio/lib/fsys/cab/_.aardio +123 -0
  528. package/aardio/lib/fsys/cab/maker.aardio +105 -0
  529. package/aardio/lib/fsys/codepage.aardio +141 -0
  530. package/aardio/lib/fsys/config.aardio +69 -0
  531. package/aardio/lib/fsys/cookies.aardio +214 -0
  532. package/aardio/lib/fsys/dirWatcher.aardio +135 -0
  533. package/aardio/lib/fsys/dlg.aardio +214 -0
  534. package/aardio/lib/fsys/dlg.dir.aardio +24 -0
  535. package/aardio/lib/fsys/drives.aardio +58 -0
  536. package/aardio/lib/fsys/environment.aardio +58 -0
  537. package/aardio/lib/fsys/file.aardio +490 -0
  538. package/aardio/lib/fsys/fileInfo.aardio +68 -0
  539. package/aardio/lib/fsys/hardlink.aardio +26 -0
  540. package/aardio/lib/fsys/hosts.aardio +80 -0
  541. package/aardio/lib/fsys/info.aardio +40 -0
  542. package/aardio/lib/fsys/ini.aardio +176 -0
  543. package/aardio/lib/fsys/knownFolder.aardio +30 -0
  544. package/aardio/lib/fsys/lnk.aardio +404 -0
  545. package/aardio/lib/fsys/localfile.aardio +77 -0
  546. package/aardio/lib/fsys/log.aardio +150 -0
  547. package/aardio/lib/fsys/media.aardio +199 -0
  548. package/aardio/lib/fsys/mime.aardio +115 -0
  549. package/aardio/lib/fsys/mmap/_.aardio +233 -0
  550. package/aardio/lib/fsys/multipartFormData.aardio +188 -0
  551. package/aardio/lib/fsys/namedPipe.aardio +95 -0
  552. package/aardio/lib/fsys/partFile.aardio +186 -0
  553. package/aardio/lib/fsys/path.aardio +179 -0
  554. package/aardio/lib/fsys/remove.aardio +31 -0
  555. package/aardio/lib/fsys/res.aardio +149 -0
  556. package/aardio/lib/fsys/safepath.aardio +36 -0
  557. package/aardio/lib/fsys/shortcut.aardio +55 -0
  558. package/aardio/lib/fsys/size.aardio +39 -0
  559. package/aardio/lib/fsys/stream.aardio +276 -0
  560. package/aardio/lib/fsys/streamInfo.aardio +47 -0
  561. package/aardio/lib/fsys/table.aardio +102 -0
  562. package/aardio/lib/fsys/tar.aardio +181 -0
  563. package/aardio/lib/fsys/time.aardio +149 -0
  564. package/aardio/lib/fsys/untar.aardio +190 -0
  565. package/aardio/lib/fsys/update/app.aardio +171 -0
  566. package/aardio/lib/fsys/update/dlMgr.aardio +402 -0
  567. package/aardio/lib/fsys/update/maker.aardio +168 -0
  568. package/aardio/lib/fsys/update/simpleMain.aardio +292 -0
  569. package/aardio/lib/fsys/url.aardio +71 -0
  570. package/aardio/lib/fsys/version.aardio +157 -0
  571. package/aardio/lib/fsys/watch.aardio +76 -0
  572. package/aardio/lib/fsys/wow64.aardio +43 -0
  573. package/aardio/lib/gdi/_.aardio +846 -0
  574. package/aardio/lib/gdip/.res/feather.dll +0 -0
  575. package/aardio/lib/gdip/.res//347/274/226/350/257/221.aardio +14 -0
  576. package/aardio/lib/gdip/_.aardio +1004 -0
  577. package/aardio/lib/gdip/bitmap.aardio +497 -0
  578. package/aardio/lib/gdip/core.aardio +137 -0
  579. package/aardio/lib/gdip/exifTags.aardio +192 -0
  580. package/aardio/lib/gdip/family.aardio +91 -0
  581. package/aardio/lib/gdip/feather.aardio +74 -0
  582. package/aardio/lib/gdip/font.aardio +130 -0
  583. package/aardio/lib/gdip/graphics.aardio +739 -0
  584. package/aardio/lib/gdip/image.aardio +610 -0
  585. package/aardio/lib/gdip/imageAttributes.aardio +143 -0
  586. package/aardio/lib/gdip/installedFontCollection.aardio +19 -0
  587. package/aardio/lib/gdip/lineBrush.aardio +114 -0
  588. package/aardio/lib/gdip/path.aardio +171 -0
  589. package/aardio/lib/gdip/pathGradientBrush.aardio +93 -0
  590. package/aardio/lib/gdip/pen.aardio +206 -0
  591. package/aardio/lib/gdip/privateFontCollection.aardio +178 -0
  592. package/aardio/lib/gdip/snap.aardio +99 -0
  593. package/aardio/lib/gdip/solidBrush.aardio +63 -0
  594. package/aardio/lib/gdip/stringformat.aardio +112 -0
  595. package/aardio/lib/gdip/textureBrush.aardio +93 -0
  596. package/aardio/lib/godking/elistbar/_.aardio +552 -0
  597. package/aardio/lib/godking/elistbar/elistbar.dll +0 -0
  598. package/aardio/lib/golang/.res/aardio/aardio.go +44 -0
  599. package/aardio/lib/golang/.res/aardio/jsonrpc/jsonrpc.go +27 -0
  600. package/aardio/lib/golang/.res/aardio/jsonrpc/tcp/tcp.go +28 -0
  601. package/aardio/lib/golang/_.aardio +234 -0
  602. package/aardio/lib/golang/string.aardio +22 -0
  603. package/aardio/lib/ide/command.aardio +226 -0
  604. package/aardio/lib/ide/customCtrl.aardio +9 -0
  605. package/aardio/lib/ide/debug.aardio +61 -0
  606. package/aardio/lib/ide/doc/_.aardio +361 -0
  607. package/aardio/lib/ide/doc/markdown.aardio +164 -0
  608. package/aardio/lib/inet/_.aardio +446 -0
  609. package/aardio/lib/inet/adapter.aardio +175 -0
  610. package/aardio/lib/inet/adapterInfo.aardio +180 -0
  611. package/aardio/lib/inet/conn.aardio +80 -0
  612. package/aardio/lib/inet/connView.aardio +22 -0
  613. package/aardio/lib/inet/downBox.aardio +247 -0
  614. package/aardio/lib/inet/errorMessage.aardio +106 -0
  615. package/aardio/lib/inet/file.aardio +62 -0
  616. package/aardio/lib/inet/ftp.aardio +315 -0
  617. package/aardio/lib/inet/http.aardio +885 -0
  618. package/aardio/lib/inet/httpFile.aardio +312 -0
  619. package/aardio/lib/inet/httpStatusCode.aardio +143 -0
  620. package/aardio/lib/inet/installer.aardio +76 -0
  621. package/aardio/lib/inet/mac.aardio +49 -0
  622. package/aardio/lib/inet/ras.aardio +433 -0
  623. package/aardio/lib/inet/stat.aardio +78 -0
  624. package/aardio/lib/inet/tls.aardio +28 -0
  625. package/aardio/lib/inet/url.aardio +334 -0
  626. package/aardio/lib/inet/urlpart.aardio +41 -0
  627. package/aardio/lib/inet/util.aardio +54 -0
  628. package/aardio/lib/inet/whttp.aardio +988 -0
  629. package/aardio/lib/java/.build/main.aardio +10 -0
  630. package/aardio/lib/java/.interopServices/build.aardio +372 -0
  631. package/aardio/lib/java/.interopServices/utility.class +0 -0
  632. package/aardio/lib/java/.interopServices/utility.java +354 -0
  633. package/aardio/lib/java/_.aardio +1006 -0
  634. package/aardio/lib/java/class.aardio +295 -0
  635. package/aardio/lib/java/jdk/v6ora.aardio +23 -0
  636. package/aardio/lib/java/jdk/v8.aardio +53 -0
  637. package/aardio/lib/java/jdk/v8ora.aardio +23 -0
  638. package/aardio/lib/java/jre/v8.aardio +53 -0
  639. package/aardio/lib/java/jre/v8ora.aardio +37 -0
  640. package/aardio/lib/java/object.aardio +218 -0
  641. package/aardio/lib/java/path.aardio +451 -0
  642. package/aardio/lib/key/VK.aardio +641 -0
  643. package/aardio/lib/key/_.aardio +303 -0
  644. package/aardio/lib/key/hook.aardio +76 -0
  645. package/aardio/lib/key/hotkey/_.aardio +540 -0
  646. package/aardio/lib/key/ime.aardio +221 -0
  647. package/aardio/lib/key/ime.stateBar.aardio +346 -0
  648. package/aardio/lib/mouse/_.aardio +359 -0
  649. package/aardio/lib/mouse/cursor.aardio +43 -0
  650. package/aardio/lib/mouse/draw.aardio +314 -0
  651. package/aardio/lib/mouse/highlighter.aardio +193 -0
  652. package/aardio/lib/mouse/hook.aardio +79 -0
  653. package/aardio/lib/mouse/screenArea.aardio +102 -0
  654. package/aardio/lib/nodeJs/_.aardio +593 -0
  655. package/aardio/lib/preload/_.aardio +253 -0
  656. package/aardio/lib/preload/com.aardio +319 -0
  657. package/aardio/lib/preload/io.aardio +107 -0
  658. package/aardio/lib/preload/math.aardio +91 -0
  659. package/aardio/lib/preload/raw.aardio +105 -0
  660. package/aardio/lib/preload/string.aardio +224 -0
  661. package/aardio/lib/preload/struct.aardio +194 -0
  662. package/aardio/lib/preload/table.aardio +388 -0
  663. package/aardio/lib/preload/thread.aardio +341 -0
  664. package/aardio/lib/process/_.aardio +1510 -0
  665. package/aardio/lib/process/admin.aardio +110 -0
  666. package/aardio/lib/process/apiHook/_.aardio +141 -0
  667. package/aardio/lib/process/atom.aardio +32 -0
  668. package/aardio/lib/process/batch.aardio +89 -0
  669. package/aardio/lib/process/cache.aardio +95 -0
  670. package/aardio/lib/process/chm.aardio +14 -0
  671. package/aardio/lib/process/cmdline.aardio +42 -0
  672. package/aardio/lib/process/code.aardio +128 -0
  673. package/aardio/lib/process/command.aardio +226 -0
  674. package/aardio/lib/process/control.aardio +29 -0
  675. package/aardio/lib/process/curl/_.aardio +91 -0
  676. package/aardio/lib/process/ffmpeg.aardio +63 -0
  677. package/aardio/lib/process/file.aardio +118 -0
  678. package/aardio/lib/process/gcc/_.aardio +236 -0
  679. package/aardio/lib/process/gfortran/_.aardio +71 -0
  680. package/aardio/lib/process/heap.aardio +59 -0
  681. package/aardio/lib/process/imageView.aardio +13 -0
  682. package/aardio/lib/process/job/limitKill.aardio +107 -0
  683. package/aardio/lib/process/mutex.aardio +105 -0
  684. package/aardio/lib/process/php/5.2.aardio +7 -0
  685. package/aardio/lib/process/php/5.6.aardio +10 -0
  686. package/aardio/lib/process/php/_.aardio +119 -0
  687. package/aardio/lib/process/php/cgi.aardio +82 -0
  688. package/aardio/lib/process/popen.aardio +562 -0
  689. package/aardio/lib/process/python/.py/jsonrpyc.py +405 -0
  690. package/aardio/lib/process/python/_.aardio +380 -0
  691. package/aardio/lib/process/python/pip.aardio +143 -0
  692. package/aardio/lib/process/rpc/jsonClient.aardio +285 -0
  693. package/aardio/lib/process/rpc/jsonServer.aardio +293 -0
  694. package/aardio/lib/process/rpc/tcpJsonClient.aardio +36 -0
  695. package/aardio/lib/process/ruby/_.aardio +196 -0
  696. package/aardio/lib/process/ruby/cgi.aardio +76 -0
  697. package/aardio/lib/process/ruby/simpleHttpServer.aardio +44 -0
  698. package/aardio/lib/process/rundll.aardio +44 -0
  699. package/aardio/lib/process/rust/_.aardio +176 -0
  700. package/aardio/lib/process/temp.aardio +116 -0
  701. package/aardio/lib/process/token.aardio +122 -0
  702. package/aardio/lib/process/usage.aardio +74 -0
  703. package/aardio/lib/process/vswhere.aardio +63 -0
  704. package/aardio/lib/process/wmi.aardio +65 -0
  705. package/aardio/lib/process/wow64.aardio +34 -0
  706. package/aardio/lib/protobuf/message.aardio +348 -0
  707. package/aardio/lib/protobuf/parser/_.aardio +362 -0
  708. package/aardio/lib/protobuf/parser/lex.aardio +221 -0
  709. package/aardio/lib/protobuf/parser/message.aardio +315 -0
  710. package/aardio/lib/protobuf/parser/template.aardio +159 -0
  711. package/aardio/lib/protobuf/reader/inputString.aardio +58 -0
  712. package/aardio/lib/protobuf/type/bool.aardio +29 -0
  713. package/aardio/lib/protobuf/type/bytes.aardio +28 -0
  714. package/aardio/lib/protobuf/type/double.aardio +24 -0
  715. package/aardio/lib/protobuf/type/enum.aardio +29 -0
  716. package/aardio/lib/protobuf/type/fixed32.aardio +23 -0
  717. package/aardio/lib/protobuf/type/fixed64.aardio +24 -0
  718. package/aardio/lib/protobuf/type/float.aardio +25 -0
  719. package/aardio/lib/protobuf/type/int32.aardio +29 -0
  720. package/aardio/lib/protobuf/type/int64.aardio +30 -0
  721. package/aardio/lib/protobuf/type/map.aardio +84 -0
  722. package/aardio/lib/protobuf/type/scalar.aardio +12 -0
  723. package/aardio/lib/protobuf/type/sfixed32.aardio +22 -0
  724. package/aardio/lib/protobuf/type/sfixed64.aardio +22 -0
  725. package/aardio/lib/protobuf/type/sint32.aardio +41 -0
  726. package/aardio/lib/protobuf/type/sint64.aardio +41 -0
  727. package/aardio/lib/protobuf/type/string.aardio +28 -0
  728. package/aardio/lib/protobuf/type/uint32.aardio +28 -0
  729. package/aardio/lib/protobuf/type/uint64.aardio +28 -0
  730. package/aardio/lib/raw/apiHook.aardio +122 -0
  731. package/aardio/lib/raw/argsPointer/.res/argsPointer.def +4 -0
  732. package/aardio/lib/raw/argsPointer/.res/argsPointer.dll +0 -0
  733. package/aardio/lib/raw/argsPointer/.res/build.aardio +15 -0
  734. package/aardio/lib/raw/argsPointer/_.aardio +144 -0
  735. package/aardio/lib/raw/asm/opCode.aardio +101 -0
  736. package/aardio/lib/raw/cdeclParameter.aardio +121 -0
  737. package/aardio/lib/raw/fasm/.res/FASM.DLL +0 -0
  738. package/aardio/lib/raw/fasm/.res/LICENSE.TXT +37 -0
  739. package/aardio/lib/raw/fasm/_.aardio +138 -0
  740. package/aardio/lib/raw/functions.aardio +78 -0
  741. package/aardio/lib/raw/interface.aardio +83 -0
  742. package/aardio/lib/raw/jsonCall.aardio +18 -0
  743. package/aardio/lib/raw/memory.aardio +86 -0
  744. package/aardio/lib/raw/pefile.aardio +479 -0
  745. package/aardio/lib/raw/struct.aardio +116 -0
  746. package/aardio/lib/service/_.aardio +742 -0
  747. package/aardio/lib/service/simpleTool.aardio +73 -0
  748. package/aardio/lib/sessionHandler/default.aardio +106 -0
  749. package/aardio/lib/sevenZip/lzma/.res/LzmaUtil.dll +0 -0
  750. package/aardio/lib/sevenZip/lzma/_.aardio +139 -0
  751. package/aardio/lib/sevenZip/lzma/httpFile.aardio +157 -0
  752. package/aardio/lib/sevenZip/lzma/tar.aardio +25 -0
  753. package/aardio/lib/sqlServer/_.aardio +632 -0
  754. package/aardio/lib/sqlite/.res/sqlite3.dll +0 -0
  755. package/aardio/lib/sqlite/_.aardio +6 -0
  756. package/aardio/lib/sqlite/backup.aardio +88 -0
  757. package/aardio/lib/sqlite/base.aardio +967 -0
  758. package/aardio/lib/string/aasdl.aardio +35 -0
  759. package/aardio/lib/string/builder.aardio +212 -0
  760. package/aardio/lib/string/chineseNumber.aardio +216 -0
  761. package/aardio/lib/string/cmdline.aardio +154 -0
  762. package/aardio/lib/string/conv/.res/data.txt +405 -0
  763. package/aardio/lib/string/conv/_.aardio +89 -0
  764. package/aardio/lib/string/conv/pinyin.aardio +65 -0
  765. package/aardio/lib/string/database.aardio +182 -0
  766. package/aardio/lib/string/encoding.aardio +54 -0
  767. package/aardio/lib/string/fontRanges.aardio +117 -0
  768. package/aardio/lib/string/fuzzyMatching.aardio +98 -0
  769. package/aardio/lib/string/glob.aardio +79 -0
  770. package/aardio/lib/string/html.aardio +145 -0
  771. package/aardio/lib/string/intSegments.aardio +52 -0
  772. package/aardio/lib/string/keywords/.res/keywords.dll +0 -0
  773. package/aardio/lib/string/keywords/_.aardio +74 -0
  774. package/aardio/lib/string/list.aardio +266 -0
  775. package/aardio/lib/string/lrc.aardio +209 -0
  776. package/aardio/lib/string/markdown/.res/autolink.c +297 -0
  777. package/aardio/lib/string/markdown/.res/autolink.h +51 -0
  778. package/aardio/lib/string/markdown/.res/buffer.c +234 -0
  779. package/aardio/lib/string/markdown/.res/buffer.h +96 -0
  780. package/aardio/lib/string/markdown/.res/houdini.h +37 -0
  781. package/aardio/lib/string/markdown/.res/houdini_href_e.c +108 -0
  782. package/aardio/lib/string/markdown/.res/houdini_html_e.c +84 -0
  783. package/aardio/lib/string/markdown/.res/html.c +635 -0
  784. package/aardio/lib/string/markdown/.res/html.h +77 -0
  785. package/aardio/lib/string/markdown/.res/html_blocks.h +206 -0
  786. package/aardio/lib/string/markdown/.res/html_smartypants.c +389 -0
  787. package/aardio/lib/string/markdown/.res/markdown.c +2556 -0
  788. package/aardio/lib/string/markdown/.res/markdown.h +138 -0
  789. package/aardio/lib/string/markdown/.res/stack.c +81 -0
  790. package/aardio/lib/string/markdown/.res/stack.h +29 -0
  791. package/aardio/lib/string/markdown/.res/sundown.dll +0 -0
  792. package/aardio/lib/string/markdown/.res//347/224/237/346/210/220DLL.aardio +19 -0
  793. package/aardio/lib/string/markdown/_.aardio +231 -0
  794. package/aardio/lib/string/padding.aardio +54 -0
  795. package/aardio/lib/string/regex.aardio +43 -0
  796. package/aardio/lib/string/res.aardio +20 -0
  797. package/aardio/lib/string/stream.aardio +89 -0
  798. package/aardio/lib/string/template.aardio +21 -0
  799. package/aardio/lib/string/xml.aardio +573 -0
  800. package/aardio/lib/string/xxtea.aardio +103 -0
  801. package/aardio/lib/sys/_.aardio +71 -0
  802. package/aardio/lib/sys/acl.aardio +232 -0
  803. package/aardio/lib/sys/audioVolume/.res/Release/volumeCtrl2.dll +0 -0
  804. package/aardio/lib/sys/audioVolume/.res/stdafx.cpp +8 -0
  805. package/aardio/lib/sys/audioVolume/.res/stdafx.h +16 -0
  806. package/aardio/lib/sys/audioVolume/.res/targetver.h +8 -0
  807. package/aardio/lib/sys/audioVolume/.res/volumeCtrl2.cpp +446 -0
  808. package/aardio/lib/sys/audioVolume/.res/volumeCtrl2.h +52 -0
  809. package/aardio/lib/sys/audioVolume/.res/volumeCtrl2.vcxproj +93 -0
  810. package/aardio/lib/sys/audioVolume/_.aardio +102 -0
  811. package/aardio/lib/sys/baseBoard.aardio +78 -0
  812. package/aardio/lib/sys/comPort.aardio +56 -0
  813. package/aardio/lib/sys/cp210x.aardio +54 -0
  814. package/aardio/lib/sys/cpu.aardio +151 -0
  815. package/aardio/lib/sys/ddcci.aardio +198 -0
  816. package/aardio/lib/sys/device.aardio +217 -0
  817. package/aardio/lib/sys/display.aardio +49 -0
  818. package/aardio/lib/sys/displaySwitch.aardio +27 -0
  819. package/aardio/lib/sys/hd.aardio +152 -0
  820. package/aardio/lib/sys/info.aardio +40 -0
  821. package/aardio/lib/sys/input.aardio +92 -0
  822. package/aardio/lib/sys/installed.aardio +107 -0
  823. package/aardio/lib/sys/locale/_.aardio +103 -0
  824. package/aardio/lib/sys/locale/abbrevNames.aardio +148 -0
  825. package/aardio/lib/sys/mem.aardio +64 -0
  826. package/aardio/lib/sys/midiOut.aardio +415 -0
  827. package/aardio/lib/sys/monitor.aardio +216 -0
  828. package/aardio/lib/sys/mpPreference.aardio +159 -0
  829. package/aardio/lib/sys/networkCards.aardio +84 -0
  830. package/aardio/lib/sys/networkIsolation.aardio +160 -0
  831. package/aardio/lib/sys/power/_.aardio +180 -0
  832. package/aardio/lib/sys/power/notification.aardio +91 -0
  833. package/aardio/lib/sys/printer.aardio +271 -0
  834. package/aardio/lib/sys/qfe.aardio +14 -0
  835. package/aardio/lib/sys/reg.aardio +40 -0
  836. package/aardio/lib/sys/run.aardio +32 -0
  837. package/aardio/lib/sys/runAsTask.aardio +87 -0
  838. package/aardio/lib/sys/soundDevice.aardio +46 -0
  839. package/aardio/lib/sys/storage.aardio +173 -0
  840. package/aardio/lib/sys/upnp/nat.aardio +126 -0
  841. package/aardio/lib/sys/vc11.aardio +14 -0
  842. package/aardio/lib/sys/vc14.aardio +98 -0
  843. package/aardio/lib/sys/volume.aardio +134 -0
  844. package/aardio/lib/sys/wallpaper.aardio +45 -0
  845. package/aardio/lib/sys/wsa.aardio +98 -0
  846. package/aardio/lib/table/product.aardio +79 -0
  847. package/aardio/lib/table/zip.aardio +40 -0
  848. package/aardio/lib/tcc/.dll/RELICENSING +60 -0
  849. package/aardio/lib/tcc/.dll/libtcc.dll +0 -0
  850. package/aardio/lib/tcc/.dll/libtcc.h +100 -0
  851. package/aardio/lib/tcc/.res.tar.lzma +0 -0
  852. package/aardio/lib/tcc/_.aardio +311 -0
  853. package/aardio/lib/thread/apiHook.aardio +109 -0
  854. package/aardio/lib/thread/atom.aardio +27 -0
  855. package/aardio/lib/thread/cmdline.aardio +18 -0
  856. package/aardio/lib/thread/command.aardio +315 -0
  857. package/aardio/lib/thread/dlManager.aardio +211 -0
  858. package/aardio/lib/thread/event.aardio +97 -0
  859. package/aardio/lib/thread/manage.aardio +166 -0
  860. package/aardio/lib/thread/semaphore.aardio +86 -0
  861. package/aardio/lib/thread/shareHandle.aardio +49 -0
  862. package/aardio/lib/thread/table.aardio +193 -0
  863. package/aardio/lib/thread/token.aardio +58 -0
  864. package/aardio/lib/thread/works.aardio +198 -0
  865. package/aardio/lib/time/ntp.aardio +160 -0
  866. package/aardio/lib/time/ole.aardio +179 -0
  867. package/aardio/lib/time/performance.aardio +28 -0
  868. package/aardio/lib/time/timer.aardio +32 -0
  869. package/aardio/lib/time/zone.aardio +97 -0
  870. package/aardio/lib/ustring/_.aardio +305 -0
  871. package/aardio/lib/util/_.aardio +157 -0
  872. package/aardio/lib/util/metaProperty.aardio +100 -0
  873. package/aardio/lib/util/registry.aardio +46 -0
  874. package/aardio/lib/util/table.aardio +118 -0
  875. package/aardio/lib/web/_.aardio +50 -0
  876. package/aardio/lib/web/asynServer.aardio +12 -0
  877. package/aardio/lib/web/form/_.aardio +1572 -0
  878. package/aardio/lib/web/form/menu.aardio +63 -0
  879. package/aardio/lib/web/form/query.aardio +77 -0
  880. package/aardio/lib/web/form/snap.aardio +63 -0
  881. package/aardio/lib/web/form/sockpuppet.aardio +75 -0
  882. package/aardio/lib/web/form/util.aardio +194 -0
  883. package/aardio/lib/web/json.aardio +489 -0
  884. package/aardio/lib/web/layout/.res/HTMLayout.dll +0 -0
  885. package/aardio/lib/web/layout/.res/master.css +9 -0
  886. package/aardio/lib/web/layout/_.aardio +704 -0
  887. package/aardio/lib/web/layout/behavior/_.aardio +34 -0
  888. package/aardio/lib/web/layout/behavior/collapsibleByIcon.aardio +22 -0
  889. package/aardio/lib/web/layout/behavior/collapsibleList.aardio +37 -0
  890. package/aardio/lib/web/layout/behavior/dragable.aardio +71 -0
  891. package/aardio/lib/web/layout/behavior/dropdown.aardio +15 -0
  892. package/aardio/lib/web/layout/behavior/expandableList.aardio +97 -0
  893. package/aardio/lib/web/layout/behavior/grid.aardio +288 -0
  894. package/aardio/lib/web/layout/behavior/gripper.aardio +12 -0
  895. package/aardio/lib/web/layout/behavior/lightBoxDialog.aardio +76 -0
  896. package/aardio/lib/web/layout/behavior/path.aardio +14 -0
  897. package/aardio/lib/web/layout/behavior/popup.aardio +44 -0
  898. package/aardio/lib/web/layout/behavior/scroller.aardio +32 -0
  899. package/aardio/lib/web/layout/behavior/selectionBox.aardio +60 -0
  900. package/aardio/lib/web/layout/behavior/shellIcon.aardio +37 -0
  901. package/aardio/lib/web/layout/behavior/sizer.aardio +52 -0
  902. package/aardio/lib/web/layout/behavior/sortableGrid.aardio +63 -0
  903. package/aardio/lib/web/layout/behavior/splitter.aardio +134 -0
  904. package/aardio/lib/web/layout/behavior/tabs.aardio +438 -0
  905. package/aardio/lib/web/layout/behavior/windowCommand.aardio +163 -0
  906. package/aardio/lib/web/layout/behavior/windowSizer.aardio +117 -0
  907. package/aardio/lib/web/layout/debug.aardio +54 -0
  908. package/aardio/lib/web/layout/element/_.aardio +1388 -0
  909. package/aardio/lib/web/layout/element/state.aardio +133 -0
  910. package/aardio/lib/web/layout/element/style.aardio +46 -0
  911. package/aardio/lib/web/layout/event/_.aardio +1047 -0
  912. package/aardio/lib/web/layout/valueObject.aardio +402 -0
  913. package/aardio/lib/web/mshtml.aardio +233 -0
  914. package/aardio/lib/web/msxml.aardio +198 -0
  915. package/aardio/lib/web/multipartFormData.aardio +134 -0
  916. package/aardio/lib/web/nativeMessaging/_.aardio +101 -0
  917. package/aardio/lib/web/nativeMessaging/install.aardio +33 -0
  918. package/aardio/lib/web/npm/_.aardio +45 -0
  919. package/aardio/lib/web/parser.aardio +122 -0
  920. package/aardio/lib/web/rest/client.aardio +606 -0
  921. package/aardio/lib/web/rest/github.aardio +90 -0
  922. package/aardio/lib/web/rest/htmlClient.aardio +52 -0
  923. package/aardio/lib/web/rest/jsonClient.aardio +67 -0
  924. package/aardio/lib/web/rest/jsonLiteClient.aardio +67 -0
  925. package/aardio/lib/web/rest/qywx.aardio +85 -0
  926. package/aardio/lib/web/rest/smsActivate/_.aardio +266 -0
  927. package/aardio/lib/web/rest/smsActivate/countryList.aardio +206 -0
  928. package/aardio/lib/web/rest/smsActivate/serviceList.aardio +548 -0
  929. package/aardio/lib/web/rest/xmlClient.aardio +28 -0
  930. package/aardio/lib/web/rpc/externalServer.aardio +257 -0
  931. package/aardio/lib/web/rpc/jsonClient.aardio +234 -0
  932. package/aardio/lib/web/rpc/jsonServer.aardio +244 -0
  933. package/aardio/lib/web/script/_.aardio +201 -0
  934. package/aardio/lib/web/script/es5.aardio +2259 -0
  935. package/aardio/lib/web/script/json.aardio +56 -0
  936. package/aardio/lib/web/simpleServer.aardio +20 -0
  937. package/aardio/lib/web/soapClient/_.aardio +241 -0
  938. package/aardio/lib/web/soapClient/parameters.aardio +87 -0
  939. package/aardio/lib/web/socket/chrome.aardio +122 -0
  940. package/aardio/lib/web/socket/client.aardio +515 -0
  941. package/aardio/lib/web/socket/jsonClient.aardio +274 -0
  942. package/aardio/lib/web/socket/jsonServer.aardio +322 -0
  943. package/aardio/lib/web/socket/server.aardio +533 -0
  944. package/aardio/lib/web/ui/_.aardio +291 -0
  945. package/aardio/lib/web/uploadData.aardio +34 -0
  946. package/aardio/lib/web/view/.res/webview.dll +0 -0
  947. package/aardio/lib/web/view/_.aardio +635 -0
  948. package/aardio/lib/web/view/dev.aardio +146 -0
  949. package/aardio/lib/win/#DEFINE.aardio +7002 -0
  950. package/aardio/lib/win/_.aardio +1027 -0
  951. package/aardio/lib/win/animate.aardio +81 -0
  952. package/aardio/lib/win/api.aardio +57 -0
  953. package/aardio/lib/win/appBar.aardio +136 -0
  954. package/aardio/lib/win/clip/_.aardio +83 -0
  955. package/aardio/lib/win/clip/file.aardio +94 -0
  956. package/aardio/lib/win/clip/gif.aardio +30 -0
  957. package/aardio/lib/win/clip/html.aardio +128 -0
  958. package/aardio/lib/win/clip/png.aardio +47 -0
  959. package/aardio/lib/win/clip/viewer.aardio +44 -0
  960. package/aardio/lib/win/cur.aardio +58 -0
  961. package/aardio/lib/win/debounce.aardio +20 -0
  962. package/aardio/lib/win/dlg/_.aardio +7 -0
  963. package/aardio/lib/win/dlg/chineseNumber.aardio +220 -0
  964. package/aardio/lib/win/dlg/color.aardio +35 -0
  965. package/aardio/lib/win/dlg/ctrlColor.aardio +49 -0
  966. package/aardio/lib/win/dlg/findReplace.aardio +117 -0
  967. package/aardio/lib/win/dlg/font.aardio +53 -0
  968. package/aardio/lib/win/dlg/message.aardio +305 -0
  969. package/aardio/lib/win/dlg/print.aardio +99 -0
  970. package/aardio/lib/win/font.aardio +174 -0
  971. package/aardio/lib/win/guid.aardio +137 -0
  972. package/aardio/lib/win/image.aardio +204 -0
  973. package/aardio/lib/win/imageList.aardio +145 -0
  974. package/aardio/lib/win/inputBox.aardio +66 -0
  975. package/aardio/lib/win/messageFilter.aardio +44 -0
  976. package/aardio/lib/win/ole/_.aardio +25 -0
  977. package/aardio/lib/win/path.aardio +85 -0
  978. package/aardio/lib/win/property.aardio +21 -0
  979. package/aardio/lib/win/reg.aardio +530 -0
  980. package/aardio/lib/win/region/_.aardio +33 -0
  981. package/aardio/lib/win/region/bitmap/.res/build.aardio +257 -0
  982. package/aardio/lib/win/region/bitmap/.res/c.dll +0 -0
  983. package/aardio/lib/win/region/bitmap/_.aardio +108 -0
  984. package/aardio/lib/win/region/hole.aardio +56 -0
  985. package/aardio/lib/win/region/png/.res/build.aardio +41 -0
  986. package/aardio/lib/win/region/png/.res/c.dll +0 -0
  987. package/aardio/lib/win/region/png/_.aardio +108 -0
  988. package/aardio/lib/win/region/round.aardio +69 -0
  989. package/aardio/lib/win/region/transparent.aardio +38 -0
  990. package/aardio/lib/win/rt/bcp47.aardio +102 -0
  991. package/aardio/lib/win/rt/hString.aardio +105 -0
  992. package/aardio/lib/win/subclass.aardio +38 -0
  993. package/aardio/lib/win/taskScheduler.aardio +194 -0
  994. package/aardio/lib/win/timer.aardio +86 -0
  995. package/aardio/lib/win/ts/_.aardio +155 -0
  996. package/aardio/lib/win/ts/changeNotification.aardio +56 -0
  997. package/aardio/lib/win/ui/_.aardio +1897 -0
  998. package/aardio/lib/win/ui/accelerator.aardio +87 -0
  999. package/aardio/lib/win/ui/atom.aardio +57 -0
  1000. package/aardio/lib/win/ui/background.aardio +204 -0
  1001. package/aardio/lib/win/ui/ctrl/_.aardio +193 -0
  1002. package/aardio/lib/win/ui/ctrl/atlax.aardio +125 -0
  1003. package/aardio/lib/win/ui/ctrl/bk.aardio +191 -0
  1004. package/aardio/lib/win/ui/ctrl/bkplus.aardio +306 -0
  1005. package/aardio/lib/win/ui/ctrl/button.aardio +348 -0
  1006. package/aardio/lib/win/ui/ctrl/calendar.aardio +135 -0
  1007. package/aardio/lib/win/ui/ctrl/checklist.aardio +33 -0
  1008. package/aardio/lib/win/ui/ctrl/close.aardio +62 -0
  1009. package/aardio/lib/win/ui/ctrl/combobox.aardio +343 -0
  1010. package/aardio/lib/win/ui/ctrl/custom.aardio +159 -0
  1011. package/aardio/lib/win/ui/ctrl/datetimepick.aardio +185 -0
  1012. package/aardio/lib/win/ui/ctrl/edit.aardio +671 -0
  1013. package/aardio/lib/win/ui/ctrl/hotkey.aardio +126 -0
  1014. package/aardio/lib/win/ui/ctrl/ipaddress.aardio +134 -0
  1015. package/aardio/lib/win/ui/ctrl/listbox.aardio +323 -0
  1016. package/aardio/lib/win/ui/ctrl/listview.aardio +1642 -0
  1017. package/aardio/lib/win/ui/ctrl/metaProperty/_.aardio +1220 -0
  1018. package/aardio/lib/win/ui/ctrl/pick/.res/color.cur +0 -0
  1019. package/aardio/lib/win/ui/ctrl/pick/.res/color.png +0 -0
  1020. package/aardio/lib/win/ui/ctrl/pick/_.aardio +1010 -0
  1021. package/aardio/lib/win/ui/ctrl/picturebox.aardio +183 -0
  1022. package/aardio/lib/win/ui/ctrl/plus.aardio +2086 -0
  1023. package/aardio/lib/win/ui/ctrl/progress.aardio +149 -0
  1024. package/aardio/lib/win/ui/ctrl/richedit.aardio +916 -0
  1025. package/aardio/lib/win/ui/ctrl/scrollbar.aardio +153 -0
  1026. package/aardio/lib/win/ui/ctrl/spin.aardio +216 -0
  1027. package/aardio/lib/win/ui/ctrl/splitter.aardio +261 -0
  1028. package/aardio/lib/win/ui/ctrl/static.aardio +167 -0
  1029. package/aardio/lib/win/ui/ctrl/syslink.aardio +132 -0
  1030. package/aardio/lib/win/ui/ctrl/tab.aardio +312 -0
  1031. package/aardio/lib/win/ui/ctrl/thread.aardio +86 -0
  1032. package/aardio/lib/win/ui/ctrl/trackbar.aardio +274 -0
  1033. package/aardio/lib/win/ui/ctrl/treeview.aardio +1051 -0
  1034. package/aardio/lib/win/ui/ctrl/vlistview.aardio +17 -0
  1035. package/aardio/lib/win/ui/explorer.aardio +243 -0
  1036. package/aardio/lib/win/ui/fade.aardio +65 -0
  1037. package/aardio/lib/win/ui/grid.aardio +224 -0
  1038. package/aardio/lib/win/ui/layered.aardio +189 -0
  1039. package/aardio/lib/win/ui/layeredRound.aardio +18 -0
  1040. package/aardio/lib/win/ui/listEdit.aardio +93 -0
  1041. package/aardio/lib/win/ui/listPopup.aardio +130 -0
  1042. package/aardio/lib/win/ui/localization.aardio +18 -0
  1043. package/aardio/lib/win/ui/mask.aardio +51 -0
  1044. package/aardio/lib/win/ui/menu.aardio +646 -0
  1045. package/aardio/lib/win/ui/minmax.aardio +133 -0
  1046. package/aardio/lib/win/ui/orphanPlus.aardio +62 -0
  1047. package/aardio/lib/win/ui/resizeBorder.aardio +75 -0
  1048. package/aardio/lib/win/ui/scrollbar.aardio +121 -0
  1049. package/aardio/lib/win/ui/shadow.aardio +274 -0
  1050. package/aardio/lib/win/ui/simpleWindow.aardio +124 -0
  1051. package/aardio/lib/win/ui/simpleWindow2.aardio +84 -0
  1052. package/aardio/lib/win/ui/simpleWindow3.aardio +45 -0
  1053. package/aardio/lib/win/ui/statusbar.aardio +185 -0
  1054. package/aardio/lib/win/ui/tabs.aardio +1312 -0
  1055. package/aardio/lib/win/ui/toolbar.aardio +415 -0
  1056. package/aardio/lib/win/ui/tooltip.aardio +490 -0
  1057. package/aardio/lib/win/ui/tracker.aardio +289 -0
  1058. package/aardio/lib/win/util/autoComplete.aardio +34 -0
  1059. package/aardio/lib/win/util/changeNotification.aardio +196 -0
  1060. package/aardio/lib/win/util/desktop.aardio +123 -0
  1061. package/aardio/lib/win/util/deviceNotification.aardio +217 -0
  1062. package/aardio/lib/win/util/lyric.aardio +111 -0
  1063. package/aardio/lib/win/util/popup.aardio +98 -0
  1064. package/aardio/lib/win/util/round.aardio +8 -0
  1065. package/aardio/lib/win/util/savePosition.aardio +51 -0
  1066. package/aardio/lib/win/util/shellhook.aardio +43 -0
  1067. package/aardio/lib/win/util/tray.aardio +197 -0
  1068. package/aardio/lib/win/version.aardio +177 -0
  1069. package/aardio/lib/win/versionEx.aardio +70 -0
  1070. package/aardio/lib/winex/_.aardio +740 -0
  1071. package/aardio/lib/winex/accObject/_.aardio +287 -0
  1072. package/aardio/lib/winex/accObject/element.aardio +235 -0
  1073. package/aardio/lib/winex/caret.aardio +73 -0
  1074. package/aardio/lib/winex/ctrl/_.aardio +4 -0
  1075. package/aardio/lib/winex/ctrl/edit.aardio +44 -0
  1076. package/aardio/lib/winex/ctrl/listview.aardio +383 -0
  1077. package/aardio/lib/winex/desktop.aardio +22 -0
  1078. package/aardio/lib/winex/key.aardio +102 -0
  1079. package/aardio/lib/winex/mouse.aardio +137 -0
  1080. package/aardio/lib/winex/selection.aardio +113 -0
  1081. package/aardio/lib/winex/tooltip.aardio +88 -0
  1082. package/aardio/lib/wsock/_.aardio +794 -0
  1083. package/aardio/lib/wsock/addrInfo.aardio +74 -0
  1084. package/aardio/lib/wsock/err.aardio +115 -0
  1085. package/aardio/lib/wsock/networkChange.aardio +69 -0
  1086. package/aardio/lib/wsock/tcp/asynClient.aardio +320 -0
  1087. package/aardio/lib/wsock/tcp/asynHttpServer.aardio +898 -0
  1088. package/aardio/lib/wsock/tcp/asynServer.aardio +323 -0
  1089. package/aardio/lib/wsock/tcp/client.aardio +722 -0
  1090. package/aardio/lib/wsock/tcp/jsonClient.aardio +243 -0
  1091. package/aardio/lib/wsock/tcp/server.aardio +153 -0
  1092. package/aardio/lib/wsock/tcp/simpleHttpServer.aardio +903 -0
  1093. package/aardio/lib/wsock/tcp/socks5Client.aardio +129 -0
  1094. package/aardio/lib/wsock/udp/asynClient.aardio +62 -0
  1095. package/aardio/lib/wsock/udp/client.aardio +210 -0
  1096. package/aardio/lib/wsock/udp/ssdpClient.aardio +71 -0
  1097. package/aardio/lib/zlib/.res/zlibwapi.dll +0 -0
  1098. package/aardio/lib/zlib/_.aardio +404 -0
  1099. package/aardio/lib/zlib/httpFile.aardio +160 -0
  1100. package/aardio/lib/zlib/installer.aardio +66 -0
  1101. package/aardio/lib/zlib/unzip.aardio +261 -0
  1102. package/aardio/lib/zlib/zip.aardio +185 -0
  1103. package/aardio/project/aview/.build/default.Manifest.xml +61 -0
  1104. package/aardio/project/aview/.build/default.init.aardio +2 -0
  1105. package/aardio/project/aview/.build/default.main.aardio +6 -0
  1106. package/aardio/project/aview/.build/mp.lock +1 -0
  1107. package/aardio/project/aview/.build/update-maker.table +6 -0
  1108. package/aardio/project/aview/default.aproj +8 -0
  1109. package/aardio/project/aview/lib/aview/_.aardio +339 -0
  1110. package/aardio/project/aview/lib/aview/patch.aardio +411 -0
  1111. package/aardio/project/aview/lib/com/lite2.aardio +27 -0
  1112. package/aardio/project/aview/lib/fsys/file2.aardio +80 -0
  1113. package/aardio/project/aview/lib/fsys/update/simpleMain2.aardio +291 -0
  1114. package/aardio/project/aview/lib/key/hotkey2/_.aardio +552 -0
  1115. package/aardio/project/aview/lib/process/default.aardio +17 -0
  1116. package/aardio/project/aview/lib/process/popen2.aardio +75 -0
  1117. package/aardio/project/aview/lib/web/view2/_.aardio +706 -0
  1118. package/aardio/project/aview/lib/win/ui/menu2.aardio +154 -0
  1119. package/aardio/project/aview/main.aardio +124 -0
  1120. package/aardio/project/aview/res/env.d.ts +23 -0
  1121. package/aardio/project/aview/res/index.js +641 -0
  1122. package/aardio/project/aview/res/index.ts +1116 -0
  1123. package/aardio/project/aview/res/tsconfig.json +103 -0
  1124. package/bin/aview.js +2 -0
  1125. package/dist/node/cli.js +1 -0
  1126. package/index.js +1 -0
  1127. package/package.json +19 -0
@@ -0,0 +1,2556 @@
1
+ /* markdown.c - generic markdown parser */
2
+
3
+ /*
4
+ * Copyright (c) 2009, Natacha Porté
5
+ * Copyright (c) 2011, Vicent Marti
6
+ *
7
+ * Permission to use, copy, modify, and distribute this software for any
8
+ * purpose with or without fee is hereby granted, provided that the above
9
+ * copyright notice and this permission notice appear in all copies.
10
+ *
11
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18
+ */
19
+
20
+ #include "markdown.h"
21
+ #include "stack.h"
22
+
23
+ #include <assert.h>
24
+ #include <string.h>
25
+ #include <ctype.h>
26
+ #include <stdio.h>
27
+
28
+ #if defined(_WIN32)
29
+ #define strncasecmp _strnicmp
30
+ #endif
31
+
32
+ #define REF_TABLE_SIZE 8
33
+
34
+ #define BUFFER_BLOCK 0
35
+ #define BUFFER_SPAN 1
36
+
37
+ #define MKD_LI_END 8 /* internal list flag */
38
+
39
+ #define gperf_case_strncmp(s1, s2, n) strncasecmp(s1, s2, n)
40
+ #define GPERF_DOWNCASE 1
41
+ #define GPERF_CASE_STRNCMP 1
42
+ #include "html_blocks.h"
43
+
44
+ /***************
45
+ * LOCAL TYPES *
46
+ ***************/
47
+
48
+ /* link_ref: reference to a link */
49
+ struct link_ref {
50
+ unsigned int id;
51
+
52
+ struct buf *link;
53
+ struct buf *title;
54
+
55
+ struct link_ref *next;
56
+ };
57
+
58
+ /* char_trigger: function pointer to render active chars */
59
+ /* returns the number of chars taken care of */
60
+ /* data is the pointer of the beginning of the span */
61
+ /* offset is the number of valid chars before data */
62
+ struct sd_markdown;
63
+ typedef size_t
64
+ (*char_trigger)(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
65
+
66
+ static size_t char_emphasis(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
67
+ static size_t char_linebreak(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
68
+ static size_t char_codespan(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
69
+ static size_t char_escape(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
70
+ static size_t char_entity(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
71
+ static size_t char_langle_tag(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
72
+ static size_t char_autolink_url(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
73
+ static size_t char_autolink_email(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
74
+ static size_t char_autolink_www(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
75
+ static size_t char_link(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
76
+ static size_t char_superscript(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);
77
+
78
+ enum markdown_char_t {
79
+ MD_CHAR_NONE = 0,
80
+ MD_CHAR_EMPHASIS,
81
+ MD_CHAR_CODESPAN,
82
+ MD_CHAR_LINEBREAK,
83
+ MD_CHAR_LINK,
84
+ MD_CHAR_LANGLE,
85
+ MD_CHAR_ESCAPE,
86
+ MD_CHAR_ENTITITY,
87
+ MD_CHAR_AUTOLINK_URL,
88
+ MD_CHAR_AUTOLINK_EMAIL,
89
+ MD_CHAR_AUTOLINK_WWW,
90
+ MD_CHAR_SUPERSCRIPT,
91
+ };
92
+
93
+ static char_trigger markdown_char_ptrs[] = {
94
+ NULL,
95
+ &char_emphasis,
96
+ &char_codespan,
97
+ &char_linebreak,
98
+ &char_link,
99
+ &char_langle_tag,
100
+ &char_escape,
101
+ &char_entity,
102
+ &char_autolink_url,
103
+ &char_autolink_email,
104
+ &char_autolink_www,
105
+ &char_superscript,
106
+ };
107
+
108
+ /* render • structure containing one particular render */
109
+ struct sd_markdown {
110
+ struct sd_callbacks cb;
111
+ void *opaque;
112
+
113
+ struct link_ref *refs[REF_TABLE_SIZE];
114
+ uint8_t active_char[256];
115
+ struct stack work_bufs[2];
116
+ unsigned int ext_flags;
117
+ size_t max_nesting;
118
+ int in_link_body;
119
+ };
120
+
121
+ /***************************
122
+ * HELPER FUNCTIONS *
123
+ ***************************/
124
+
125
+ static inline struct buf *
126
+ rndr_newbuf(struct sd_markdown *rndr, int type)
127
+ {
128
+ static const size_t buf_size[2] = {256, 64};
129
+ struct buf *work = NULL;
130
+ struct stack *pool = &rndr->work_bufs[type];
131
+
132
+ if (pool->size < pool->asize &&
133
+ pool->item[pool->size] != NULL) {
134
+ work = pool->item[pool->size++];
135
+ work->size = 0;
136
+ } else {
137
+ work = bufnew(buf_size[type]);
138
+ stack_push(pool, work);
139
+ }
140
+
141
+ return work;
142
+ }
143
+
144
+ static inline void
145
+ rndr_popbuf(struct sd_markdown *rndr, int type)
146
+ {
147
+ rndr->work_bufs[type].size--;
148
+ }
149
+
150
+ static void
151
+ unscape_text(struct buf *ob, struct buf *src)
152
+ {
153
+ size_t i = 0, org;
154
+ while (i < src->size) {
155
+ org = i;
156
+ while (i < src->size && src->data[i] != '\\')
157
+ i++;
158
+
159
+ if (i > org)
160
+ bufput(ob, src->data + org, i - org);
161
+
162
+ if (i + 1 >= src->size)
163
+ break;
164
+
165
+ bufputc(ob, src->data[i + 1]);
166
+ i += 2;
167
+ }
168
+ }
169
+
170
+ static unsigned int
171
+ hash_link_ref(const uint8_t *link_ref, size_t length)
172
+ {
173
+ size_t i;
174
+ unsigned int hash = 0;
175
+
176
+ for (i = 0; i < length; ++i)
177
+ hash = tolower(link_ref[i]) + (hash << 6) + (hash << 16) - hash;
178
+
179
+ return hash;
180
+ }
181
+
182
+ static struct link_ref *
183
+ add_link_ref(
184
+ struct link_ref **references,
185
+ const uint8_t *name, size_t name_size)
186
+ {
187
+ struct link_ref *ref = calloc(1, sizeof(struct link_ref));
188
+
189
+ if (!ref)
190
+ return NULL;
191
+
192
+ ref->id = hash_link_ref(name, name_size);
193
+ ref->next = references[ref->id % REF_TABLE_SIZE];
194
+
195
+ references[ref->id % REF_TABLE_SIZE] = ref;
196
+ return ref;
197
+ }
198
+
199
+ static struct link_ref *
200
+ find_link_ref(struct link_ref **references, uint8_t *name, size_t length)
201
+ {
202
+ unsigned int hash = hash_link_ref(name, length);
203
+ struct link_ref *ref = NULL;
204
+
205
+ ref = references[hash % REF_TABLE_SIZE];
206
+
207
+ while (ref != NULL) {
208
+ if (ref->id == hash)
209
+ return ref;
210
+
211
+ ref = ref->next;
212
+ }
213
+
214
+ return NULL;
215
+ }
216
+
217
+ static void
218
+ free_link_refs(struct link_ref **references)
219
+ {
220
+ size_t i;
221
+
222
+ for (i = 0; i < REF_TABLE_SIZE; ++i) {
223
+ struct link_ref *r = references[i];
224
+ struct link_ref *next;
225
+
226
+ while (r) {
227
+ next = r->next;
228
+ bufrelease(r->link);
229
+ bufrelease(r->title);
230
+ free(r);
231
+ r = next;
232
+ }
233
+ }
234
+ }
235
+
236
+ /*
237
+ * Check whether a char is a Markdown space.
238
+
239
+ * Right now we only consider spaces the actual
240
+ * space and a newline: tabs and carriage returns
241
+ * are filtered out during the preprocessing phase.
242
+ *
243
+ * If we wanted to actually be UTF-8 compliant, we
244
+ * should instead extract an Unicode codepoint from
245
+ * this character and check for space properties.
246
+ */
247
+ static inline int
248
+ _isspace(int c)
249
+ {
250
+ return c == ' ' || c == '\n';
251
+ }
252
+
253
+ /****************************
254
+ * INLINE PARSING FUNCTIONS *
255
+ ****************************/
256
+
257
+ /* is_mail_autolink • looks for the address part of a mail autolink and '>' */
258
+ /* this is less strict than the original markdown e-mail address matching */
259
+ static size_t
260
+ is_mail_autolink(uint8_t *data, size_t size)
261
+ {
262
+ size_t i = 0, nb = 0;
263
+
264
+ /* address is assumed to be: [-@._a-zA-Z0-9]+ with exactly one '@' */
265
+ for (i = 0; i < size; ++i) {
266
+ if (isalnum(data[i]))
267
+ continue;
268
+
269
+ switch (data[i]) {
270
+ case '@':
271
+ nb++;
272
+
273
+ case '-':
274
+ case '.':
275
+ case '_':
276
+ break;
277
+
278
+ case '>':
279
+ return (nb == 1) ? i + 1 : 0;
280
+
281
+ default:
282
+ return 0;
283
+ }
284
+ }
285
+
286
+ return 0;
287
+ }
288
+
289
+ /* tag_length • returns the length of the given tag, or 0 is it's not valid */
290
+ static size_t
291
+ tag_length(uint8_t *data, size_t size, enum mkd_autolink *autolink)
292
+ {
293
+ size_t i, j;
294
+
295
+ /* a valid tag can't be shorter than 3 chars */
296
+ if (size < 3) return 0;
297
+
298
+ /* begins with a '<' optionally followed by '/', followed by letter or number */
299
+ if (data[0] != '<') return 0;
300
+ i = (data[1] == '/') ? 2 : 1;
301
+
302
+ if (!isalnum(data[i]))
303
+ return 0;
304
+
305
+ /* scheme test */
306
+ *autolink = MKDA_NOT_AUTOLINK;
307
+
308
+ /* try to find the beginning of an URI */
309
+ while (i < size && (isalnum(data[i]) || data[i] == '.' || data[i] == '+' || data[i] == '-'))
310
+ i++;
311
+
312
+ if (i > 1 && data[i] == '@') {
313
+ if ((j = is_mail_autolink(data + i, size - i)) != 0) {
314
+ *autolink = MKDA_EMAIL;
315
+ return i + j;
316
+ }
317
+ }
318
+
319
+ if (i > 2 && data[i] == ':') {
320
+ *autolink = MKDA_NORMAL;
321
+ i++;
322
+ }
323
+
324
+ /* completing autolink test: no whitespace or ' or " */
325
+ if (i >= size)
326
+ *autolink = MKDA_NOT_AUTOLINK;
327
+
328
+ else if (*autolink) {
329
+ j = i;
330
+
331
+ while (i < size) {
332
+ if (data[i] == '\\') i += 2;
333
+ else if (data[i] == '>' || data[i] == '\'' ||
334
+ data[i] == '"' || data[i] == ' ' || data[i] == '\n')
335
+ break;
336
+ else i++;
337
+ }
338
+
339
+ if (i >= size) return 0;
340
+ if (i > j && data[i] == '>') return i + 1;
341
+ /* one of the forbidden chars has been found */
342
+ *autolink = MKDA_NOT_AUTOLINK;
343
+ }
344
+
345
+ /* looking for sometinhg looking like a tag end */
346
+ while (i < size && data[i] != '>') i++;
347
+ if (i >= size) return 0;
348
+ return i + 1;
349
+ }
350
+
351
+ /* parse_inline • parses inline markdown elements */
352
+ static void
353
+ parse_inline(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
354
+ {
355
+ size_t i = 0, end = 0;
356
+ uint8_t action = 0;
357
+ struct buf work = { 0, 0, 0, 0 };
358
+
359
+ if (rndr->work_bufs[BUFFER_SPAN].size +
360
+ rndr->work_bufs[BUFFER_BLOCK].size > rndr->max_nesting)
361
+ return;
362
+
363
+ while (i < size) {
364
+ /* copying inactive chars into the output */
365
+ while (end < size && (action = rndr->active_char[data[end]]) == 0) {
366
+ end++;
367
+ }
368
+
369
+ if (rndr->cb.normal_text) {
370
+ work.data = data + i;
371
+ work.size = end - i;
372
+ rndr->cb.normal_text(ob, &work, rndr->opaque);
373
+ }
374
+ else
375
+ bufput(ob, data + i, end - i);
376
+
377
+ if (end >= size) break;
378
+ i = end;
379
+
380
+ end = markdown_char_ptrs[(int)action](ob, rndr, data + i, i, size - i);
381
+ if (!end) /* no action from the callback */
382
+ end = i + 1;
383
+ else {
384
+ i += end;
385
+ end = i;
386
+ }
387
+ }
388
+ }
389
+
390
+ /* find_emph_char • looks for the next emph uint8_t, skipping other constructs */
391
+ static size_t
392
+ find_emph_char(uint8_t *data, size_t size, uint8_t c)
393
+ {
394
+ size_t i = 1;
395
+
396
+ while (i < size) {
397
+ while (i < size && data[i] != c && data[i] != '`' && data[i] != '[')
398
+ i++;
399
+
400
+ if (i == size)
401
+ return 0;
402
+
403
+ if (data[i] == c)
404
+ return i;
405
+
406
+ /* not counting escaped chars */
407
+ if (i && data[i - 1] == '\\') {
408
+ i++; continue;
409
+ }
410
+
411
+ if (data[i] == '`') {
412
+ size_t span_nb = 0, bt;
413
+ size_t tmp_i = 0;
414
+
415
+ /* counting the number of opening backticks */
416
+ while (i < size && data[i] == '`') {
417
+ i++; span_nb++;
418
+ }
419
+
420
+ if (i >= size) return 0;
421
+
422
+ /* finding the matching closing sequence */
423
+ bt = 0;
424
+ while (i < size && bt < span_nb) {
425
+ if (!tmp_i && data[i] == c) tmp_i = i;
426
+ if (data[i] == '`') bt++;
427
+ else bt = 0;
428
+ i++;
429
+ }
430
+
431
+ if (i >= size) return tmp_i;
432
+ }
433
+ /* skipping a link */
434
+ else if (data[i] == '[') {
435
+ size_t tmp_i = 0;
436
+ uint8_t cc;
437
+
438
+ i++;
439
+ while (i < size && data[i] != ']') {
440
+ if (!tmp_i && data[i] == c) tmp_i = i;
441
+ i++;
442
+ }
443
+
444
+ i++;
445
+ while (i < size && (data[i] == ' ' || data[i] == '\n'))
446
+ i++;
447
+
448
+ if (i >= size)
449
+ return tmp_i;
450
+
451
+ switch (data[i]) {
452
+ case '[':
453
+ cc = ']'; break;
454
+
455
+ case '(':
456
+ cc = ')'; break;
457
+
458
+ default:
459
+ if (tmp_i)
460
+ return tmp_i;
461
+ else
462
+ continue;
463
+ }
464
+
465
+ i++;
466
+ while (i < size && data[i] != cc) {
467
+ if (!tmp_i && data[i] == c) tmp_i = i;
468
+ i++;
469
+ }
470
+
471
+ if (i >= size)
472
+ return tmp_i;
473
+
474
+ i++;
475
+ }
476
+ }
477
+
478
+ return 0;
479
+ }
480
+
481
+ /* parse_emph1 • parsing single emphase */
482
+ /* closed by a symbol not preceded by whitespace and not followed by symbol */
483
+ static size_t
484
+ parse_emph1(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c)
485
+ {
486
+ size_t i = 0, len;
487
+ struct buf *work = 0;
488
+ int r;
489
+
490
+ if (!rndr->cb.emphasis) return 0;
491
+
492
+ /* skipping one symbol if coming from emph3 */
493
+ if (size > 1 && data[0] == c && data[1] == c) i = 1;
494
+
495
+ while (i < size) {
496
+ len = find_emph_char(data + i, size - i, c);
497
+ if (!len) return 0;
498
+ i += len;
499
+ if (i >= size) return 0;
500
+
501
+ if (data[i] == c && !_isspace(data[i - 1])) {
502
+
503
+ if (rndr->ext_flags & MKDEXT_NO_INTRA_EMPHASIS) {
504
+ if (i + 1 < size && isalnum(data[i + 1]))
505
+ continue;
506
+ }
507
+
508
+ work = rndr_newbuf(rndr, BUFFER_SPAN);
509
+ parse_inline(work, rndr, data, i);
510
+ r = rndr->cb.emphasis(ob, work, rndr->opaque);
511
+ rndr_popbuf(rndr, BUFFER_SPAN);
512
+ return r ? i + 1 : 0;
513
+ }
514
+ }
515
+
516
+ return 0;
517
+ }
518
+
519
+ /* parse_emph2 • parsing single emphase */
520
+ static size_t
521
+ parse_emph2(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c)
522
+ {
523
+ int (*render_method)(struct buf *ob, const struct buf *text, void *opaque);
524
+ size_t i = 0, len;
525
+ struct buf *work = 0;
526
+ int r;
527
+
528
+ render_method = (c == '~') ? rndr->cb.strikethrough : rndr->cb.double_emphasis;
529
+
530
+ if (!render_method)
531
+ return 0;
532
+
533
+ while (i < size) {
534
+ len = find_emph_char(data + i, size - i, c);
535
+ if (!len) return 0;
536
+ i += len;
537
+
538
+ if (i + 1 < size && data[i] == c && data[i + 1] == c && i && !_isspace(data[i - 1])) {
539
+ work = rndr_newbuf(rndr, BUFFER_SPAN);
540
+ parse_inline(work, rndr, data, i);
541
+ r = render_method(ob, work, rndr->opaque);
542
+ rndr_popbuf(rndr, BUFFER_SPAN);
543
+ return r ? i + 2 : 0;
544
+ }
545
+ i++;
546
+ }
547
+ return 0;
548
+ }
549
+
550
+ /* parse_emph3 • parsing single emphase */
551
+ /* finds the first closing tag, and delegates to the other emph */
552
+ static size_t
553
+ parse_emph3(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c)
554
+ {
555
+ size_t i = 0, len;
556
+ int r;
557
+
558
+ while (i < size) {
559
+ len = find_emph_char(data + i, size - i, c);
560
+ if (!len) return 0;
561
+ i += len;
562
+
563
+ /* skip whitespace preceded symbols */
564
+ if (data[i] != c || _isspace(data[i - 1]))
565
+ continue;
566
+
567
+ if (i + 2 < size && data[i + 1] == c && data[i + 2] == c && rndr->cb.triple_emphasis) {
568
+ /* triple symbol found */
569
+ struct buf *work = rndr_newbuf(rndr, BUFFER_SPAN);
570
+
571
+ parse_inline(work, rndr, data, i);
572
+ r = rndr->cb.triple_emphasis(ob, work, rndr->opaque);
573
+ rndr_popbuf(rndr, BUFFER_SPAN);
574
+ return r ? i + 3 : 0;
575
+
576
+ } else if (i + 1 < size && data[i + 1] == c) {
577
+ /* double symbol found, handing over to emph1 */
578
+ len = parse_emph1(ob, rndr, data - 2, size + 2, c);
579
+ if (!len) return 0;
580
+ else return len - 2;
581
+
582
+ } else {
583
+ /* single symbol found, handing over to emph2 */
584
+ len = parse_emph2(ob, rndr, data - 1, size + 1, c);
585
+ if (!len) return 0;
586
+ else return len - 1;
587
+ }
588
+ }
589
+ return 0;
590
+ }
591
+
592
+ /* char_emphasis • single and double emphasis parsing */
593
+ static size_t
594
+ char_emphasis(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
595
+ {
596
+ uint8_t c = data[0];
597
+ size_t ret;
598
+
599
+ if (rndr->ext_flags & MKDEXT_NO_INTRA_EMPHASIS) {
600
+ if (offset > 0 && !_isspace(data[-1]) && data[-1] != '>')
601
+ return 0;
602
+ }
603
+
604
+ if (size > 2 && data[1] != c) {
605
+ /* whitespace cannot follow an opening emphasis;
606
+ * strikethrough only takes two characters '~~' */
607
+ if (c == '~' || _isspace(data[1]) || (ret = parse_emph1(ob, rndr, data + 1, size - 1, c)) == 0)
608
+ return 0;
609
+
610
+ return ret + 1;
611
+ }
612
+
613
+ if (size > 3 && data[1] == c && data[2] != c) {
614
+ if (_isspace(data[2]) || (ret = parse_emph2(ob, rndr, data + 2, size - 2, c)) == 0)
615
+ return 0;
616
+
617
+ return ret + 2;
618
+ }
619
+
620
+ if (size > 4 && data[1] == c && data[2] == c && data[3] != c) {
621
+ if (c == '~' || _isspace(data[3]) || (ret = parse_emph3(ob, rndr, data + 3, size - 3, c)) == 0)
622
+ return 0;
623
+
624
+ return ret + 3;
625
+ }
626
+
627
+ return 0;
628
+ }
629
+
630
+
631
+ /* char_linebreak • '\n' preceded by two spaces (assuming linebreak != 0) */
632
+ static size_t
633
+ char_linebreak(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
634
+ {
635
+ if (offset < 2 || data[-1] != ' ' || data[-2] != ' ')
636
+ return 0;
637
+
638
+ /* removing the last space from ob and rendering */
639
+ while (ob->size && ob->data[ob->size - 1] == ' ')
640
+ ob->size--;
641
+
642
+ return rndr->cb.linebreak(ob, rndr->opaque) ? 1 : 0;
643
+ }
644
+
645
+
646
+ /* char_codespan • '`' parsing a code span (assuming codespan != 0) */
647
+ static size_t
648
+ char_codespan(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
649
+ {
650
+ size_t end, nb = 0, i, f_begin, f_end;
651
+
652
+ /* counting the number of backticks in the delimiter */
653
+ while (nb < size && data[nb] == '`')
654
+ nb++;
655
+
656
+ /* finding the next delimiter */
657
+ i = 0;
658
+ for (end = nb; end < size && i < nb; end++) {
659
+ if (data[end] == '`') i++;
660
+ else i = 0;
661
+ }
662
+
663
+ if (i < nb && end >= size)
664
+ return 0; /* no matching delimiter */
665
+
666
+ /* trimming outside whitespaces */
667
+ f_begin = nb;
668
+ while (f_begin < end && data[f_begin] == ' ')
669
+ f_begin++;
670
+
671
+ f_end = end - nb;
672
+ while (f_end > nb && data[f_end-1] == ' ')
673
+ f_end--;
674
+
675
+ /* real code span */
676
+ if (f_begin < f_end) {
677
+ struct buf work = { data + f_begin, f_end - f_begin, 0, 0 };
678
+ if (!rndr->cb.codespan(ob, &work, rndr->opaque))
679
+ end = 0;
680
+ } else {
681
+ if (!rndr->cb.codespan(ob, 0, rndr->opaque))
682
+ end = 0;
683
+ }
684
+
685
+ return end;
686
+ }
687
+
688
+
689
+ /* char_escape • '\\' backslash escape */
690
+ static size_t
691
+ char_escape(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
692
+ {
693
+ static const char *escape_chars = "\\`*_{}[]()#+-.!:|&<>^~";
694
+ struct buf work = { 0, 0, 0, 0 };
695
+
696
+ if (size > 1) {
697
+ if (strchr(escape_chars, data[1]) == NULL)
698
+ return 0;
699
+
700
+ if (rndr->cb.normal_text) {
701
+ work.data = data + 1;
702
+ work.size = 1;
703
+ rndr->cb.normal_text(ob, &work, rndr->opaque);
704
+ }
705
+ else bufputc(ob, data[1]);
706
+ } else if (size == 1) {
707
+ bufputc(ob, data[0]);
708
+ }
709
+
710
+ return 2;
711
+ }
712
+
713
+ /* char_entity • '&' escaped when it doesn't belong to an entity */
714
+ /* valid entities are assumed to be anything matching &#?[A-Za-z0-9]+; */
715
+ static size_t
716
+ char_entity(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
717
+ {
718
+ size_t end = 1;
719
+ struct buf work = { 0, 0, 0, 0 };
720
+
721
+ if (end < size && data[end] == '#')
722
+ end++;
723
+
724
+ while (end < size && isalnum(data[end]))
725
+ end++;
726
+
727
+ if (end < size && data[end] == ';')
728
+ end++; /* real entity */
729
+ else
730
+ return 0; /* lone '&' */
731
+
732
+ if (rndr->cb.entity) {
733
+ work.data = data;
734
+ work.size = end;
735
+ rndr->cb.entity(ob, &work, rndr->opaque);
736
+ }
737
+ else bufput(ob, data, end);
738
+
739
+ return end;
740
+ }
741
+
742
+ /* char_langle_tag • '<' when tags or autolinks are allowed */
743
+ static size_t
744
+ char_langle_tag(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
745
+ {
746
+ enum mkd_autolink altype = MKDA_NOT_AUTOLINK;
747
+ size_t end = tag_length(data, size, &altype);
748
+ struct buf work = { data, end, 0, 0 };
749
+ int ret = 0;
750
+
751
+ if (end > 2) {
752
+ if (rndr->cb.autolink && altype != MKDA_NOT_AUTOLINK) {
753
+ struct buf *u_link = rndr_newbuf(rndr, BUFFER_SPAN);
754
+ work.data = data + 1;
755
+ work.size = end - 2;
756
+ unscape_text(u_link, &work);
757
+ ret = rndr->cb.autolink(ob, u_link, altype, rndr->opaque);
758
+ rndr_popbuf(rndr, BUFFER_SPAN);
759
+ }
760
+ else if (rndr->cb.raw_html_tag)
761
+ ret = rndr->cb.raw_html_tag(ob, &work, rndr->opaque);
762
+ }
763
+
764
+ if (!ret) return 0;
765
+ else return end;
766
+ }
767
+
768
+ static size_t
769
+ char_autolink_www(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
770
+ {
771
+ struct buf *link, *link_url, *link_text;
772
+ size_t link_len, rewind;
773
+
774
+ if (!rndr->cb.link || rndr->in_link_body)
775
+ return 0;
776
+
777
+ link = rndr_newbuf(rndr, BUFFER_SPAN);
778
+
779
+ if ((link_len = sd_autolink__www(&rewind, link, data, offset, size, 0)) > 0) {
780
+ link_url = rndr_newbuf(rndr, BUFFER_SPAN);
781
+ BUFPUTSL(link_url, "http://");
782
+ bufput(link_url, link->data, link->size);
783
+
784
+ ob->size -= rewind;
785
+ if (rndr->cb.normal_text) {
786
+ link_text = rndr_newbuf(rndr, BUFFER_SPAN);
787
+ rndr->cb.normal_text(link_text, link, rndr->opaque);
788
+ rndr->cb.link(ob, link_url, NULL, link_text, rndr->opaque);
789
+ rndr_popbuf(rndr, BUFFER_SPAN);
790
+ } else {
791
+ rndr->cb.link(ob, link_url, NULL, link, rndr->opaque);
792
+ }
793
+ rndr_popbuf(rndr, BUFFER_SPAN);
794
+ }
795
+
796
+ rndr_popbuf(rndr, BUFFER_SPAN);
797
+ return link_len;
798
+ }
799
+
800
+ static size_t
801
+ char_autolink_email(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
802
+ {
803
+ struct buf *link;
804
+ size_t link_len, rewind;
805
+
806
+ if (!rndr->cb.autolink || rndr->in_link_body)
807
+ return 0;
808
+
809
+ link = rndr_newbuf(rndr, BUFFER_SPAN);
810
+
811
+ if ((link_len = sd_autolink__email(&rewind, link, data, offset, size, 0)) > 0) {
812
+ ob->size -= rewind;
813
+ rndr->cb.autolink(ob, link, MKDA_EMAIL, rndr->opaque);
814
+ }
815
+
816
+ rndr_popbuf(rndr, BUFFER_SPAN);
817
+ return link_len;
818
+ }
819
+
820
+ static size_t
821
+ char_autolink_url(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
822
+ {
823
+ struct buf *link;
824
+ size_t link_len, rewind;
825
+
826
+ if (!rndr->cb.autolink || rndr->in_link_body)
827
+ return 0;
828
+
829
+ link = rndr_newbuf(rndr, BUFFER_SPAN);
830
+
831
+ if ((link_len = sd_autolink__url(&rewind, link, data, offset, size, 0)) > 0) {
832
+ ob->size -= rewind;
833
+ rndr->cb.autolink(ob, link, MKDA_NORMAL, rndr->opaque);
834
+ }
835
+
836
+ rndr_popbuf(rndr, BUFFER_SPAN);
837
+ return link_len;
838
+ }
839
+
840
+ /* char_link • '[': parsing a link or an image */
841
+ static size_t
842
+ char_link(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
843
+ {
844
+ int is_img = (offset && data[-1] == '!'), level;
845
+ size_t i = 1, txt_e, link_b = 0, link_e = 0, title_b = 0, title_e = 0;
846
+ struct buf *content = 0;
847
+ struct buf *link = 0;
848
+ struct buf *title = 0;
849
+ struct buf *u_link = 0;
850
+ size_t org_work_size = rndr->work_bufs[BUFFER_SPAN].size;
851
+ int text_has_nl = 0, ret = 0;
852
+ int in_title = 0, qtype = 0;
853
+
854
+ /* checking whether the correct renderer exists */
855
+ if ((is_img && !rndr->cb.image) || (!is_img && !rndr->cb.link))
856
+ goto cleanup;
857
+
858
+ /* looking for the matching closing bracket */
859
+ for (level = 1; i < size; i++) {
860
+ if (data[i] == '\n')
861
+ text_has_nl = 1;
862
+
863
+ else if (data[i - 1] == '\\')
864
+ continue;
865
+
866
+ else if (data[i] == '[')
867
+ level++;
868
+
869
+ else if (data[i] == ']') {
870
+ level--;
871
+ if (level <= 0)
872
+ break;
873
+ }
874
+ }
875
+
876
+ if (i >= size)
877
+ goto cleanup;
878
+
879
+ txt_e = i;
880
+ i++;
881
+
882
+ /* skip any amount of whitespace or newline */
883
+ /* (this is much more laxist than original markdown syntax) */
884
+ while (i < size && _isspace(data[i]))
885
+ i++;
886
+
887
+ /* inline style link */
888
+ if (i < size && data[i] == '(') {
889
+ /* skipping initial whitespace */
890
+ i++;
891
+
892
+ while (i < size && _isspace(data[i]))
893
+ i++;
894
+
895
+ link_b = i;
896
+
897
+ /* looking for link end: ' " ) */
898
+ while (i < size) {
899
+ if (data[i] == '\\') i += 2;
900
+ else if (data[i] == ')') break;
901
+ else if (i >= 1 && _isspace(data[i-1]) && (data[i] == '\'' || data[i] == '"')) break;
902
+ else i++;
903
+ }
904
+
905
+ if (i >= size) goto cleanup;
906
+ link_e = i;
907
+
908
+ /* looking for title end if present */
909
+ if (data[i] == '\'' || data[i] == '"') {
910
+ qtype = data[i];
911
+ in_title = 1;
912
+ i++;
913
+ title_b = i;
914
+
915
+ while (i < size) {
916
+ if (data[i] == '\\') i += 2;
917
+ else if (data[i] == qtype) {in_title = 0; i++;}
918
+ else if ((data[i] == ')') && !in_title) break;
919
+ else i++;
920
+ }
921
+
922
+ if (i >= size) goto cleanup;
923
+
924
+ /* skipping whitespaces after title */
925
+ title_e = i - 1;
926
+ while (title_e > title_b && _isspace(data[title_e]))
927
+ title_e--;
928
+
929
+ /* checking for closing quote presence */
930
+ if (data[title_e] != '\'' && data[title_e] != '"') {
931
+ title_b = title_e = 0;
932
+ link_e = i;
933
+ }
934
+ }
935
+
936
+ /* remove whitespace at the end of the link */
937
+ while (link_e > link_b && _isspace(data[link_e - 1]))
938
+ link_e--;
939
+
940
+ /* remove optional angle brackets around the link */
941
+ if (data[link_b] == '<') link_b++;
942
+ if (data[link_e - 1] == '>') link_e--;
943
+
944
+ /* building escaped link and title */
945
+ if (link_e > link_b) {
946
+ link = rndr_newbuf(rndr, BUFFER_SPAN);
947
+ bufput(link, data + link_b, link_e - link_b);
948
+ }
949
+
950
+ if (title_e > title_b) {
951
+ title = rndr_newbuf(rndr, BUFFER_SPAN);
952
+ bufput(title, data + title_b, title_e - title_b);
953
+ }
954
+
955
+ i++;
956
+ }
957
+
958
+ /* reference style link */
959
+ else if (i < size && data[i] == '[') {
960
+ struct buf id = { 0, 0, 0, 0 };
961
+ struct link_ref *lr;
962
+
963
+ /* looking for the id */
964
+ i++;
965
+ link_b = i;
966
+ while (i < size && data[i] != ']') i++;
967
+ if (i >= size) goto cleanup;
968
+ link_e = i;
969
+
970
+ /* finding the link_ref */
971
+ if (link_b == link_e) {
972
+ if (text_has_nl) {
973
+ struct buf *b = rndr_newbuf(rndr, BUFFER_SPAN);
974
+ size_t j;
975
+
976
+ for (j = 1; j < txt_e; j++) {
977
+ if (data[j] != '\n')
978
+ bufputc(b, data[j]);
979
+ else if (data[j - 1] != ' ')
980
+ bufputc(b, ' ');
981
+ }
982
+
983
+ id.data = b->data;
984
+ id.size = b->size;
985
+ } else {
986
+ id.data = data + 1;
987
+ id.size = txt_e - 1;
988
+ }
989
+ } else {
990
+ id.data = data + link_b;
991
+ id.size = link_e - link_b;
992
+ }
993
+
994
+ lr = find_link_ref(rndr->refs, id.data, id.size);
995
+ if (!lr)
996
+ goto cleanup;
997
+
998
+ /* keeping link and title from link_ref */
999
+ link = lr->link;
1000
+ title = lr->title;
1001
+ i++;
1002
+ }
1003
+
1004
+ /* shortcut reference style link */
1005
+ else {
1006
+ struct buf id = { 0, 0, 0, 0 };
1007
+ struct link_ref *lr;
1008
+
1009
+ /* crafting the id */
1010
+ if (text_has_nl) {
1011
+ struct buf *b = rndr_newbuf(rndr, BUFFER_SPAN);
1012
+ size_t j;
1013
+
1014
+ for (j = 1; j < txt_e; j++) {
1015
+ if (data[j] != '\n')
1016
+ bufputc(b, data[j]);
1017
+ else if (data[j - 1] != ' ')
1018
+ bufputc(b, ' ');
1019
+ }
1020
+
1021
+ id.data = b->data;
1022
+ id.size = b->size;
1023
+ } else {
1024
+ id.data = data + 1;
1025
+ id.size = txt_e - 1;
1026
+ }
1027
+
1028
+ /* finding the link_ref */
1029
+ lr = find_link_ref(rndr->refs, id.data, id.size);
1030
+ if (!lr)
1031
+ goto cleanup;
1032
+
1033
+ /* keeping link and title from link_ref */
1034
+ link = lr->link;
1035
+ title = lr->title;
1036
+
1037
+ /* rewinding the whitespace */
1038
+ i = txt_e + 1;
1039
+ }
1040
+
1041
+ /* building content: img alt is escaped, link content is parsed */
1042
+ if (txt_e > 1) {
1043
+ content = rndr_newbuf(rndr, BUFFER_SPAN);
1044
+ if (is_img) {
1045
+ bufput(content, data + 1, txt_e - 1);
1046
+ } else {
1047
+ /* disable autolinking when parsing inline the
1048
+ * content of a link */
1049
+ rndr->in_link_body = 1;
1050
+ parse_inline(content, rndr, data + 1, txt_e - 1);
1051
+ rndr->in_link_body = 0;
1052
+ }
1053
+ }
1054
+
1055
+ if (link) {
1056
+ u_link = rndr_newbuf(rndr, BUFFER_SPAN);
1057
+ unscape_text(u_link, link);
1058
+ }
1059
+
1060
+ /* calling the relevant rendering function */
1061
+ if (is_img) {
1062
+ if (ob->size && ob->data[ob->size - 1] == '!')
1063
+ ob->size -= 1;
1064
+
1065
+ ret = rndr->cb.image(ob, u_link, title, content, rndr->opaque);
1066
+ } else {
1067
+ ret = rndr->cb.link(ob, u_link, title, content, rndr->opaque);
1068
+ }
1069
+
1070
+ /* cleanup */
1071
+ cleanup:
1072
+ rndr->work_bufs[BUFFER_SPAN].size = (int)org_work_size;
1073
+ return ret ? i : 0;
1074
+ }
1075
+
1076
+ static size_t
1077
+ char_superscript(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
1078
+ {
1079
+ size_t sup_start, sup_len;
1080
+ struct buf *sup;
1081
+
1082
+ if (!rndr->cb.superscript)
1083
+ return 0;
1084
+
1085
+ if (size < 2)
1086
+ return 0;
1087
+
1088
+ if (data[1] == '(') {
1089
+ sup_start = sup_len = 2;
1090
+
1091
+ while (sup_len < size && data[sup_len] != ')' && data[sup_len - 1] != '\\')
1092
+ sup_len++;
1093
+
1094
+ if (sup_len == size)
1095
+ return 0;
1096
+ } else {
1097
+ sup_start = sup_len = 1;
1098
+
1099
+ while (sup_len < size && !_isspace(data[sup_len]))
1100
+ sup_len++;
1101
+ }
1102
+
1103
+ if (sup_len - sup_start == 0)
1104
+ return (sup_start == 2) ? 3 : 0;
1105
+
1106
+ sup = rndr_newbuf(rndr, BUFFER_SPAN);
1107
+ parse_inline(sup, rndr, data + sup_start, sup_len - sup_start);
1108
+ rndr->cb.superscript(ob, sup, rndr->opaque);
1109
+ rndr_popbuf(rndr, BUFFER_SPAN);
1110
+
1111
+ return (sup_start == 2) ? sup_len + 1 : sup_len;
1112
+ }
1113
+
1114
+ /*********************************
1115
+ * BLOCK-LEVEL PARSING FUNCTIONS *
1116
+ *********************************/
1117
+
1118
+ /* is_empty • returns the line length when it is empty, 0 otherwise */
1119
+ static size_t
1120
+ is_empty(uint8_t *data, size_t size)
1121
+ {
1122
+ size_t i;
1123
+
1124
+ for (i = 0; i < size && data[i] != '\n'; i++)
1125
+ if (data[i] != ' ')
1126
+ return 0;
1127
+
1128
+ return i + 1;
1129
+ }
1130
+
1131
+ /* is_hrule • returns whether a line is a horizontal rule */
1132
+ static int
1133
+ is_hrule(uint8_t *data, size_t size)
1134
+ {
1135
+ size_t i = 0, n = 0;
1136
+ uint8_t c;
1137
+
1138
+ /* skipping initial spaces */
1139
+ if (size < 3) return 0;
1140
+ if (data[0] == ' ') { i++;
1141
+ if (data[1] == ' ') { i++;
1142
+ if (data[2] == ' ') { i++; } } }
1143
+
1144
+ /* looking at the hrule uint8_t */
1145
+ if (i + 2 >= size
1146
+ || (data[i] != '*' && data[i] != '-' && data[i] != '_'))
1147
+ return 0;
1148
+ c = data[i];
1149
+
1150
+ /* the whole line must be the char or whitespace */
1151
+ while (i < size && data[i] != '\n') {
1152
+ if (data[i] == c) n++;
1153
+ else if (data[i] != ' ')
1154
+ return 0;
1155
+
1156
+ i++;
1157
+ }
1158
+
1159
+ return n >= 3;
1160
+ }
1161
+
1162
+ /* check if a line begins with a code fence; return the
1163
+ * width of the code fence */
1164
+ static size_t
1165
+ prefix_codefence(uint8_t *data, size_t size)
1166
+ {
1167
+ size_t i = 0, n = 0;
1168
+ uint8_t c;
1169
+
1170
+ /* skipping initial spaces */
1171
+ if (size < 3) return 0;
1172
+ if (data[0] == ' ') { i++;
1173
+ if (data[1] == ' ') { i++;
1174
+ if (data[2] == ' ') { i++; } } }
1175
+
1176
+ /* looking at the hrule uint8_t */
1177
+ if (i + 2 >= size || !(data[i] == '~' || data[i] == '`'))
1178
+ return 0;
1179
+
1180
+ c = data[i];
1181
+
1182
+ /* the whole line must be the uint8_t or whitespace */
1183
+ while (i < size && data[i] == c) {
1184
+ n++; i++;
1185
+ }
1186
+
1187
+ if (n < 3)
1188
+ return 0;
1189
+
1190
+ return i;
1191
+ }
1192
+
1193
+ /* check if a line is a code fence; return its size if it is */
1194
+ static size_t
1195
+ is_codefence(uint8_t *data, size_t size, struct buf *syntax)
1196
+ {
1197
+ size_t i = 0, syn_len = 0;
1198
+ uint8_t *syn_start;
1199
+
1200
+ i = prefix_codefence(data, size);
1201
+ if (i == 0)
1202
+ return 0;
1203
+
1204
+ while (i < size && data[i] == ' ')
1205
+ i++;
1206
+
1207
+ syn_start = data + i;
1208
+
1209
+ if (i < size && data[i] == '{') {
1210
+ i++; syn_start++;
1211
+
1212
+ while (i < size && data[i] != '}' && data[i] != '\n') {
1213
+ syn_len++; i++;
1214
+ }
1215
+
1216
+ if (i == size || data[i] != '}')
1217
+ return 0;
1218
+
1219
+ /* strip all whitespace at the beginning and the end
1220
+ * of the {} block */
1221
+ while (syn_len > 0 && _isspace(syn_start[0])) {
1222
+ syn_start++; syn_len--;
1223
+ }
1224
+
1225
+ while (syn_len > 0 && _isspace(syn_start[syn_len - 1]))
1226
+ syn_len--;
1227
+
1228
+ i++;
1229
+ } else {
1230
+ while (i < size && !_isspace(data[i])) {
1231
+ syn_len++; i++;
1232
+ }
1233
+ }
1234
+
1235
+ if (syntax) {
1236
+ syntax->data = syn_start;
1237
+ syntax->size = syn_len;
1238
+ }
1239
+
1240
+ while (i < size && data[i] != '\n') {
1241
+ if (!_isspace(data[i]))
1242
+ return 0;
1243
+
1244
+ i++;
1245
+ }
1246
+
1247
+ return i + 1;
1248
+ }
1249
+
1250
+ /* is_atxheader • returns whether the line is a hash-prefixed header */
1251
+ static int
1252
+ is_atxheader(struct sd_markdown *rndr, uint8_t *data, size_t size)
1253
+ {
1254
+ if (data[0] != '#')
1255
+ return 0;
1256
+
1257
+ if (rndr->ext_flags & MKDEXT_SPACE_HEADERS) {
1258
+ size_t level = 0;
1259
+
1260
+ while (level < size && level < 6 && data[level] == '#')
1261
+ level++;
1262
+
1263
+ if (level < size && data[level] != ' ')
1264
+ return 0;
1265
+ }
1266
+
1267
+ return 1;
1268
+ }
1269
+
1270
+ /* is_headerline • returns whether the line is a setext-style hdr underline */
1271
+ static int
1272
+ is_headerline(uint8_t *data, size_t size)
1273
+ {
1274
+ size_t i = 0;
1275
+
1276
+ /* test of level 1 header */
1277
+ if (data[i] == '=') {
1278
+ for (i = 1; i < size && data[i] == '='; i++);
1279
+ while (i < size && data[i] == ' ') i++;
1280
+ return (i >= size || data[i] == '\n') ? 1 : 0; }
1281
+
1282
+ /* test of level 2 header */
1283
+ if (data[i] == '-') {
1284
+ for (i = 1; i < size && data[i] == '-'; i++);
1285
+ while (i < size && data[i] == ' ') i++;
1286
+ return (i >= size || data[i] == '\n') ? 2 : 0; }
1287
+
1288
+ return 0;
1289
+ }
1290
+
1291
+ static int
1292
+ is_next_headerline(uint8_t *data, size_t size)
1293
+ {
1294
+ size_t i = 0;
1295
+
1296
+ while (i < size && data[i] != '\n')
1297
+ i++;
1298
+
1299
+ if (++i >= size)
1300
+ return 0;
1301
+
1302
+ return is_headerline(data + i, size - i);
1303
+ }
1304
+
1305
+ /* prefix_quote • returns blockquote prefix length */
1306
+ static size_t
1307
+ prefix_quote(uint8_t *data, size_t size)
1308
+ {
1309
+ size_t i = 0;
1310
+ if (i < size && data[i] == ' ') i++;
1311
+ if (i < size && data[i] == ' ') i++;
1312
+ if (i < size && data[i] == ' ') i++;
1313
+
1314
+ if (i < size && data[i] == '>') {
1315
+ if (i + 1 < size && data[i + 1] == ' ')
1316
+ return i + 2;
1317
+
1318
+ return i + 1;
1319
+ }
1320
+
1321
+ return 0;
1322
+ }
1323
+
1324
+ /* prefix_code • returns prefix length for block code*/
1325
+ static size_t
1326
+ prefix_code(uint8_t *data, size_t size)
1327
+ {
1328
+ if (size > 3 && data[0] == ' ' && data[1] == ' '
1329
+ && data[2] == ' ' && data[3] == ' ') return 4;
1330
+
1331
+ return 0;
1332
+ }
1333
+
1334
+ /* prefix_oli • returns ordered list item prefix */
1335
+ static size_t
1336
+ prefix_oli(uint8_t *data, size_t size)
1337
+ {
1338
+ size_t i = 0;
1339
+
1340
+ if (i < size && data[i] == ' ') i++;
1341
+ if (i < size && data[i] == ' ') i++;
1342
+ if (i < size && data[i] == ' ') i++;
1343
+
1344
+ if (i >= size || data[i] < '0' || data[i] > '9')
1345
+ return 0;
1346
+
1347
+ while (i < size && data[i] >= '0' && data[i] <= '9')
1348
+ i++;
1349
+
1350
+ if (i + 1 >= size || data[i] != '.' || data[i + 1] != ' ')
1351
+ return 0;
1352
+
1353
+ if (is_next_headerline(data + i, size - i))
1354
+ return 0;
1355
+
1356
+ return i + 2;
1357
+ }
1358
+
1359
+ /* prefix_uli • returns ordered list item prefix */
1360
+ static size_t
1361
+ prefix_uli(uint8_t *data, size_t size)
1362
+ {
1363
+ size_t i = 0;
1364
+
1365
+ if (i < size && data[i] == ' ') i++;
1366
+ if (i < size && data[i] == ' ') i++;
1367
+ if (i < size && data[i] == ' ') i++;
1368
+
1369
+ if (i + 1 >= size ||
1370
+ (data[i] != '*' && data[i] != '+' && data[i] != '-') ||
1371
+ data[i + 1] != ' ')
1372
+ return 0;
1373
+
1374
+ if (is_next_headerline(data + i, size - i))
1375
+ return 0;
1376
+
1377
+ return i + 2;
1378
+ }
1379
+
1380
+
1381
+ /* parse_block • parsing of one block, returning next uint8_t to parse */
1382
+ static void parse_block(struct buf *ob, struct sd_markdown *rndr,
1383
+ uint8_t *data, size_t size);
1384
+
1385
+
1386
+ /* parse_blockquote • handles parsing of a blockquote fragment */
1387
+ static size_t
1388
+ parse_blockquote(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
1389
+ {
1390
+ size_t beg, end = 0, pre, work_size = 0;
1391
+ uint8_t *work_data = 0;
1392
+ struct buf *out = 0;
1393
+
1394
+ out = rndr_newbuf(rndr, BUFFER_BLOCK);
1395
+ beg = 0;
1396
+ while (beg < size) {
1397
+ for (end = beg + 1; end < size && data[end - 1] != '\n'; end++);
1398
+
1399
+ pre = prefix_quote(data + beg, end - beg);
1400
+
1401
+ if (pre)
1402
+ beg += pre; /* skipping prefix */
1403
+
1404
+ /* empty line followed by non-quote line */
1405
+ else if (is_empty(data + beg, end - beg) &&
1406
+ (end >= size || (prefix_quote(data + end, size - end) == 0 &&
1407
+ !is_empty(data + end, size - end))))
1408
+ break;
1409
+
1410
+ if (beg < end) { /* copy into the in-place working buffer */
1411
+ /* bufput(work, data + beg, end - beg); */
1412
+ if (!work_data)
1413
+ work_data = data + beg;
1414
+ else if (data + beg != work_data + work_size)
1415
+ memmove(work_data + work_size, data + beg, end - beg);
1416
+ work_size += end - beg;
1417
+ }
1418
+ beg = end;
1419
+ }
1420
+
1421
+ parse_block(out, rndr, work_data, work_size);
1422
+ if (rndr->cb.blockquote)
1423
+ rndr->cb.blockquote(ob, out, rndr->opaque);
1424
+ rndr_popbuf(rndr, BUFFER_BLOCK);
1425
+ return end;
1426
+ }
1427
+
1428
+ static size_t
1429
+ parse_htmlblock(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int do_render);
1430
+
1431
+ /* parse_blockquote • handles parsing of a regular paragraph */
1432
+ static size_t
1433
+ parse_paragraph(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
1434
+ {
1435
+ size_t i = 0, end = 0;
1436
+ int level = 0;
1437
+ struct buf work = { data, 0, 0, 0 };
1438
+
1439
+ while (i < size) {
1440
+ for (end = i + 1; end < size && data[end - 1] != '\n'; end++) /* empty */;
1441
+
1442
+ if (is_empty(data + i, size - i))
1443
+ break;
1444
+
1445
+ if ((level = is_headerline(data + i, size - i)) != 0)
1446
+ break;
1447
+
1448
+ if (is_atxheader(rndr, data + i, size - i) ||
1449
+ is_hrule(data + i, size - i) ||
1450
+ prefix_quote(data + i, size - i)) {
1451
+ end = i;
1452
+ break;
1453
+ }
1454
+
1455
+ /*
1456
+ * Early termination of a paragraph with the same logic
1457
+ * as Markdown 1.0.0. If this logic is applied, the
1458
+ * Markdown 1.0.3 test suite won't pass cleanly
1459
+ *
1460
+ * :: If the first character in a new line is not a letter,
1461
+ * let's check to see if there's some kind of block starting
1462
+ * here
1463
+ */
1464
+ if ((rndr->ext_flags & MKDEXT_LAX_SPACING) && !isalnum(data[i])) {
1465
+ if (prefix_oli(data + i, size - i) ||
1466
+ prefix_uli(data + i, size - i)) {
1467
+ end = i;
1468
+ break;
1469
+ }
1470
+
1471
+ /* see if an html block starts here */
1472
+ if (data[i] == '<' && rndr->cb.blockhtml &&
1473
+ parse_htmlblock(ob, rndr, data + i, size - i, 0)) {
1474
+ end = i;
1475
+ break;
1476
+ }
1477
+
1478
+ /* see if a code fence starts here */
1479
+ if ((rndr->ext_flags & MKDEXT_FENCED_CODE) != 0 &&
1480
+ is_codefence(data + i, size - i, NULL) != 0) {
1481
+ end = i;
1482
+ break;
1483
+ }
1484
+ }
1485
+
1486
+ i = end;
1487
+ }
1488
+
1489
+ work.size = i;
1490
+ while (work.size && data[work.size - 1] == '\n')
1491
+ work.size--;
1492
+
1493
+ if (!level) {
1494
+ struct buf *tmp = rndr_newbuf(rndr, BUFFER_BLOCK);
1495
+ parse_inline(tmp, rndr, work.data, work.size);
1496
+ if (rndr->cb.paragraph)
1497
+ rndr->cb.paragraph(ob, tmp, rndr->opaque);
1498
+ rndr_popbuf(rndr, BUFFER_BLOCK);
1499
+ } else {
1500
+ struct buf *header_work;
1501
+
1502
+ if (work.size) {
1503
+ size_t beg;
1504
+ i = work.size;
1505
+ work.size -= 1;
1506
+
1507
+ while (work.size && data[work.size] != '\n')
1508
+ work.size -= 1;
1509
+
1510
+ beg = work.size + 1;
1511
+ while (work.size && data[work.size - 1] == '\n')
1512
+ work.size -= 1;
1513
+
1514
+ if (work.size > 0) {
1515
+ struct buf *tmp = rndr_newbuf(rndr, BUFFER_BLOCK);
1516
+ parse_inline(tmp, rndr, work.data, work.size);
1517
+
1518
+ if (rndr->cb.paragraph)
1519
+ rndr->cb.paragraph(ob, tmp, rndr->opaque);
1520
+
1521
+ rndr_popbuf(rndr, BUFFER_BLOCK);
1522
+ work.data += beg;
1523
+ work.size = i - beg;
1524
+ }
1525
+ else work.size = i;
1526
+ }
1527
+
1528
+ header_work = rndr_newbuf(rndr, BUFFER_SPAN);
1529
+ parse_inline(header_work, rndr, work.data, work.size);
1530
+
1531
+ if (rndr->cb.header)
1532
+ rndr->cb.header(ob, header_work, (int)level, rndr->opaque);
1533
+
1534
+ rndr_popbuf(rndr, BUFFER_SPAN);
1535
+ }
1536
+
1537
+ return end;
1538
+ }
1539
+
1540
+ /* parse_fencedcode • handles parsing of a block-level code fragment */
1541
+ static size_t
1542
+ parse_fencedcode(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
1543
+ {
1544
+ size_t beg, end;
1545
+ struct buf *work = 0;
1546
+ struct buf lang = { 0, 0, 0, 0 };
1547
+
1548
+ beg = is_codefence(data, size, &lang);
1549
+ if (beg == 0) return 0;
1550
+
1551
+ work = rndr_newbuf(rndr, BUFFER_BLOCK);
1552
+
1553
+ while (beg < size) {
1554
+ size_t fence_end;
1555
+ struct buf fence_trail = { 0, 0, 0, 0 };
1556
+
1557
+ fence_end = is_codefence(data + beg, size - beg, &fence_trail);
1558
+ if (fence_end != 0 && fence_trail.size == 0) {
1559
+ beg += fence_end;
1560
+ break;
1561
+ }
1562
+
1563
+ for (end = beg + 1; end < size && data[end - 1] != '\n'; end++);
1564
+
1565
+ if (beg < end) {
1566
+ /* verbatim copy to the working buffer,
1567
+ escaping entities */
1568
+ if (is_empty(data + beg, end - beg))
1569
+ bufputc(work, '\n');
1570
+ else bufput(work, data + beg, end - beg);
1571
+ }
1572
+ beg = end;
1573
+ }
1574
+
1575
+ if (work->size && work->data[work->size - 1] != '\n')
1576
+ bufputc(work, '\n');
1577
+
1578
+ if (rndr->cb.blockcode)
1579
+ rndr->cb.blockcode(ob, work, lang.size ? &lang : NULL, rndr->opaque);
1580
+
1581
+ rndr_popbuf(rndr, BUFFER_BLOCK);
1582
+ return beg;
1583
+ }
1584
+
1585
+ static size_t
1586
+ parse_blockcode(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
1587
+ {
1588
+ size_t beg, end, pre;
1589
+ struct buf *work = 0;
1590
+
1591
+ work = rndr_newbuf(rndr, BUFFER_BLOCK);
1592
+
1593
+ beg = 0;
1594
+ while (beg < size) {
1595
+ for (end = beg + 1; end < size && data[end - 1] != '\n'; end++) {};
1596
+ pre = prefix_code(data + beg, end - beg);
1597
+
1598
+ if (pre)
1599
+ beg += pre; /* skipping prefix */
1600
+ else if (!is_empty(data + beg, end - beg))
1601
+ /* non-empty non-prefixed line breaks the pre */
1602
+ break;
1603
+
1604
+ if (beg < end) {
1605
+ /* verbatim copy to the working buffer,
1606
+ escaping entities */
1607
+ if (is_empty(data + beg, end - beg))
1608
+ bufputc(work, '\n');
1609
+ else bufput(work, data + beg, end - beg);
1610
+ }
1611
+ beg = end;
1612
+ }
1613
+
1614
+ while (work->size && work->data[work->size - 1] == '\n')
1615
+ work->size -= 1;
1616
+
1617
+ bufputc(work, '\n');
1618
+
1619
+ if (rndr->cb.blockcode)
1620
+ rndr->cb.blockcode(ob, work, NULL, rndr->opaque);
1621
+
1622
+ rndr_popbuf(rndr, BUFFER_BLOCK);
1623
+ return beg;
1624
+ }
1625
+
1626
+ /* parse_listitem • parsing of a single list item */
1627
+ /* assuming initial prefix is already removed */
1628
+ static size_t
1629
+ parse_listitem(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int *flags)
1630
+ {
1631
+ struct buf *work = 0, *inter = 0;
1632
+ size_t beg = 0, end, pre, sublist = 0, orgpre = 0, i;
1633
+ int in_empty = 0, has_inside_empty = 0, in_fence = 0;
1634
+
1635
+ /* keeping track of the first indentation prefix */
1636
+ while (orgpre < 3 && orgpre < size && data[orgpre] == ' ')
1637
+ orgpre++;
1638
+
1639
+ beg = prefix_uli(data, size);
1640
+ if (!beg)
1641
+ beg = prefix_oli(data, size);
1642
+
1643
+ if (!beg)
1644
+ return 0;
1645
+
1646
+ /* skipping to the beginning of the following line */
1647
+ end = beg;
1648
+ while (end < size && data[end - 1] != '\n')
1649
+ end++;
1650
+
1651
+ /* getting working buffers */
1652
+ work = rndr_newbuf(rndr, BUFFER_SPAN);
1653
+ inter = rndr_newbuf(rndr, BUFFER_SPAN);
1654
+
1655
+ /* putting the first line into the working buffer */
1656
+ bufput(work, data + beg, end - beg);
1657
+ beg = end;
1658
+
1659
+ /* process the following lines */
1660
+ while (beg < size) {
1661
+ size_t has_next_uli = 0, has_next_oli = 0;
1662
+
1663
+ end++;
1664
+
1665
+ while (end < size && data[end - 1] != '\n')
1666
+ end++;
1667
+
1668
+ /* process an empty line */
1669
+ if (is_empty(data + beg, end - beg)) {
1670
+ in_empty = 1;
1671
+ beg = end;
1672
+ continue;
1673
+ }
1674
+
1675
+ /* calculating the indentation */
1676
+ i = 0;
1677
+ while (i < 4 && beg + i < end && data[beg + i] == ' ')
1678
+ i++;
1679
+
1680
+ pre = i;
1681
+
1682
+ if (rndr->ext_flags & MKDEXT_FENCED_CODE) {
1683
+ if (is_codefence(data + beg + i, end - beg - i, NULL) != 0)
1684
+ in_fence = !in_fence;
1685
+ }
1686
+
1687
+ /* Only check for new list items if we are **not** inside
1688
+ * a fenced code block */
1689
+ if (!in_fence) {
1690
+ has_next_uli = prefix_uli(data + beg + i, end - beg - i);
1691
+ has_next_oli = prefix_oli(data + beg + i, end - beg - i);
1692
+ }
1693
+
1694
+ /* checking for ul/ol switch */
1695
+ if (in_empty && (
1696
+ ((*flags & MKD_LIST_ORDERED) && has_next_uli) ||
1697
+ (!(*flags & MKD_LIST_ORDERED) && has_next_oli))){
1698
+ *flags |= MKD_LI_END;
1699
+ break; /* the following item must have same list type */
1700
+ }
1701
+
1702
+ /* checking for a new item */
1703
+ if ((has_next_uli && !is_hrule(data + beg + i, end - beg - i)) || has_next_oli) {
1704
+ if (in_empty)
1705
+ has_inside_empty = 1;
1706
+
1707
+ if (pre == orgpre) /* the following item must have */
1708
+ break; /* the same indentation */
1709
+
1710
+ if (!sublist)
1711
+ sublist = work->size;
1712
+ }
1713
+ /* joining only indented stuff after empty lines;
1714
+ * note that now we only require 1 space of indentation
1715
+ * to continue a list */
1716
+ else if (in_empty && pre == 0) {
1717
+ *flags |= MKD_LI_END;
1718
+ break;
1719
+ }
1720
+ else if (in_empty) {
1721
+ bufputc(work, '\n');
1722
+ has_inside_empty = 1;
1723
+ }
1724
+
1725
+ in_empty = 0;
1726
+
1727
+ /* adding the line without prefix into the working buffer */
1728
+ bufput(work, data + beg + i, end - beg - i);
1729
+ beg = end;
1730
+ }
1731
+
1732
+ /* render of li contents */
1733
+ if (has_inside_empty)
1734
+ *flags |= MKD_LI_BLOCK;
1735
+
1736
+ if (*flags & MKD_LI_BLOCK) {
1737
+ /* intermediate render of block li */
1738
+ if (sublist && sublist < work->size) {
1739
+ parse_block(inter, rndr, work->data, sublist);
1740
+ parse_block(inter, rndr, work->data + sublist, work->size - sublist);
1741
+ }
1742
+ else
1743
+ parse_block(inter, rndr, work->data, work->size);
1744
+ } else {
1745
+ /* intermediate render of inline li */
1746
+ if (sublist && sublist < work->size) {
1747
+ parse_inline(inter, rndr, work->data, sublist);
1748
+ parse_block(inter, rndr, work->data + sublist, work->size - sublist);
1749
+ }
1750
+ else
1751
+ parse_inline(inter, rndr, work->data, work->size);
1752
+ }
1753
+
1754
+ /* render of li itself */
1755
+ if (rndr->cb.listitem)
1756
+ rndr->cb.listitem(ob, inter, *flags, rndr->opaque);
1757
+
1758
+ rndr_popbuf(rndr, BUFFER_SPAN);
1759
+ rndr_popbuf(rndr, BUFFER_SPAN);
1760
+ return beg;
1761
+ }
1762
+
1763
+
1764
+ /* parse_list • parsing ordered or unordered list block */
1765
+ static size_t
1766
+ parse_list(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int flags)
1767
+ {
1768
+ struct buf *work = 0;
1769
+ size_t i = 0, j;
1770
+
1771
+ work = rndr_newbuf(rndr, BUFFER_BLOCK);
1772
+
1773
+ while (i < size) {
1774
+ j = parse_listitem(work, rndr, data + i, size - i, &flags);
1775
+ i += j;
1776
+
1777
+ if (!j || (flags & MKD_LI_END))
1778
+ break;
1779
+ }
1780
+
1781
+ if (rndr->cb.list)
1782
+ rndr->cb.list(ob, work, flags, rndr->opaque);
1783
+ rndr_popbuf(rndr, BUFFER_BLOCK);
1784
+ return i;
1785
+ }
1786
+
1787
+ /* parse_atxheader • parsing of atx-style headers */
1788
+ static size_t
1789
+ parse_atxheader(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
1790
+ {
1791
+ size_t level = 0;
1792
+ size_t i, end, skip;
1793
+
1794
+ while (level < size && level < 6 && data[level] == '#')
1795
+ level++;
1796
+
1797
+ for (i = level; i < size && data[i] == ' '; i++);
1798
+
1799
+ for (end = i; end < size && data[end] != '\n'; end++);
1800
+ skip = end;
1801
+
1802
+ while (end && data[end - 1] == '#')
1803
+ end--;
1804
+
1805
+ while (end && data[end - 1] == ' ')
1806
+ end--;
1807
+
1808
+ if (end > i) {
1809
+ struct buf *work = rndr_newbuf(rndr, BUFFER_SPAN);
1810
+
1811
+ parse_inline(work, rndr, data + i, end - i);
1812
+
1813
+ if (rndr->cb.header)
1814
+ rndr->cb.header(ob, work, (int)level, rndr->opaque);
1815
+
1816
+ rndr_popbuf(rndr, BUFFER_SPAN);
1817
+ }
1818
+
1819
+ return skip;
1820
+ }
1821
+
1822
+
1823
+ /* htmlblock_end • checking end of HTML block : </tag>[ \t]*\n[ \t*]\n */
1824
+ /* returns the length on match, 0 otherwise */
1825
+ static size_t
1826
+ htmlblock_end_tag(
1827
+ const char *tag,
1828
+ size_t tag_len,
1829
+ struct sd_markdown *rndr,
1830
+ uint8_t *data,
1831
+ size_t size)
1832
+ {
1833
+ size_t i, w;
1834
+
1835
+ /* checking if tag is a match */
1836
+ if (tag_len + 3 >= size ||
1837
+ strncasecmp((char *)data + 2, tag, tag_len) != 0 ||
1838
+ data[tag_len + 2] != '>')
1839
+ return 0;
1840
+
1841
+ /* checking white lines */
1842
+ i = tag_len + 3;
1843
+ w = 0;
1844
+ if (i < size && (w = is_empty(data + i, size - i)) == 0)
1845
+ return 0; /* non-blank after tag */
1846
+ i += w;
1847
+ w = 0;
1848
+
1849
+ if (i < size)
1850
+ w = is_empty(data + i, size - i);
1851
+
1852
+ return i + w;
1853
+ }
1854
+
1855
+ static size_t
1856
+ htmlblock_end(const char *curtag,
1857
+ struct sd_markdown *rndr,
1858
+ uint8_t *data,
1859
+ size_t size,
1860
+ int start_of_line)
1861
+ {
1862
+ size_t tag_size = strlen(curtag);
1863
+ size_t i = 1, end_tag;
1864
+ int block_lines = 0;
1865
+
1866
+ while (i < size) {
1867
+ i++;
1868
+ while (i < size && !(data[i - 1] == '<' && data[i] == '/')) {
1869
+ if (data[i] == '\n')
1870
+ block_lines++;
1871
+
1872
+ i++;
1873
+ }
1874
+
1875
+ /* If we are only looking for unindented tags, skip the tag
1876
+ * if it doesn't follow a newline.
1877
+ *
1878
+ * The only exception to this is if the tag is still on the
1879
+ * initial line; in that case it still counts as a closing
1880
+ * tag
1881
+ */
1882
+ if (start_of_line && block_lines > 0 && data[i - 2] != '\n')
1883
+ continue;
1884
+
1885
+ if (i + 2 + tag_size >= size)
1886
+ break;
1887
+
1888
+ end_tag = htmlblock_end_tag(curtag, tag_size, rndr, data + i - 1, size - i + 1);
1889
+ if (end_tag)
1890
+ return i + end_tag - 1;
1891
+ }
1892
+
1893
+ return 0;
1894
+ }
1895
+
1896
+
1897
+ /* parse_htmlblock • parsing of inline HTML block */
1898
+ static size_t
1899
+ parse_htmlblock(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int do_render)
1900
+ {
1901
+ size_t i, j = 0, tag_end;
1902
+ const char *curtag = NULL;
1903
+ struct buf work = { data, 0, 0, 0 };
1904
+
1905
+ /* identification of the opening tag */
1906
+ if (size < 2 || data[0] != '<')
1907
+ return 0;
1908
+
1909
+ i = 1;
1910
+ while (i < size && data[i] != '>' && data[i] != ' ')
1911
+ i++;
1912
+
1913
+ if (i < size)
1914
+ curtag = find_block_tag((char *)data + 1, (int)i - 1);
1915
+
1916
+ /* handling of special cases */
1917
+ if (!curtag) {
1918
+
1919
+ /* HTML comment, laxist form */
1920
+ if (size > 5 && data[1] == '!' && data[2] == '-' && data[3] == '-') {
1921
+ i = 5;
1922
+
1923
+ while (i < size && !(data[i - 2] == '-' && data[i - 1] == '-' && data[i] == '>'))
1924
+ i++;
1925
+
1926
+ i++;
1927
+
1928
+ if (i < size)
1929
+ j = is_empty(data + i, size - i);
1930
+
1931
+ if (j) {
1932
+ work.size = i + j;
1933
+ if (do_render && rndr->cb.blockhtml)
1934
+ rndr->cb.blockhtml(ob, &work, rndr->opaque);
1935
+ return work.size;
1936
+ }
1937
+ }
1938
+
1939
+ /* HR, which is the only self-closing block tag considered */
1940
+ if (size > 4 && (data[1] == 'h' || data[1] == 'H') && (data[2] == 'r' || data[2] == 'R')) {
1941
+ i = 3;
1942
+ while (i < size && data[i] != '>')
1943
+ i++;
1944
+
1945
+ if (i + 1 < size) {
1946
+ i++;
1947
+ j = is_empty(data + i, size - i);
1948
+ if (j) {
1949
+ work.size = i + j;
1950
+ if (do_render && rndr->cb.blockhtml)
1951
+ rndr->cb.blockhtml(ob, &work, rndr->opaque);
1952
+ return work.size;
1953
+ }
1954
+ }
1955
+ }
1956
+
1957
+ /* no special case recognised */
1958
+ return 0;
1959
+ }
1960
+
1961
+ /* looking for an unindented matching closing tag */
1962
+ /* followed by a blank line */
1963
+ tag_end = htmlblock_end(curtag, rndr, data, size, 1);
1964
+
1965
+ /* if not found, trying a second pass looking for indented match */
1966
+ /* but not if tag is "ins" or "del" (following original Markdown.pl) */
1967
+ if (!tag_end && strcmp(curtag, "ins") != 0 && strcmp(curtag, "del") != 0) {
1968
+ tag_end = htmlblock_end(curtag, rndr, data, size, 0);
1969
+ }
1970
+
1971
+ if (!tag_end)
1972
+ return 0;
1973
+
1974
+ /* the end of the block has been found */
1975
+ work.size = tag_end;
1976
+ if (do_render && rndr->cb.blockhtml)
1977
+ rndr->cb.blockhtml(ob, &work, rndr->opaque);
1978
+
1979
+ return tag_end;
1980
+ }
1981
+
1982
+ static void
1983
+ parse_table_row(
1984
+ struct buf *ob,
1985
+ struct sd_markdown *rndr,
1986
+ uint8_t *data,
1987
+ size_t size,
1988
+ size_t columns,
1989
+ int *col_data,
1990
+ int header_flag)
1991
+ {
1992
+ size_t i = 0, col;
1993
+ struct buf *row_work = 0;
1994
+
1995
+ if (!rndr->cb.table_cell || !rndr->cb.table_row)
1996
+ return;
1997
+
1998
+ row_work = rndr_newbuf(rndr, BUFFER_SPAN);
1999
+
2000
+ if (i < size && data[i] == '|')
2001
+ i++;
2002
+
2003
+ for (col = 0; col < columns && i < size; ++col) {
2004
+ size_t cell_start, cell_end;
2005
+ struct buf *cell_work;
2006
+
2007
+ cell_work = rndr_newbuf(rndr, BUFFER_SPAN);
2008
+
2009
+ while (i < size && _isspace(data[i]))
2010
+ i++;
2011
+
2012
+ cell_start = i;
2013
+
2014
+ while (i < size && data[i] != '|')
2015
+ i++;
2016
+
2017
+ cell_end = i - 1;
2018
+
2019
+ while (cell_end > cell_start && _isspace(data[cell_end]))
2020
+ cell_end--;
2021
+
2022
+ parse_inline(cell_work, rndr, data + cell_start, 1 + cell_end - cell_start);
2023
+ rndr->cb.table_cell(row_work, cell_work, col_data[col] | header_flag, rndr->opaque);
2024
+
2025
+ rndr_popbuf(rndr, BUFFER_SPAN);
2026
+ i++;
2027
+ }
2028
+
2029
+ for (; col < columns; ++col) {
2030
+ struct buf empty_cell = { 0, 0, 0, 0 };
2031
+ rndr->cb.table_cell(row_work, &empty_cell, col_data[col] | header_flag, rndr->opaque);
2032
+ }
2033
+
2034
+ rndr->cb.table_row(ob, row_work, rndr->opaque);
2035
+
2036
+ rndr_popbuf(rndr, BUFFER_SPAN);
2037
+ }
2038
+
2039
+ static size_t
2040
+ parse_table_header(
2041
+ struct buf *ob,
2042
+ struct sd_markdown *rndr,
2043
+ uint8_t *data,
2044
+ size_t size,
2045
+ size_t *columns,
2046
+ int **column_data)
2047
+ {
2048
+ int pipes;
2049
+ size_t i = 0, col, header_end, under_end;
2050
+
2051
+ pipes = 0;
2052
+ while (i < size && data[i] != '\n')
2053
+ if (data[i++] == '|')
2054
+ pipes++;
2055
+
2056
+ if (i == size || pipes == 0)
2057
+ return 0;
2058
+
2059
+ header_end = i;
2060
+
2061
+ while (header_end > 0 && _isspace(data[header_end - 1]))
2062
+ header_end--;
2063
+
2064
+ if (data[0] == '|')
2065
+ pipes--;
2066
+
2067
+ if (header_end && data[header_end - 1] == '|')
2068
+ pipes--;
2069
+
2070
+ *columns = pipes + 1;
2071
+ *column_data = calloc(*columns, sizeof(int));
2072
+
2073
+ /* Parse the header underline */
2074
+ i++;
2075
+ if (i < size && data[i] == '|')
2076
+ i++;
2077
+
2078
+ under_end = i;
2079
+ while (under_end < size && data[under_end] != '\n')
2080
+ under_end++;
2081
+
2082
+ for (col = 0; col < *columns && i < under_end; ++col) {
2083
+ size_t dashes = 0;
2084
+
2085
+ while (i < under_end && data[i] == ' ')
2086
+ i++;
2087
+
2088
+ if (data[i] == ':') {
2089
+ i++; (*column_data)[col] |= MKD_TABLE_ALIGN_L;
2090
+ dashes++;
2091
+ }
2092
+
2093
+ while (i < under_end && data[i] == '-') {
2094
+ i++; dashes++;
2095
+ }
2096
+
2097
+ if (i < under_end && data[i] == ':') {
2098
+ i++; (*column_data)[col] |= MKD_TABLE_ALIGN_R;
2099
+ dashes++;
2100
+ }
2101
+
2102
+ while (i < under_end && data[i] == ' ')
2103
+ i++;
2104
+
2105
+ if (i < under_end && data[i] != '|')
2106
+ break;
2107
+
2108
+ if (dashes < 3)
2109
+ break;
2110
+
2111
+ i++;
2112
+ }
2113
+
2114
+ if (col < *columns)
2115
+ return 0;
2116
+
2117
+ parse_table_row(
2118
+ ob, rndr, data,
2119
+ header_end,
2120
+ *columns,
2121
+ *column_data,
2122
+ MKD_TABLE_HEADER
2123
+ );
2124
+
2125
+ return under_end + 1;
2126
+ }
2127
+
2128
+ static size_t
2129
+ parse_table(
2130
+ struct buf *ob,
2131
+ struct sd_markdown *rndr,
2132
+ uint8_t *data,
2133
+ size_t size)
2134
+ {
2135
+ size_t i;
2136
+
2137
+ struct buf *header_work = 0;
2138
+ struct buf *body_work = 0;
2139
+
2140
+ size_t columns;
2141
+ int *col_data = NULL;
2142
+
2143
+ header_work = rndr_newbuf(rndr, BUFFER_SPAN);
2144
+ body_work = rndr_newbuf(rndr, BUFFER_BLOCK);
2145
+
2146
+ i = parse_table_header(header_work, rndr, data, size, &columns, &col_data);
2147
+ if (i > 0) {
2148
+
2149
+ while (i < size) {
2150
+ size_t row_start;
2151
+ int pipes = 0;
2152
+
2153
+ row_start = i;
2154
+
2155
+ while (i < size && data[i] != '\n')
2156
+ if (data[i++] == '|')
2157
+ pipes++;
2158
+
2159
+ if (pipes == 0 || i == size) {
2160
+ i = row_start;
2161
+ break;
2162
+ }
2163
+
2164
+ parse_table_row(
2165
+ body_work,
2166
+ rndr,
2167
+ data + row_start,
2168
+ i - row_start,
2169
+ columns,
2170
+ col_data, 0
2171
+ );
2172
+
2173
+ i++;
2174
+ }
2175
+
2176
+ if (rndr->cb.table)
2177
+ rndr->cb.table(ob, header_work, body_work, rndr->opaque);
2178
+ }
2179
+
2180
+ free(col_data);
2181
+ rndr_popbuf(rndr, BUFFER_SPAN);
2182
+ rndr_popbuf(rndr, BUFFER_BLOCK);
2183
+ return i;
2184
+ }
2185
+
2186
+ /* parse_block • parsing of one block, returning next uint8_t to parse */
2187
+ static void
2188
+ parse_block(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)
2189
+ {
2190
+ size_t beg, end, i;
2191
+ uint8_t *txt_data;
2192
+ beg = 0;
2193
+
2194
+ if (rndr->work_bufs[BUFFER_SPAN].size +
2195
+ rndr->work_bufs[BUFFER_BLOCK].size > rndr->max_nesting)
2196
+ return;
2197
+
2198
+ while (beg < size) {
2199
+ txt_data = data + beg;
2200
+ end = size - beg;
2201
+
2202
+ if (is_atxheader(rndr, txt_data, end))
2203
+ beg += parse_atxheader(ob, rndr, txt_data, end);
2204
+
2205
+ else if (data[beg] == '<' && rndr->cb.blockhtml &&
2206
+ (i = parse_htmlblock(ob, rndr, txt_data, end, 1)) != 0)
2207
+ beg += i;
2208
+
2209
+ else if ((i = is_empty(txt_data, end)) != 0)
2210
+ beg += i;
2211
+
2212
+ else if (is_hrule(txt_data, end)) {
2213
+ if (rndr->cb.hrule)
2214
+ rndr->cb.hrule(ob, rndr->opaque);
2215
+
2216
+ while (beg < size && data[beg] != '\n')
2217
+ beg++;
2218
+
2219
+ beg++;
2220
+ }
2221
+
2222
+ else if ((rndr->ext_flags & MKDEXT_FENCED_CODE) != 0 &&
2223
+ (i = parse_fencedcode(ob, rndr, txt_data, end)) != 0)
2224
+ beg += i;
2225
+
2226
+ else if ((rndr->ext_flags & MKDEXT_TABLES) != 0 &&
2227
+ (i = parse_table(ob, rndr, txt_data, end)) != 0)
2228
+ beg += i;
2229
+
2230
+ else if (prefix_quote(txt_data, end))
2231
+ beg += parse_blockquote(ob, rndr, txt_data, end);
2232
+
2233
+ else if (prefix_code(txt_data, end))
2234
+ beg += parse_blockcode(ob, rndr, txt_data, end);
2235
+
2236
+ else if (prefix_uli(txt_data, end))
2237
+ beg += parse_list(ob, rndr, txt_data, end, 0);
2238
+
2239
+ else if (prefix_oli(txt_data, end))
2240
+ beg += parse_list(ob, rndr, txt_data, end, MKD_LIST_ORDERED);
2241
+
2242
+ else
2243
+ beg += parse_paragraph(ob, rndr, txt_data, end);
2244
+ }
2245
+ }
2246
+
2247
+
2248
+
2249
+ /*********************
2250
+ * REFERENCE PARSING *
2251
+ *********************/
2252
+
2253
+ /* is_ref • returns whether a line is a reference or not */
2254
+ static int
2255
+ is_ref(const uint8_t *data, size_t beg, size_t end, size_t *last, struct link_ref **refs)
2256
+ {
2257
+ /* int n; */
2258
+ size_t i = 0;
2259
+ size_t id_offset, id_end;
2260
+ size_t link_offset, link_end;
2261
+ size_t title_offset, title_end;
2262
+ size_t line_end;
2263
+
2264
+ /* up to 3 optional leading spaces */
2265
+ if (beg + 3 >= end) return 0;
2266
+ if (data[beg] == ' ') { i = 1;
2267
+ if (data[beg + 1] == ' ') { i = 2;
2268
+ if (data[beg + 2] == ' ') { i = 3;
2269
+ if (data[beg + 3] == ' ') return 0; } } }
2270
+ i += beg;
2271
+
2272
+ /* id part: anything but a newline between brackets */
2273
+ if (data[i] != '[') return 0;
2274
+ i++;
2275
+ id_offset = i;
2276
+ while (i < end && data[i] != '\n' && data[i] != '\r' && data[i] != ']')
2277
+ i++;
2278
+ if (i >= end || data[i] != ']') return 0;
2279
+ id_end = i;
2280
+
2281
+ /* spacer: colon (space | tab)* newline? (space | tab)* */
2282
+ i++;
2283
+ if (i >= end || data[i] != ':') return 0;
2284
+ i++;
2285
+ while (i < end && data[i] == ' ') i++;
2286
+ if (i < end && (data[i] == '\n' || data[i] == '\r')) {
2287
+ i++;
2288
+ if (i < end && data[i] == '\r' && data[i - 1] == '\n') i++; }
2289
+ while (i < end && data[i] == ' ') i++;
2290
+ if (i >= end) return 0;
2291
+
2292
+ /* link: whitespace-free sequence, optionally between angle brackets */
2293
+ if (data[i] == '<')
2294
+ i++;
2295
+
2296
+ link_offset = i;
2297
+
2298
+ while (i < end && data[i] != ' ' && data[i] != '\n' && data[i] != '\r')
2299
+ i++;
2300
+
2301
+ if (data[i - 1] == '>') link_end = i - 1;
2302
+ else link_end = i;
2303
+
2304
+ /* optional spacer: (space | tab)* (newline | '\'' | '"' | '(' ) */
2305
+ while (i < end && data[i] == ' ') i++;
2306
+ if (i < end && data[i] != '\n' && data[i] != '\r'
2307
+ && data[i] != '\'' && data[i] != '"' && data[i] != '(')
2308
+ return 0;
2309
+ line_end = 0;
2310
+ /* computing end-of-line */
2311
+ if (i >= end || data[i] == '\r' || data[i] == '\n') line_end = i;
2312
+ if (i + 1 < end && data[i] == '\n' && data[i + 1] == '\r')
2313
+ line_end = i + 1;
2314
+
2315
+ /* optional (space|tab)* spacer after a newline */
2316
+ if (line_end) {
2317
+ i = line_end + 1;
2318
+ while (i < end && data[i] == ' ') i++; }
2319
+
2320
+ /* optional title: any non-newline sequence enclosed in '"()
2321
+ alone on its line */
2322
+ title_offset = title_end = 0;
2323
+ if (i + 1 < end
2324
+ && (data[i] == '\'' || data[i] == '"' || data[i] == '(')) {
2325
+ i++;
2326
+ title_offset = i;
2327
+ /* looking for EOL */
2328
+ while (i < end && data[i] != '\n' && data[i] != '\r') i++;
2329
+ if (i + 1 < end && data[i] == '\n' && data[i + 1] == '\r')
2330
+ title_end = i + 1;
2331
+ else title_end = i;
2332
+ /* stepping back */
2333
+ i -= 1;
2334
+ while (i > title_offset && data[i] == ' ')
2335
+ i -= 1;
2336
+ if (i > title_offset
2337
+ && (data[i] == '\'' || data[i] == '"' || data[i] == ')')) {
2338
+ line_end = title_end;
2339
+ title_end = i; } }
2340
+
2341
+ if (!line_end || link_end == link_offset)
2342
+ return 0; /* garbage after the link empty link */
2343
+
2344
+ /* a valid ref has been found, filling-in return structures */
2345
+ if (last)
2346
+ *last = line_end;
2347
+
2348
+ if (refs) {
2349
+ struct link_ref *ref;
2350
+
2351
+ ref = add_link_ref(refs, data + id_offset, id_end - id_offset);
2352
+ if (!ref)
2353
+ return 0;
2354
+
2355
+ ref->link = bufnew(link_end - link_offset);
2356
+ bufput(ref->link, data + link_offset, link_end - link_offset);
2357
+
2358
+ if (title_end > title_offset) {
2359
+ ref->title = bufnew(title_end - title_offset);
2360
+ bufput(ref->title, data + title_offset, title_end - title_offset);
2361
+ }
2362
+ }
2363
+
2364
+ return 1;
2365
+ }
2366
+
2367
+ static void expand_tabs(struct buf *ob, const uint8_t *line, size_t size)
2368
+ {
2369
+ size_t i = 0, tab = 0;
2370
+
2371
+ while (i < size) {
2372
+ size_t org = i;
2373
+
2374
+ while (i < size && line[i] != '\t') {
2375
+ i++; tab++;
2376
+ }
2377
+
2378
+ if (i > org)
2379
+ bufput(ob, line + org, i - org);
2380
+
2381
+ if (i >= size)
2382
+ break;
2383
+
2384
+ do {
2385
+ bufputc(ob, ' '); tab++;
2386
+ } while (tab % 4);
2387
+
2388
+ i++;
2389
+ }
2390
+ }
2391
+
2392
+ /**********************
2393
+ * EXPORTED FUNCTIONS *
2394
+ **********************/
2395
+
2396
+ __declspec(dllexport) struct sd_markdown *
2397
+ sd_markdown_new(
2398
+ unsigned int extensions,
2399
+ size_t max_nesting,
2400
+ const struct sd_callbacks *callbacks,
2401
+ void *opaque)
2402
+ {
2403
+ struct sd_markdown *md = NULL;
2404
+
2405
+ assert(max_nesting > 0 && callbacks);
2406
+
2407
+ md = malloc(sizeof(struct sd_markdown));
2408
+ if (!md)
2409
+ return NULL;
2410
+
2411
+ memcpy(&md->cb, callbacks, sizeof(struct sd_callbacks));
2412
+
2413
+ stack_init(&md->work_bufs[BUFFER_BLOCK], 4);
2414
+ stack_init(&md->work_bufs[BUFFER_SPAN], 8);
2415
+
2416
+ memset(md->active_char, 0x0, 256);
2417
+
2418
+ if (md->cb.emphasis || md->cb.double_emphasis || md->cb.triple_emphasis) {
2419
+ md->active_char['*'] = MD_CHAR_EMPHASIS;
2420
+ md->active_char['_'] = MD_CHAR_EMPHASIS;
2421
+ if (extensions & MKDEXT_STRIKETHROUGH)
2422
+ md->active_char['~'] = MD_CHAR_EMPHASIS;
2423
+ }
2424
+
2425
+ if (md->cb.codespan)
2426
+ md->active_char['`'] = MD_CHAR_CODESPAN;
2427
+
2428
+ if (md->cb.linebreak)
2429
+ md->active_char['\n'] = MD_CHAR_LINEBREAK;
2430
+
2431
+ if (md->cb.image || md->cb.link)
2432
+ md->active_char['['] = MD_CHAR_LINK;
2433
+
2434
+ md->active_char['<'] = MD_CHAR_LANGLE;
2435
+ md->active_char['\\'] = MD_CHAR_ESCAPE;
2436
+ md->active_char['&'] = MD_CHAR_ENTITITY;
2437
+
2438
+ if (extensions & MKDEXT_AUTOLINK) {
2439
+ md->active_char[':'] = MD_CHAR_AUTOLINK_URL;
2440
+ md->active_char['@'] = MD_CHAR_AUTOLINK_EMAIL;
2441
+ md->active_char['w'] = MD_CHAR_AUTOLINK_WWW;
2442
+ }
2443
+
2444
+ if (extensions & MKDEXT_SUPERSCRIPT)
2445
+ md->active_char['^'] = MD_CHAR_SUPERSCRIPT;
2446
+
2447
+ /* Extension data */
2448
+ md->ext_flags = extensions;
2449
+ md->opaque = opaque;
2450
+ md->max_nesting = max_nesting;
2451
+ md->in_link_body = 0;
2452
+
2453
+ return md;
2454
+ }
2455
+
2456
+ __declspec(dllexport) void
2457
+ sd_markdown_render(struct buf *ob, const uint8_t *document, size_t doc_size, struct sd_markdown *md)
2458
+ {
2459
+ #define MARKDOWN_GROW(x) ((x) + ((x) >> 1))
2460
+ static const char UTF8_BOM[] = {0xEF, 0xBB, 0xBF};
2461
+
2462
+ struct buf *text;
2463
+ size_t beg, end;
2464
+
2465
+ text = bufnew(64);
2466
+ if (!text)
2467
+ return;
2468
+
2469
+ /* Preallocate enough space for our buffer to avoid expanding while copying */
2470
+ bufgrow(text, doc_size);
2471
+
2472
+ /* reset the references table */
2473
+ memset(&md->refs, 0x0, REF_TABLE_SIZE * sizeof(void *));
2474
+
2475
+ /* first pass: looking for references, copying everything else */
2476
+ beg = 0;
2477
+
2478
+ /* Skip a possible UTF-8 BOM, even though the Unicode standard
2479
+ * discourages having these in UTF-8 documents */
2480
+ if (doc_size >= 3 && memcmp(document, UTF8_BOM, 3) == 0)
2481
+ beg += 3;
2482
+
2483
+ while (beg < doc_size) /* iterating over lines */
2484
+ if (is_ref(document, beg, doc_size, &end, md->refs))
2485
+ beg = end;
2486
+ else { /* skipping to the next line */
2487
+ end = beg;
2488
+ while (end < doc_size && document[end] != '\n' && document[end] != '\r')
2489
+ end++;
2490
+
2491
+ /* adding the line body if present */
2492
+ if (end > beg)
2493
+ expand_tabs(text, document + beg, end - beg);
2494
+
2495
+ while (end < doc_size && (document[end] == '\n' || document[end] == '\r')) {
2496
+ /* add one \n per newline */
2497
+ if (document[end] == '\n' || (end + 1 < doc_size && document[end + 1] != '\n'))
2498
+ bufputc(text, '\n');
2499
+ end++;
2500
+ }
2501
+
2502
+ beg = end;
2503
+ }
2504
+
2505
+ /* pre-grow the output buffer to minimize allocations */
2506
+ bufgrow(ob, MARKDOWN_GROW(text->size));
2507
+
2508
+ /* second pass: actual rendering */
2509
+ if (md->cb.doc_header)
2510
+ md->cb.doc_header(ob, md->opaque);
2511
+
2512
+ if (text->size) {
2513
+ /* adding a final newline if not already present */
2514
+ if (text->data[text->size - 1] != '\n' && text->data[text->size - 1] != '\r')
2515
+ bufputc(text, '\n');
2516
+
2517
+ parse_block(ob, md, text->data, text->size);
2518
+ }
2519
+
2520
+ if (md->cb.doc_footer)
2521
+ md->cb.doc_footer(ob, md->opaque);
2522
+
2523
+ /* clean-up */
2524
+ bufrelease(text);
2525
+ free_link_refs(md->refs);
2526
+
2527
+ assert(md->work_bufs[BUFFER_SPAN].size == 0);
2528
+ assert(md->work_bufs[BUFFER_BLOCK].size == 0);
2529
+ }
2530
+
2531
+ __declspec(dllexport) void
2532
+ sd_markdown_free(struct sd_markdown *md)
2533
+ {
2534
+ size_t i;
2535
+
2536
+ for (i = 0; i < (size_t)md->work_bufs[BUFFER_SPAN].asize; ++i)
2537
+ bufrelease(md->work_bufs[BUFFER_SPAN].item[i]);
2538
+
2539
+ for (i = 0; i < (size_t)md->work_bufs[BUFFER_BLOCK].asize; ++i)
2540
+ bufrelease(md->work_bufs[BUFFER_BLOCK].item[i]);
2541
+
2542
+ stack_free(&md->work_bufs[BUFFER_SPAN]);
2543
+ stack_free(&md->work_bufs[BUFFER_BLOCK]);
2544
+
2545
+ free(md);
2546
+ }
2547
+
2548
+ __declspec(dllexport) void
2549
+ sd_version(int *ver_major, int *ver_minor, int *ver_revision)
2550
+ {
2551
+ *ver_major = SUNDOWN_VER_MAJOR;
2552
+ *ver_minor = SUNDOWN_VER_MINOR;
2553
+ *ver_revision = SUNDOWN_VER_REVISION;
2554
+ }
2555
+
2556
+ /* vim: set filetype=c: */