securemark 0.259.2 → 0.260.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.
Files changed (69) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/design.md +14 -4
  3. package/dist/index.js +253 -207
  4. package/package.json +1 -1
  5. package/src/combinator/control/constraint/block.ts +2 -3
  6. package/src/combinator/control/constraint/contract.ts +5 -7
  7. package/src/combinator/control/constraint/line.ts +1 -2
  8. package/src/combinator/control/manipulation/convert.ts +1 -2
  9. package/src/combinator/control/manipulation/fence.ts +1 -2
  10. package/src/combinator/control/manipulation/match.ts +2 -3
  11. package/src/combinator/control/manipulation/scope.ts +3 -5
  12. package/src/combinator/control/manipulation/surround.ts +2 -2
  13. package/src/combinator/control/monad/bind.ts +2 -3
  14. package/src/combinator/data/parser/context.ts +20 -22
  15. package/src/combinator/data/parser/inits.ts +1 -2
  16. package/src/combinator/data/parser/sequence.ts +1 -2
  17. package/src/combinator/data/parser/some.ts +1 -2
  18. package/src/parser/api/parse.test.ts +19 -19
  19. package/src/parser/autolink.test.ts +6 -6
  20. package/src/parser/block/blockquote.test.ts +8 -8
  21. package/src/parser/block/blockquote.ts +3 -3
  22. package/src/parser/block/codeblock.test.ts +4 -4
  23. package/src/parser/block/dlist.test.ts +1 -1
  24. package/src/parser/block/dlist.ts +2 -2
  25. package/src/parser/block/extension/figure.test.ts +1 -1
  26. package/src/parser/block/extension/table.ts +3 -3
  27. package/src/parser/block/heading.test.ts +5 -5
  28. package/src/parser/block/ilist.ts +1 -1
  29. package/src/parser/block/olist.test.ts +1 -1
  30. package/src/parser/block/olist.ts +1 -1
  31. package/src/parser/block/paragraph.test.ts +14 -14
  32. package/src/parser/block/reply/cite.test.ts +11 -11
  33. package/src/parser/block/reply/cite.ts +1 -1
  34. package/src/parser/block/reply/quote.test.ts +3 -3
  35. package/src/parser/block/reply/quote.ts +1 -1
  36. package/src/parser/block/reply.test.ts +8 -8
  37. package/src/parser/block/sidefence.test.ts +6 -6
  38. package/src/parser/block/sidefence.ts +1 -1
  39. package/src/parser/block/table.ts +4 -4
  40. package/src/parser/block/ulist.test.ts +1 -1
  41. package/src/parser/block/ulist.ts +2 -2
  42. package/src/parser/block.ts +1 -1
  43. package/src/parser/context.ts +8 -7
  44. package/src/parser/inline/annotation.test.ts +3 -3
  45. package/src/parser/inline/autolink/account.test.ts +11 -11
  46. package/src/parser/inline/autolink/account.ts +4 -2
  47. package/src/parser/inline/autolink/anchor.test.ts +9 -9
  48. package/src/parser/inline/autolink/anchor.ts +14 -11
  49. package/src/parser/inline/autolink/channel.test.ts +3 -3
  50. package/src/parser/inline/autolink/hashnum.ts +4 -2
  51. package/src/parser/inline/autolink/hashtag.test.ts +20 -20
  52. package/src/parser/inline/autolink/hashtag.ts +4 -2
  53. package/src/parser/inline/autolink/url.test.ts +55 -55
  54. package/src/parser/inline/html.test.ts +0 -2
  55. package/src/parser/inline/html.ts +1 -1
  56. package/src/parser/inline/link.test.ts +110 -110
  57. package/src/parser/inline/link.ts +30 -28
  58. package/src/parser/inline/media.test.ts +1 -0
  59. package/src/parser/inline/media.ts +1 -1
  60. package/src/parser/inline/reference.test.ts +3 -3
  61. package/src/parser/inline/ruby.ts +1 -1
  62. package/src/parser/inline.test.ts +51 -51
  63. package/src/parser/source/escapable.ts +1 -1
  64. package/src/parser/source/str.ts +4 -4
  65. package/src/parser/source/text.ts +2 -3
  66. package/src/parser/source/unescapable.ts +1 -1
  67. package/src/renderer/render/media/pdf.ts +1 -0
  68. package/src/renderer/render/media/twitter.ts +7 -1
  69. package/src/util/info.ts +2 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.260.2
