{"_id":"@bmybbs/bmybbs-content-parser","name":"@bmybbs/bmybbs-content-parser","dist-tags":{"latest":"0.3.4"},"versions":{"0.3.4":{"name":"@bmybbs/bmybbs-content-parser","version":"0.3.4","description":"This is a library to convert bmybbs content, including articles and mails, to HTML format.","main":"dist/index.js","types":"dist/index.d.js","scripts":{"pretest":"eslint --ignore-path .gitignore .","build":"tsc","test":"jest --coverage"},"repository":{"type":"git","url":"git+https://github.com/bmybbs/bmybbs-content-parser.git"},"author":{"name":"Yang Shen"},"license":"MIT","bugs":{"url":"https://github.com/bmybbs/bmybbs-content-parser/issues"},"homepage":"https://github.com/bmybbs/bmybbs-content-parser#readme","publishConfig":{"access":"public"},"devDependencies":{"@commitlint/cli":"^17.4.2","@commitlint/config-conventional":"^17.4.2","@types/jest":"^26.0.20","@types/node":"^18.13.0","@typescript-eslint/eslint-plugin":"^5.49.0","@typescript-eslint/parser":"^5.49.0","coveralls":"^3.1.0","eslint":"^8.33.0","husky":"^8.0.1","jest":"^26.6.3","semantic-release":"^20.1.0","ts-jest":"^26.4.4","typescript":"^4.9.4"},"dependencies":{},"gitHead":"faf47f0eb2d12be2ac80c921d4a815a7fe410a9e","_id":"@bmybbs/bmybbs-content-parser@0.3.4","_nodeVersion":"18.14.1","_npmVersion":"8.12.2","dist":{"integrity":"sha512-TlC0dVwr1+gtpMdtBbVAQicJB1IvABNGD+8nXPz9LXDKXtM7x0BSf74+crZCcCgsxlRDcv6xgcfZz1DpiWzlcQ==","shasum":"712509cbd6592d176e02516a5c4b7f7ffccaeafb","tarball":"https://registry.npmjs.org/@bmybbs/bmybbs-content-parser/-/bmybbs-content-parser-0.3.4.tgz","fileCount":19,"unpackedSize":38915,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA4vQ4+SYSqloAKL65WLxvUKQghUD7eW1o9HX+mudOg0AiAh0N4mjVAPd2y5c+vsADzryclIJgT/T7KXG15ou7rS6g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj8yrtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoT+w/+I7Lbsy8qiAPbC1ChtJH+Oxzx7H3fpRmmqQTFzW1oSJ3R8Mm1\r\nKqNDU58ytE9SLYCCaRLDMx25O8Ed2kuRB9MZCZdENAkxkMqYU0PB3AP2U38x\r\ny9pj5LHAHHFOoIcZE8bdbncT0obwjU4IW1Pgtyxcj01CQe3wsvnxQEc1DgEJ\r\nMQ6dVofW3qjxkZZHHiziwo0dESnjo/VEVyH+PRidypwys5zv3h3i/wcAE6wu\r\nZ78mZBeZfzAZEKfe5B4nu6QUUWL51JyCfTEj14aKC2bgGW15f3OLxr4l0xK9\r\nOqjKwsj0LNp9gMjbNs8HFc/zkTOblY5sBopnoZ5nQcQgY58CkvyvoGwHcGat\r\nqg/Z6ozig58x4BSgSDvIF0OHF0LqHOcEZNhfa/qpOeQ2AqjYtviX7raSOaSu\r\nLP276AoCYQWlSl4Uc4JcL/daQX3gag1B6cdxetPFiWrIr3Bi6T7DnS5dzrTe\r\n2GzG8HVb1duDUvgwbUBg7xBZ2+VlIC7hF5S2dsfri1E+yVZLRajPudkuuNT7\r\ntVy8wSZUbWBLkWCPjsgJOhVj/XOTHjIxl1Zrc+gUOjgShfnePMY/tknRJT0e\r\nlGIgiUBDNh0ASROVCvaIckr2WdX9EiMAaygO87zgGrw4Td3uLzOysZxtfl1M\r\nNEBBk/2tuLcKELKVx1F1iJ3ky5hBMruzgHE=\r\n=CFQ4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ironblood","email":"aplshenyang@gmail.com"},"directories":{},"maintainers":[{"name":"ironblood","email":"aplshenyang@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/bmybbs-content-parser_0.3.4_1676880620973_0.00035450995392571905"},"_hasShrinkwrap":false}},"time":{"created":"2023-02-20T08:10:20.767Z","0.3.4":"2023-02-20T08:10:21.140Z","modified":"2023-02-20T08:10:21.562Z"},"maintainers":[{"name":"ironblood","email":"aplshenyang@gmail.com"}],"description":"This is a library to convert bmybbs content, including articles and mails, to HTML format.","homepage":"https://github.com/bmybbs/bmybbs-content-parser#readme","repository":{"type":"git","url":"git+https://github.com/bmybbs/bmybbs-content-parser.git"},"author":{"name":"Yang Shen"},"bugs":{"url":"https://github.com/bmybbs/bmybbs-content-parser/issues"},"license":"MIT","readme":"# BMYBBS Content Parser\n\n![BMYBBS Content Parser CI](https://github.com/bmybbs/bmybbs-content-parser/workflows/BMYBBS%20Content%20Parser%20CI/badge.svg?branch=main) [![Coverage Status](https://coveralls.io/repos/github/bmybbs/bmybbs-content-parser/badge.svg?branch=main)](https://coveralls.io/github/bmybbs/bmybbs-content-parser?branch=main) [![Bugs](https://sonarcloud.io/api/project_badges/measure?project=bmybbs_bmybbs-content-parser&metric=bugs)](https://sonarcloud.io/dashboard?id=bmybbs_bmybbs-content-parser) [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=bmybbs_bmybbs-content-parser&metric=code_smells)](https://sonarcloud.io/dashboard?id=bmybbs_bmybbs-content-parser) [![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=bmybbs_bmybbs-content-parser&metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=bmybbs_bmybbs-content-parser)\n\n这是一个将 [BMYBBS](https://github.com/bmybbs/bmybbs) 文章内容转换为 HTML 的库。\n\n## 背景\n\n传统 [BBS](https://en.wikipedia.org/wiki/Bulletin_board_system) 最早只提供了终端界面，并且通过 [ANSI 转义序列](https://en.wikipedia.org/wiki/ANSI_escape_code) 提供了例如前景色、背景色、下划线、闪烁等指令，丰富了内容显示，推动了 [ANSI 艺术](https://en.wikipedia.org/wiki/ANSI_art) 的流行。这些指令使用不可见字符 `\\033` 以及其他可见字符插入到文本中。\n\n随着 web 的发展，传统 BBS 也陆续提供了网页界面，NJU 09 就是一个在中国大陆高校 BBS 广泛使用的实现。Web 实现除了需要对应转换为 html 格式，还给文章带来了新的元素：附件的上传、展示。NJU09 的实现存在一些不足：\n\n* 样式转换不完全（例如下划线、闪烁）\n* web 方式几乎不适合使用转义序列编辑、预览\n* 附件中只有图片会被转换使用 `<img>` 标签显示。其实还有 Flash 格式，只不过已经越来越少被使用了。相反随着技术发展，`<video>` 和 `<audio>` 多媒体技术早已广泛使用，而 NJU 09 中一直没有实现。\n* 同样对于未来可能需要引入新的“语法”，例如类似 Markdown 的代码块 (**WIP**)、链接。\n\n因此，本项目的目标在于使用 JavaScript 实现一套 BMYBBS 内容“语法”的转换实现。\n\n## 安装\n\n```bash\nnpm install --save @bmybbs/bmybbs-content-parser\n```\n\n## 使用\n\n```javascript\nimport BMYParser from \"@bmybbs/bmybbs-content-parser\"\n\n(() => {\n  let content = {\n    text: [\n      \"#attach bmybbs.png\",\n      \"```javascript\",\n      \"var foo = 42;\",\n      \"```\",\n      \"\\x1b[1;31mhello world\\x1b[0m\"\n    ].join(\"\\n\"),\n    attaches: [{\n      name: \"bmybbs.png\",\n      link: \"http://example.com\",\n      signature: [0xFF, 0xD8, 0xFF, 0xD8]\n    }]\n  }; // 通常由接口返回，也可以在浏览器内生成，以便预览\n\n  console.log(BMYParser(content));\n})();\n```\n\n其中 `signature` 是用来标识文件格式的 Magic Number（而非通过文件后缀名）。完整的列表参见 [List of file signatures](https://en.wikipedia.org/wiki/List_of_file_signatures)，BMYBBS Content Parser 使用 [file-type](https://github.com/sindresorhus/file-type) 解析。\n\n## 输出结果\n\n并不完全一致，此处为了便于阅读增加了换行和缩进。\n\n```html\n<article>\n  <img src=\"http://example.com\" alt=\"bmybbs.png\">\n  <pre>\n    <code class=\"language-javascript\">\n    var foo = 42;\n    </code>\n  </pre>\n  <p>\n    <span class=\"bmybbs-ansi bmybbs-ansi-red\">hello world</span>\n  </p>\n</article>\n```\n\n样式转换的结果是文本使用 `span.bmybbs-ansi.bmybbs-ansi-*` 包裹，仅提供类的约定，实际的显示需要使用者自行决定。其中，`.bmybbs-ansi` 是一个空的类，便于显示、移除样式，例如：\n\n```css\nspan.bmybbs-ansi.bmybbs-ansi-red {\n  color: red;\n}\n```\n\n```javascript\nconst bmybbs_spans = [].slice.call(document.querySelectorAll(\"span.bmybbs-ansi\"));\n\n// 所有元素移除 ANSI 样式\nbmybbs_spans.forEach(el => el.classList.remove(\"bmybbs-ansi\"));\n\n// 所有元素恢复 ANSI 样式\nbmybbs_spans.forEach(el => el.classList.add(\"bmybbs-ansi\"));\n```\n\n## 约定样式列表\n\nTBD\n\n## 色彩高亮支持的语言列表\n\n可以使用 [PrismJS](https://github.com/PrismJS/prism) 渲染，Webpack 需要借助 [babel-plugin-prismjs](https://github.com/mAAdhaTTah/babel-plugin-prismjs) 打包。\n\n* 标注类: `markup`(默认)、`html`、`xml`、`svg`\n* Bash - `bash`、`shell`\n* Batch - `batch`\n* C - `c`\n* C# - `csharp`、`cs`、`dotnet`\n* C++ - `cpp`\n* CMake - `cmake`\n* CSS - `css`\n* Diff - `diff`\n* Docker - `docker`、`dockerfile`\n* Erlang - `erlang`\n* Fortran - `fortran`\n* Go - `go`\n* GraphQL - `graphql`\n* Groovy - `groovy`\n* Haskell - `haskell`、`hs`\n* Ini - `ini`\n* Java - `java`\n* JavaScript - `javascript`、`js`\n* JSON - `json`\n* LaTeX - `latex`、`tex`、`context`\n* Less - `less`\n* LilyPond - `lilypond`、`ly`\n* Lisp - `lisp`、`emacs`\n* Lua - `lua`\n* Makefile - `makefile`\n* Markdown - `markdown`、`md`\n* MATLAB - `matlab`\n* NASM - `nasm`\n* nginx - `nginx`\n* Objective-C - `objc`\n* OpenCL - `opencl`\n* Perl - `perl`\n* PHP - `php`\n* Prolog - `prolog`\n* Python - `python`、`py`\n* R - `r`\n* React - `jsx`、`tsx`\n* Regex - `regex`\n* reST(reStructuredText) - `rest`\n* Ruby - `ruby`、`rb`\n* Rust - `rust`\n* Sass(Sass) - `sass`\n* Sass(Scss) - `scss`\n* Scala - `scala`\n* Scheme - `scheme`\n* SQL - `sql`\n* Tcl - `tcl`\n* TypeScript - `typescript`、`ts`\n* UnrealScript - `unrealscript`、`uscript`、`uc`\n* Verilog - `verilog`\n* VHDL - `vhdl`\n* vim - `vim`\n* WebAssembly - `wasm`\n* Wiki - `wiki`\n* YAML - `yaml`、`yml`\n\n## License\n\nMIT\n","readmeFilename":"README.md"}