@cosense-toolbox/parser 0.1.0-beta.0

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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +794 -0
  3. package/dist/ast-CIKXwSl5.mjs +41 -0
  4. package/dist/ast-CIKXwSl5.mjs.map +1 -0
  5. package/dist/ast-uYWtkHwT.cjs +52 -0
  6. package/dist/ast-uYWtkHwT.cjs.map +1 -0
  7. package/dist/compile.cjs +265 -0
  8. package/dist/compile.cjs.map +1 -0
  9. package/dist/compile.d.cts +135 -0
  10. package/dist/compile.d.cts.map +1 -0
  11. package/dist/compile.d.mts +135 -0
  12. package/dist/compile.d.mts.map +1 -0
  13. package/dist/compile.mjs +256 -0
  14. package/dist/compile.mjs.map +1 -0
  15. package/dist/create-compiler-CvlndKOA.d.cts +23 -0
  16. package/dist/create-compiler-CvlndKOA.d.cts.map +1 -0
  17. package/dist/create-compiler-jdA408ny.d.mts +23 -0
  18. package/dist/create-compiler-jdA408ny.d.mts.map +1 -0
  19. package/dist/image-url-YcTed8tg.cjs +68 -0
  20. package/dist/image-url-YcTed8tg.cjs.map +1 -0
  21. package/dist/image-url-eQ6X-oN0.mjs +51 -0
  22. package/dist/image-url-eQ6X-oN0.mjs.map +1 -0
  23. package/dist/index.cjs +716 -0
  24. package/dist/index.cjs.map +1 -0
  25. package/dist/index.d.cts +77 -0
  26. package/dist/index.d.cts.map +1 -0
  27. package/dist/index.d.mts +77 -0
  28. package/dist/index.d.mts.map +1 -0
  29. package/dist/index.mjs +709 -0
  30. package/dist/index.mjs.map +1 -0
  31. package/dist/plugin.cjs +0 -0
  32. package/dist/plugin.d.cts +4 -0
  33. package/dist/plugin.d.mts +4 -0
  34. package/dist/plugin.mjs +1 -0
  35. package/dist/schema.cjs +171 -0
  36. package/dist/schema.cjs.map +1 -0
  37. package/dist/schema.d.cts +34 -0
  38. package/dist/schema.d.cts.map +1 -0
  39. package/dist/schema.d.mts +34 -0
  40. package/dist/schema.d.mts.map +1 -0
  41. package/dist/schema.mjs +148 -0
  42. package/dist/schema.mjs.map +1 -0
  43. package/dist/types-BXlnUFr0.d.mts +63 -0
  44. package/dist/types-BXlnUFr0.d.mts.map +1 -0
  45. package/dist/types-Bo_BrmvK.d.cts +230 -0
  46. package/dist/types-Bo_BrmvK.d.cts.map +1 -0
  47. package/dist/types-Bo_BrmvK.d.mts +230 -0
  48. package/dist/types-Bo_BrmvK.d.mts.map +1 -0
  49. package/dist/types-DVwlUtla.d.cts +63 -0
  50. package/dist/types-DVwlUtla.d.cts.map +1 -0
  51. package/dist/utils.cjs +80 -0
  52. package/dist/utils.cjs.map +1 -0
  53. package/dist/utils.d.cts +46 -0
  54. package/dist/utils.d.cts.map +1 -0
  55. package/dist/utils.d.mts +46 -0
  56. package/dist/utils.d.mts.map +1 -0
  57. package/dist/utils.mjs +72 -0
  58. package/dist/utils.mjs.map +1 -0
  59. package/package.json +96 -0