4
+
5
+ - Refactoring.
6
+
7
+ ## 0.260.1
8
+
9
+ - Refactoring.
10
+
11
+ ## 0.260.0
12
+
13
+ - Change link parser to accept shortcut text.
14
+ - Fix html parser.
15
+
3
16
  ## 0.259.2
4
17
 
5
18
  - Refactoring.
package/design.md CHANGED
@@ -265,7 +265,7 @@ HTMLEntity構文はエンティティ追加時の互換性確保のため不正
265
265
  対象は必ず可視の文字または要素から始まる。
266
266
  対象部分(角括弧)は常に指示部分(波または丸括弧)に先行する。
267
267
 
268
- ## 注意事項
268
+ ## 備考
269
269
 
270
270
  ### 実行速度
271
271
 
@@ -284,9 +284,9 @@ CodeMirrorが素では速いがVimModeでは数万文字程度でも耐え難く
284
284
 
285
285
  ### バックトラック
286
286
 
287
- SecuremarkのAnnotation構文に典型的であるように文脈を変更する構文の中にその文脈に依存し変更される他の構文が存在する場合一般に文脈の相違から解析結果を再利用不能な(`αA'β | αAB`)バックトラックが生じる。文脈依存構文の解析中に文脈により解釈の異なる字句(`[a[`)または現在の文脈を終了する字句(ただの括弧がスコープを作らない場合の`(([a))`)に遭遇したとき、現在の文脈での解析の継続を試行する解析方法はメモ化なしではバックトラックが再帰的に生じ線形時間で解析できず、現在の文脈での解析を中止し直前の文脈を継続または新たな文脈を開始する解析方法はバックトラックなしで線形時間で解析できる。
288
- CommonMarkはLink構文から明らかなように後者の解析方法により重篤なバックトラックなし(作者によると、だがHTML構文とAutolink構文では再帰的バックトラックが生じるのはないか?)で(インラインでは)ほぼ1回の走査で解析できる言語であるが同時にこれは文脈依存構文の正当な入れ子表現(`[<a@b>]`)を解析できないか不正な表現(`[<a@b>]()`)を除外できず二重リンク(`<a><a></a></a>`)を生成する、文脈依存構文の存在する数に応じて多項式的(おそらく$n^{2+c}$)に構文の壊れやすさの増す脆く拡張性の低い言語であることを意味する(構文の決定を遅延できれば解決できるがこれにより他の構文の解釈が非決定的にならない場合に限られる。そしてCommonMarkは角括弧(`<>`)の対応を取っていないためAutolink構文は自身の解釈が非決定的になると後続の構文の解釈も非決定的になる)。この問題はおそらくメモ化により解決できるがCommonMarkは実行性能追及のためメモ化を廃止しており二重リンクも放置しているためメモ化により性能を低下させてまで解決するつもりはないと思われる(すなわちCommonMarkは機械を至上とし人間に制約を課す低水準の言語であり人間の需要を至上とするSecuremarkとは対極に位置する)。
289
- 従って現在のほぼ1回の走査で解析可能な文法に制約されるCommonMarkには文脈依存構文を入れ子表現の広範な制限ならびに構文の可読性および開始記号の信頼性の多項式的な低下と引き換えにしか追加できないという拡張性の欠陥が存在する。CommonMarkの仕様策定者が構文の拡張に(名称を維持するか否かにかかわらず)不自然なまでに消極的または進展がないのは正当な理由や怠慢からでなく文脈依存構文を追加するにつれて構文解析戦略の欠陥が明白になっていくためおよび現在の高い実行性能を低下させたくないためである。`~~a~~`のような文脈自由構文は容易に追加できるがこうしたマージンを失えばもはや後はない。CommonMarkは小さく単純であるがゆえに正しくいられる象牙の塔であり仕様策定者はこの正しさを失わず正しいままでいたいがために象牙の塔に引きこもり小さな完全性を固持し続けているのである(でなければ何年も隠さず速やかにこの拡張性の欠如を公表して助力を求めていなければならない)。
287
+ SecuremarkのAnnotation構文に典型的であるように文脈を変更する構文の中にその文脈に依存し変更される他の構文が存在する場合一般に文脈の相違から解析結果を再利用不能な(`αA'β | αAB`)バックトラックが生じる。文脈依存構文の解析中に文脈により解釈の異なる字句(`[a((`)または現在の文脈を終了する字句(ただの括弧がスコープを作らない場合の`(([a))`)に遭遇したとき、現在の文脈での解析の継続を試行する解析方法はメモ化なしではバックトラックが再帰的に生じ線形時間で解析できず、現在の文脈での解析を中止し直前の文脈を継続または新たな文脈を開始する解析方法はバックトラックなしで線形時間で解析できる。
288
+ CommonMarkはLink構文から明らかなように後者の解析方法により再帰的バックトラックなし(Markdown(2n)+正規表現(1n)で最悪計算量3n程度)で解析できる言語であるが同時にこれは文脈依存構文の正当な入れ子表現を解析できず文脈依存構文の存在する数に応じて多項式的(おそらく$n^{2+c}$)に構文の壊れやすさの増す脆く拡張性の低い言語であることを意味する。この問題はおそらくメモ化により解決できるがCommonMarkは実行性能追及のためメモ化を廃止しているためメモ化により性能を低下させてまで解決するつもりはないと思われる(すなわちCommonMarkは機械を至上とし人間に制約を課す低水準の言語であり人間の需要を至上とするSecuremarkとは対極に位置する)。
289
+ 従って現在の再帰的バックトラックなしで解析可能な文法に制約されるCommonMarkには文脈依存構文を入れ子表現の広範な制限ならびに構文の可読性および開始記号の信頼性の多項式的な低下と引き換えにしか追加できないという拡張性の欠陥が存在する。CommonMarkの仕様策定者が構文の拡張に(名称を維持するか否かにかかわらず)不自然なまでに消極的または進展がないのは正当な理由や怠慢からでなく文脈依存構文を追加するにつれて構文解析戦略の欠陥が明白になっていくためおよび現在の高い実行性能を低下させたくないためである。`~~a~~`のような文脈自由構文は容易に追加できるがこうしたマージンを失えばもはや後はない。CommonMarkは小さく単純であるがゆえに正しくいられる象牙の塔であり仕様策定者はこの正しさを失わず正しいままでいたいがために象牙の塔に引きこもり小さな完全性を固持し続けているのである(でなければ何年も隠さず速やかにこの拡張性の欠如を公表して助力を求めていなければならない)。
290
290
  Securemarkは線形時間で解析不能な前者の解析方法をメモ化によりおおよそ4n以下の最悪計算量に改善しさらに解析時間と解析範囲の局限により一定時間内で解析不能な入力の影響を局限することでこれらの問題を解決している。この解析方法はほとんどの自然な入力に対して1nに近い時間で効率的に動作し、最悪計算量で低速に動作させる少数の機械的攻撃入力に対してもサーバーで多数のユーザーのリクエストに応じるには低速で脆弱性となる可能性があるがクライアントで単一のユーザーの操作に応じるには十分高速であるためクライアントで解析する限り解析の効率または速度が実用上問題となることはない。
