{"id":13339282,"url":"https://github.com/Narazaka/shiorijk","last_synced_at":"2025-03-11T12:31:50.593Z","repository":{"id":16173719,"uuid":"18920055","full_name":"Narazaka/shiorijk","owner":"Narazaka","description":"SHIORI/3.x Parser/Container","archived":false,"fork":false,"pushed_at":"2021-05-02T13:06:46.000Z","size":850,"stargazers_count":6,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-10T18:53:21.945Z","etag":null,"topics":["shiori","ukagaka"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"zlib","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Narazaka.png","metadata":{"files":{"readme":"Readme.ja.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-04-18T17:30:46.000Z","updated_at":"2023-10-16T15:58:52.000Z","dependencies_parsed_at":"2022-08-28T08:20:52.405Z","dependency_job_id":null,"html_url":"https://github.com/Narazaka/shiorijk","commit_stats":null,"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Narazaka%2Fshiorijk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Narazaka%2Fshiorijk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Narazaka%2Fshiorijk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Narazaka%2Fshiorijk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Narazaka","download_url":"https://codeload.github.com/Narazaka/shiorijk/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242909964,"owners_count":20205203,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["shiori","ukagaka"],"created_at":"2024-07-29T19:19:54.702Z","updated_at":"2025-03-11T12:31:48.024Z","avatar_url":"https://github.com/Narazaka.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ShioriJK - SHIORI/3.x パーサ/コンテナ\n\n[![npm](https://img.shields.io/npm/v/shiorijk.svg)](https://www.npmjs.com/package/shiorijk)\n[![npm license](https://img.shields.io/npm/l/shiorijk.svg)](https://www.npmjs.com/package/shiorijk)\n[![npm download total](https://img.shields.io/npm/dt/shiorijk.svg)](https://www.npmjs.com/package/shiorijk)\n[![npm download by month](https://img.shields.io/npm/dm/shiorijk.svg)](https://www.npmjs.com/package/shiorijk)\n[![Bower](https://img.shields.io/bower/v/shiorijk.svg)](https://github.com/Narazaka/shiorijk)\n[![Bower](https://img.shields.io/bower/l/shiorijk.svg)](https://github.com/Narazaka/shiorijk)\n\n[![Dependency Status](https://david-dm.org/Narazaka/shiorijk/status.svg)](https://david-dm.org/Narazaka/shiorijk)\n[![devDependency Status](https://david-dm.org/Narazaka/shiorijk/dev-status.svg)](https://david-dm.org/Narazaka/shiorijk?type=dev)\n[![Travis Build Status](https://travis-ci.org/Narazaka/shiorijk.svg?branch=master)](https://travis-ci.org/Narazaka/shiorijk)\n[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/Narazaka/shiorijk?svg=true\u0026branch=master)](https://ci.appveyor.com/project/Narazaka/shiorijk)\n[![codecov.io](https://codecov.io/github/Narazaka/shiorijk/coverage.svg?branch=master)](https://codecov.io/github/Narazaka/shiorijk?branch=master)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e8aa6e24b6d47c29aa8ebb82b6a1e06)](https://www.codacy.com/app/narazaka/shiorijk?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=Narazaka/shiorijk\u0026utm_campaign=Badge_Grade)\n\n**つまるところ、栞は JK である**\n\n## インストール\n\n    npm install shiorijk\n\nor\n\n    bower install shiorijk\n\n## ShioriJK とは何か?\n\n伺かの SHIORI サブシステム構築のための SHIORI プロトコルパーサとコンテナの JavaScript(TypeScript)による実装です。\n\nJavaScript で栞を組みたくなった場合にお使いください。\n\n## ShioriJK とは何でないか?\n\nShioriJK は SHIORI プロトコルパーサとコンテナのみを実装しているライブラリであり、これ単体で栞とすることは出来ません。\n\n## 利用方法概要\n\nSHIORI リクエスト/レスポンスあるいはその断片を渡すとてきとうに解釈してコンテナに入れて返します。\nまたコンテナからリクエスト/レスポンス文字列を生成することも出来ます。\n\n現在のところ SHIORI/3.x のみを扱えます。（SHIORI/2.x にも対応していますが、同一ヘッダが複数存在する一部リクエストを正しくパースできません。）\n\n[example/example.ts](example/example.ts)\n\n```typescript\nimport * as ShioriJK from \"shiorijk\";\n// const ShioriJK = require(\"shiorijk\"); // also OK\n\n// ---------- リクエストのパース ----------\n\n// 1つのトランザクションをパース\nconst requestParser = new ShioriJK.Shiori.Request.Parser();\nconst requestStr =\n  \"GET SHIORI/3.0\\r\\n\" +\n  \"Charset: UTF-8\\r\\n\" +\n  \"Sender: embryo\\r\\n\" +\n  \"ID: OnBIFFComplete\\r\\n\" +\n  \"Reference0: 2\\r\\n\" +\n  \"Reference1: 1024\\r\\n\" +\n  \"Reference2: mail.example.com\\r\\n\" +\n  \"Reference3: 1\\r\\n\" +\n  \"Reference4: Subject: foo\\x01X-Mailer: sendmail\\x02Subject: bar\\x01X-Mailer: Sylpheed\\r\\n\" +\n  \"Reference5: 512\\x01512\\r\\n\" +\n  \"Reference6: 123@example.com\\x01456@example.com\\r\\n\" +\n  \"\\r\\n\";\nconst request = requestParser.parse(requestStr);\nconsole.log(request.request_line.method === \"GET\"); // リクエスト行の情報\nconsole.log(request.headers.get(\"ID\") === \"OnBIFFComplete\"); // ヘッダ値を取得\nconsole.log(request.headers.ID === \"OnBIFFComplete\"); // よく使うヘッダへのショートカット\nconsole.log(request.headers.Reference(1) === \"1024\"); // Reference*へのショートカット\nconsole.log(request.headers.references().length === 7); // 全てのReference*の値を取得\nconsole.log((request.headers.get_separated(\"Reference6\") || [])[0] === \"123@example.com\"); // \\x01で区切られた値の取得\nconsole.log((request.headers.get_separated2(\"Reference4\") || [])[1][0] === \"Subject: bar\"); // \\x01と\\x02で区切られた値の取得\n\n// チャンクを元にパース(HTTPのように)\nlet parseResult;\nparseResult = requestParser.parse_chunk(\"GET SHIORI/3.0\\r\\nCharset: UTF-8\\r\\n\");\nconsole.log(parseResult.state === \"continue\");\nparseResult = requestParser.parse_chunk(\"ID: version\\r\\n\\r\\n\");\nconsole.log(parseResult.state === \"end\");\nconsole.log(parseResult.results.length === 1);\nconsole.log(parseResult.results[0].headers.ID === \"version\");\n\n// 行ごとにパース\nparseResult = requestParser.parse_lines([\"GET SHIORI/3.0\", \"Charset: UTF-8\"]);\nconsole.log(parseResult.state === \"continue\");\nparseResult = requestParser.parse_lines([\"ID: version\", \"\"]);\nconsole.log(parseResult.state === \"end\");\nconsole.log(parseResult.results[0].headers.ID === \"version\");\n\n// ---------- レスポンスのパース ----------\n\nconst responseParser = new ShioriJK.Shiori.Response.Parser();\nconst responseStr = \"SHIORI/3.0 200 OK\\r\\n\" + \"Sender: ikaga\\r\\n\" + \"Charset: UTF-8\\r\\n\" + \"Value: 8.2.8\\r\\n\" + \"\\r\\n\";\nconst response = responseParser.parse(responseStr);\nconsole.log(response.headers.Value === \"8.2.8\");\n\n// チャンクや行を元にしたパースも対応\n\n// ---------- リクエストのビルド ----------\n\nconst request2 = new ShioriJK.Message.Request({\n  request_line: { method: \"GET\", version: \"3.0\" },\n  headers: {\n    Charset: \"UTF-8\",\n    Sender: \"embryo\",\n  },\n});\n\n// 初期化後にも値をセット\nrequest2.headers.set(\"ID\", \"version\");\n\nconsole.log(request2.toString() === \"GET SHIORI/3.0\\r\\nCharset: UTF-8\\r\\nSender: embryo\\r\\nID: version\\r\\n\\r\\n\");\n\n// ---------- レスポンスのビルド ----------\n\nconst response2 = new ShioriJK.Message.Response({\n  status_line: { code: 200, version: \"3.0\" },\n  headers: {\n    Charset: \"UTF-8\",\n    Sender: \"ikaga\",\n    Value: \"8.2.8\",\n  },\n});\n\nconsole.log(response2.toString() === \"SHIORI/3.0 200 OK\\r\\nCharset: UTF-8\\r\\nSender: ikaga\\r\\nValue: 8.2.8\\r\\n\\r\\n\");\n```\n\nさらに見る: このライブラリを使用した栞の実装である[SanaJK](https://github.com/Narazaka/sanajk)や、ベースウェアの実装である[イカガカ](https://github.com/Ikagaka/Ikagaka.demo)をご参照ください。\n\n## API ドキュメント\n\n[http://narazaka.github.io/shiorijk/](http://narazaka.github.io/shiorijk/)か、[lib/](lib)にあるコメント付きのソースをご覧ください。\n\nドキュメントがルーズだと感じたら、ライブラリや[テストコード](test)の中身を読んでいただいたほうがわかりやすいかもしれません。\n\n## 履歴\n\n### v1.0.0\n\n- CoffeeScript -\u003e TypeScript\n- 基本的な JavaScript API に変化はありません。\n- null 結合型は次のように変更されました : `Foo | null | undefined` -\u003e `Foo | undefined`\n- いくつかの API に存在した文字列 throw は Error を継承したクラスを throw するように変更されました。\n- ES5 以上を要求します（つまり IE8 以下で動作させるには shim が必要です）。\n\n## ライセンス\n\n[Zlib ライセンス](LICENSE)の元で配布いたします。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNarazaka%2Fshiorijk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FNarazaka%2Fshiorijk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNarazaka%2Fshiorijk/lists"}