@@ -0,0 +1,51 @@
1
+ import { Option, pipe } from "effect";
2
+ //#region src/core/image-url.ts
3
+ /**
4
+ * image-url.ts — URL が画像かどうかの判定と、表示用 URL への変換。
5
+ *
6
+ * 判定は `[url]` が image ノードになるか externalLink ノードになるかを分けるので、
7
+ * 記法の構造の一部としてパーサーが持つ。変換のほうは表示のための書き換えなので
8
+ * パースでは行わず、描画する側 (`compile/`) が明示的に呼ぶ。
9
+ * oEmbed の取得や動画判定のような URL の意味解決はこのパッケージの外の仕事。
10
+ */
11
+ const IMAGE_EXT_RE = /\.(png|jpe?g|gif|webp|svg|bmp|avif)$/i;
12
+ /** Gyazo のページ URL / 画像 URL から hash を取り出す。 */
13
+ const GYAZO_RE = /^https?:\/\/(?:i\.)?gyazo\.com\/([0-9a-f]{20,})/i;
14
+ /** 末尾が画像の拡張子か。URL でなくてもよい (`a.png` のような相対パスも真になる)。 */
15
+ const hasImageExtension = (s) => IMAGE_EXT_RE.test(s);
16
+ /**
17
+ * Gyazo のページ URL は拡張子を持たないが画像として表示される。
18
+ * `<img>` に入れるには hash から画像 URL を組み立て直す必要がある。
19
+ */
20
+ const gyazoSrc = (url) => pipe(Option.fromNullable(url.match(GYAZO_RE)?.[1]), Option.map((hash) => `https://i.gyazo.com/${hash}.png`));
21
+ /**
22
+ * フラグメントの末尾が拡張子。拡張子を持たない配信 URL に `#.svg` / `#.png` を足して
23
+ * 「これは画像」と教える Cosense の書き方 (`https://x/api/status?id=1#.svg`) のため。
24
+ */
25
+ const fragmentSrc = (url) => {
26
+ const hash = url.indexOf("#");
27
+ return hash >= 0 && IMAGE_EXT_RE.test(url.slice(hash)) ? Option.some(url) : Option.none();
28
+ };
29
+ /**
30
+ * クエリ / フラグメントを落としたパスの末尾が拡張子。画像 CDN の
31
+ * `....jpeg?fit=bounds&width=1280` のような URL のため。
32
+ *
33
+ * フラグメントを別に見ているのは、`/img?url=https://y/a.png` のように
34
+ * 「クエリの中にだけ拡張子がある」URL を画像と誤判定しないため。
35
+ */
36
+ const pathSrc = (url) => IMAGE_EXT_RE.test(url.replace(/[?#].*$/, "")) ? Option.some(url) : Option.none();
37
+ /** `<img src>` に入れられる形の URL。画像でなければ None。 */
38
+ const imageSrc = (url) => pipe(gyazoSrc(url), Option.orElse(() => fragmentSrc(url)), Option.orElse(() => pathSrc(url)));
39
+ /** URL が画像として表示されるものか。判定だけを行い、URL は書き換えない。 */
40
+ const isImageUrl = (url) => Option.isSome(imageSrc(url));
41
+ /**
42
+ * 画像 URL なら `<img src>` に入れられる形にして返す。画像でなければ null。
43
+ *
44
+ * Gyazo のページ URL はここでだけ `https://i.gyazo.com/{hash}.png` に差し替わる。
45
+ * `parse()` はこの変換を行わない (AST はソースに書かれた文字列を保つ)。
46
+ */
47
+ const asImageSrc = (url) => Option.getOrNull(imageSrc(url));
48
+ //#endregion
49
+ export { hasImageExtension as n, isImageUrl as r, asImageSrc as t };
50
+
51
+ //# sourceMappingURL=image-url-eQ6X-oN0.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-url-eQ6X-oN0.mjs","names":[],"sources":["../src/core/image-url.ts"],"sourcesContent":["/**\n * image-url.ts — URL が画像かどうかの判定と、表示用 URL への変換。\n *\n * 判定は `[url]` が image ノードになるか externalLink ノードになるかを分けるので、\n * 記法の構造の一部としてパーサーが持つ。変換のほうは表示のための書き換えなので\n * パースでは行わず、描画する側 (`compile/`) が明示的に呼ぶ。\n * oEmbed の取得や動画判定のような URL の意味解決はこのパッケージの外の仕事。\n */\nimport { Option, pipe } from 'effect'\n\nconst IMAGE_EXT_RE = /\\.(png|jpe?g|gif|webp|svg|bmp|avif)$/i\n\n/** Gyazo のページ URL / 画像 URL から hash を取り出す。 */\nconst GYAZO_RE = /^https?:\\/\\/(?:i\\.)?gyazo\\.com\\/([0-9a-f]{20,})/i\n\n/** 末尾が画像の拡張子か。URL でなくてもよい (`a.png` のような相対パスも真になる)。 */\nexport const hasImageExtension = (s: string): boolean => IMAGE_EXT_RE.test(s)\n\n/**\n * Gyazo のページ URL は拡張子を持たないが画像として表示される。\n * `<img>` に入れるには hash から画像 URL を組み立て直す必要がある。\n */\nconst gyazoSrc = (url: string): Option.Option<string> =>\n pipe(\n Option.fromNullable(url.match(GYAZO_RE)?.[1]),\n Option.map((hash) => `https://i.gyazo.com/${hash}.png`),\n )\n\n/**\n * フラグメントの末尾が拡張子。拡張子を持たない配信 URL に `#.svg` / `#.png` を足して\n * 「これは画像」と教える Cosense の書き方 (`https://x/api/status?id=1#.svg`) のため。\n */\nconst fragmentSrc = (url: string): Option.Option<string> => {\n const hash = url.indexOf('#')\n return hash >= 0 && IMAGE_EXT_RE.test(url.slice(hash)) ? Option.some(url) : Option.none()\n}\n\n/**\n * クエリ / フラグメントを落としたパスの末尾が拡張子。画像 CDN の\n * `....jpeg?fit=bounds&width=1280` のような URL のため。\n *\n * フラグメントを別に見ているのは、`/img?url=https://y/a.png` のように\n * 「クエリの中にだけ拡張子がある」URL を画像と誤判定しないため。\n */\nconst pathSrc = (url: string): Option.Option<string> =>\n IMAGE_EXT_RE.test(url.replace(/[?#].*$/, '')) ? Option.some(url) : Option.none()\n\n/** `<img src>` に入れられる形の URL。画像でなければ None。 */\nconst imageSrc = (url: string): Option.Option<string> =>\n pipe(\n gyazoSrc(url),\n Option.orElse(() => fragmentSrc(url)),\n Option.orElse(() => pathSrc(url)),\n )\n\n/** URL が画像として表示されるものか。判定だけを行い、URL は書き換えない。 */\nexport const isImageUrl = (url: string): boolean => Option.isSome(imageSrc(url))\n\n/**\n * 画像 URL なら `<img src>` に入れられる形にして返す。画像でなければ null。\n *\n * Gyazo のページ URL はここでだけ `https://i.gyazo.com/{hash}.png` に差し替わる。\n * `parse()` はこの変換を行わない (AST はソースに書かれた文字列を保つ)。\n */\nexport const asImageSrc = (url: string): string | null => Option.getOrNull(imageSrc(url))\n"],"mappings":";;;;;;;;;;AAUA,MAAM,eAAe;;AAGrB,MAAM,WAAW;;AAGjB,MAAa,qBAAqB,MAAuB,aAAa,KAAK,CAAC;;;;;AAM5E,MAAM,YAAY,QAChB,KACE,OAAO,aAAa,IAAI,MAAM,QAAQ,CAAC,GAAG,EAAE,GAC5C,OAAO,KAAK,SAAS,uBAAuB,KAAK,KAAK,CACxD;;;;;AAMF,MAAM,eAAe,QAAuC;CAC1D,MAAM,OAAO,IAAI,QAAQ,GAAG;CAC5B,OAAO,QAAQ,KAAK,aAAa,KAAK,IAAI,MAAM,IAAI,CAAC,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK;AAC1F;;;;;;;;AASA,MAAM,WAAW,QACf,aAAa,KAAK,IAAI,QAAQ,WAAW,EAAE,CAAC,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK;;AAGjF,MAAM,YAAY,QAChB,KACE,SAAS,GAAG,GACZ,OAAO,aAAa,YAAY,GAAG,CAAC,GACpC,OAAO,aAAa,QAAQ,GAAG,CAAC,CAClC;;AAGF,MAAa,cAAc,QAAyB,OAAO,OAAO,SAAS,GAAG,CAAC;;;;;;;AAQ/E,MAAa,cAAc,QAA+B,OAAO,UAAU,SAAS,GAAG,CAAC"}