291
291
 
292
292
  ### メモ化
@@ -308,6 +308,16 @@ Markdownのように自然言語と自身の文法を分離する汎用構造が
308
308
  よってMarkdownの標準化は後方互換性確保が不可能であることから発展性がなくスナップショット以上の技術的意味を持たない。
309
309
  MarkdownはGFMのように最初から高機能で完成度の高い拡張不要な独自実装のほうが標準としての互換性を確保でき、構文に曖昧さがない形式言語と異なりまず最小限の標準仕様を策定しのちに拡張していく通常の標準化方法が適さない特殊な言語である。
310
310
 
311
+ ### CommonMarkの重大な問題点
312
+
313
+ - 文脈依存(かつ正規表現で解析できない)構文を追加できない(要解析戦略変更)
314
+ - 二重リンク(`[<a@b>]()`)を生成する
315
+ - 画像のaltがMarkdownとして解釈される
316
+ - タブまたは4スペース以上で字下げできない(要構文削除)
317
+ - 情報の再利用性が低い
318
+ - 引用に恒等性がない
319
+ - 改行に恒等性がない
320
+
311
321
  ### トランスクルージョン
312
322
 
313
323
  分散的に管理される情報のトランスクルージョンは権利関係の不明瞭さおよびリンク先の消失によりリンク元の情報に欠損が生じるなどの脆さから壊れやすいウェブ上の情報を扱う方法として既存の方法より劣っておりWikipediaのように中央集権的管理を実施できる場合にのみ有用となる。