{"id":18645460,"url":"https://github.com/cscott/node-icu-bidi","last_synced_at":"2025-04-11T12:31:23.277Z","repository":{"id":12442309,"uuid":"15100463","full_name":"cscott/node-icu-bidi","owner":"cscott","description":"Node bindings to the ICU (53) Unicode BiDi algorithm","archived":false,"fork":false,"pushed_at":"2018-04-30T01:34:05.000Z","size":67364,"stargazers_count":17,"open_issues_count":3,"forks_count":5,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-09T14:50:37.141Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cscott.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"license.html","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-12-11T07:04:14.000Z","updated_at":"2024-11-18T12:19:40.000Z","dependencies_parsed_at":"2022-09-17T23:00:37.328Z","dependency_job_id":null,"html_url":"https://github.com/cscott/node-icu-bidi","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cscott%2Fnode-icu-bidi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cscott%2Fnode-icu-bidi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cscott%2Fnode-icu-bidi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cscott%2Fnode-icu-bidi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cscott","download_url":"https://codeload.github.com/cscott/node-icu-bidi/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248401955,"owners_count":21097328,"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":[],"created_at":"2024-11-07T06:16:02.809Z","updated_at":"2025-04-11T12:31:21.176Z","avatar_url":"https://github.com/cscott.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# icu-bidi\n[![NPM][NPM1]][NPM2]\n\n[![Build Status][1]][2] [![dependency status][3]][4] [![dev dependency status][5]][6]\n\nThe node `icu-bidi` package binds to the [ICU][] (55.1) library in order to\nprovide an implementation of the Unicode [BiDi][] algorithm.\n\n# USAGE\n\nThe JavaScript API follows the\n[API of `icu4c`](http://icu-project.org/apiref/icu4c/ubidi_8h.html)\nfairly closely.\n\n```js\nvar ubidi = require('icu-bidi');\n\nvar e = 'English';\nvar h = '‭עִבְרִית‬';\nvar input = e + ' ' + h;\n\nconsole.log( input );\nvar p = ubidi.Paragraph(input, {\n  // this hash is optional; these are the default values:\n  paraLevel:          ubidi.DEFAULT_LTR,\n  reorderingMode:     ubidi.ReorderingMode.DEFAULT,\n  reorderingOptions:  0, // uses ubidi.ReorderingOptions.*\n  orderParagraphsLTR: false,\n  inverse:            false,\n  prologue:           '',\n  epilogue:           '',\n  embeddingLevels:    null /* Unimplemented */\n});\nconsole.log( 'number of paragraphs', p.countParagraphs() );\nconsole.log( 'paragraph level',      p.getParaLevel()    );\n// direction is 'ltr', 'rtl', or 'mixed'\nconsole.log( 'direction',            p.getDirection()    );\n\nvar i, levels = [];\nfor (i=0; i \u003c p.getProcessedLength(); i++) {\n  levels.push( p.getLevelAt(i) );\n}\nconsole.log( levels.join(' ') );\n\nfor (i=0; i \u003c p.countRuns(); i++) {\n  var run = p.getVisualRun(i);\n  console.log( 'run', run.dir, 'from', run.logicalStart, 'len', run.length );\n}\n\nconsole.log( p.writeReordered(ubidi.Reordered.KEEP_BASE_COMBINING) );\n```\n\nThis example prints the following when run:\n```\nEnglish ‭עִבְרִית‬\nnumber of paragraphs 1\nparagraph level 0\ndirection mixed\n0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1\nrun ltr from 0 len 8\nrun rtl from 8 len 8\nEnglish ‭תירִבְעִ‬\n```\n\n# API\n\n## new ubidi.Paragraph(text, [options])\n\nReturns a new `Paragraph` object with the results of the bidi algorithm.\n*   `text`: UTF-16 encoded text as a standard JavaScript string; you know\n    the drill.\n*   `options` *(optional)*: a hash containing various settings which can\n    affect the bidi algorithm.  All are optional.\n    - [`paraLevel`][ubidi_setPara]:\n        Specifies the default [level][UBiDiLevel] for the text; it is\n        typically 0 (LTR) or 1 (RTL). If the function shall determine\n        the paragraph level from the text, then paraLevel can be set\n        to either `ubidi.DEFAULT_LTR` or `ubidi.DEFAULT_RTL`.\n    - [`reorderingMode`][ubidi_setReorderingMode]:\n        Modify the operation of the Bidi algorithm such that it implements\n        some variant to the basic Bidi algorithm or approximates an\n        \"inverse Bidi\" algorithm, depending on different values of the\n        \"reordering mode\".\n        - `ubidi.ReorderingMode.DEFAULT`:\n            The standard Bidi Logical to Visual algorithm is applied.\n        - `ubidi.ReorderingMode.REORDER_NUMBERS_SPECIAL`:\n            Approximate the algorithm used in Microsoft Windows XP rather\n            than strictly conform to the Unicode Bidi algorithm.\n        - `ubidi.ReorderingMode.GROUP_NUMBERS_WITH_R`:\n            Numbers located between LTR text and RTL text are\n            associated with the RTL text.  This makes the algorithm\n            reversible and makes it useful when round trip must be\n            achieved without adding LRM characters. However, this is a\n            variation from the standard Unicode Bidi algorithm.\n        - `ubidi.ReorderingMode.RUNS_ONLY`:\n            Logical-to-Logical transformation. If the default text\n            level of the source text (`paraLevel`) is even, the source\n            text will be handled as LTR logical text and will be\n            transformed to the RTL logical text which has the same LTR\n            visual display.  If the default level of the source text\n            is odd, the source text will be handled as RTL logical\n            text and will be transformed to the LTR logical text which\n            has the same LTR visual display.\n        - `ubidi.ReorderingMode.INVERSE_NUMBERS_AS_L`:\n            An \"inverse Bidi\" algorithm is applied. This mode is\n            equivalent to setting the `inverse` option to `true`.\n        - `ubidi.ReorderingMode.INVERSE_LIKE_DIRECT`:\n            The \"direct\" Logical to Visual Bidi algorithm is used as\n            an approximation of an \"inverse Bidi\" algorithm.\n        - `ubidi.ReorderingMode.INVERSE_FOR_NUMBERS_SPECIAL`:\n            The Logical to Visual Bidi algorithm used in Windows XP is\n            used as an approximation of an \"inverse Bidi\" algorithm.\n    - [`reorderingOptions`][ubidi_setReorderingOptions]:\n        Specify which of the reordering options should be applied\n        during Bidi transformations.  The value is a combination using\n        bitwise OR of zero or more of the following:\n        - [`ubidi.ReorderingOptions.DEFAULT`][UBiDiReorderingOption]\n            Disable all the options which can be set with this function.\n        - [`ubidi.ReorderingOptions.INSERT_MARKS`][UBiDiReorderingOption]\n            Insert Bidi marks (LRM or RLM) when needed to ensure correct\n            result of a reordering to a Logical order.\n        - [`ubidi.ReorderingOptions.REMOVE_CONTROLS`][UBiDiReorderingOption]\n            Remove Bidi control characters.\n        - [`ubidi.ReorderingOptions.STREAMING`][UBiDiReorderingOption]\n            Process the output as part of a stream to be continued.\n    - [`orderParagraphsLTR`][ubidi_orderParagraphsLTR]: *(boolean)*\n        Specify whether block separators must be allocated level zero, so\n        that successive paragraphs will progress from left to right.\n    - [`inverse`][ubidi_setInverse]: *(boolean)*\n        Modify the operation of the Bidi algorithm such that it approximates\n        an \"inverse Bidi\" algorithm.\n    - [`prologue`][ubidi_setContext]: *(string)*\n        A preceding context for the given text.\n    - [`epilogue`][ubidi_setContext]: *(string)*\n        A trailing context for the given text.\n    - [`embeddingLevels`][ubidi_setPara]: *(array)*\n        CURRENTLY UNIMPLEMENTED.\n\n## Paragraph#setLine(start, limit)\n\nReturns a subsidiary `Paragraph` object containing the reordering\ninformation, especially the resolved levels, for all the characters in\na line of text.\n\nThis line of text is specified by referring to a `Paragraph` object\nrepresenting this information for a piece of text containing one or\nmore paragraphs, and by specifying a range of indexes in this text.\n\nIn the returned line object, the indexes will range from `0` to `limit-start-1`.\n\nThis is used after creating a `Paragraph` for a piece of text, and\nafter line-breaking on that text. It is not necessary if each\nparagraph is treated as a single line.\n\nAfter line-breaking, rules (L1) and (L2) for the treatment of trailing\nWS and for reordering are performed on the returned `Paragraph` object\nrepresenting a line.\n\n*   `start`:\n    The line's first index into the text\n*   `limit`:\n    The index just behind the line's last index into the text (its last\n    index +1).  It must be `0\u003c=start\u003climit\u003c=containing paragraph limit`.\n    If the specified line crosses a paragraph boundary, the function will\n    throw an Exception.\n\nSee [the icu docs][ubidi_setLine] for more information.\n\n## Paragraph#getDirection()\n\nGet the directionality of the text.\n\nReturns `'ltr'` or `'rtl'` if the text is unidirectional; otherwise returns\n`'mixed'`.\n\nSee [the icu docs][ubidi_getDirection] for more information.\n\n## Paragraph#getLength()\n\nReturns the length of the text that the `Paragraph` object was created for.\n\nSee [the icu docs][ubidi_getLength] for more information.\n\n## Paragraph#getProcessedLength()\n\nGet the length of the source text processed by the `Paragraph` constructor.\n\nThis length may be different from the length of the source text if option\n`ubidi.ReorderingOptions.STREAMING` has been set.\n\nSee [the icu docs][ubidi_getProcessedLength] for more information.\n\n## Paragraph#getResultLength()\n\nGet the length of the reordered text resulting from `Paragraph` constructor.\n\nThis length may be different from the length of the source text if\noption `ubidi.ReorderingOptions.INSERT_MARKS` or option\n`ubidi.ReorderingOptions.REMOVE_CONTROLS` has been set.\n\nSee [the icu docs][ubidi_getResultLength] for more information.\n\n## Paragraph#getParaLevel()\n\nReturns the paragraph [level][UBiDiLevel]. If there are multiple\nparagraphs, their level may vary if the required `paraLevel` is\n`ubidi.DEFAULT_LTR` or `ubidi.DEFAULT_RTL`. In that case, the level of\nthe first paragraph is returned.\n\nSee [the icu docs][ubidi_getParaLevel] for more information.\n\n## Paragraph#countParagraphs()\n\nReturns the number of paragraphs.\n\nSee [the icu docs][ubidi_countParagraphs] for more information.\n\n## Paragraph#getParagraph(charIndex)\n\nGet information about a paragraph, given a position within the text which\nis contained by that paragraph.\n\nReturns an object with the following properties:\n*   `index`:\n    The index of the paragraph containing the specified position.\n*   `start`:\n    The index of the first character of the paragraph in the text.\n*   `limit`:\n    The limit of the paragraph.\n*   `level`:\n    The [level][UBiDiLevel] of the paragraph.\n*   `dir`:\n    The directionality of the run, either `'ltr'` or `'rtl'`.  This is\n    derived from bit 0 of the level; see [UBiDiLevel][].\n\nSee [the icu docs][ubidi_getParagraph] for more information.\n\n## Paragraph#getParagraphByIndex(paraIndex)\n\nGet information about a paragraph, given the index of the paragraph.\n\nReturns an object with the same properties as `getParagraph`, above.\n\nSee [the icu docs][ubidi_getParagraphByIndex] for more information.\n\n## Paragraph#getLevelAt(charIndex)\n\nReturn the [level][UBiDiLevel] for the character at `charIndex`, or `0` if\n`charIndex` is not in the valid range.\n\nSee [the icu docs][ubidi_getLevelAt] for more information.\n\n## Paragraph#countRuns()\n\nReturns the number of runs in this text.\n\nSee [the icu docs][ubidi_countRuns] for more information.\n\n## Paragraph#getVisualRun(runIndex)\n\nGet one run's logical start, length, and directionality (`'ltr'` or `'rtl'`).\n\nIn an RTL run, the character at the logical start is visually on the\nright of the displayed run. The length is the number of characters in\nthe run. The `runIndex` parameter is the number of the run in visual\norder, in the range `[0..Paragraph#countRuns()-1]`.\n\nReturns an object with the following properties:\n*   `dir`:\n    The directionality of the run, either `'ltr'` or `'rtl'`.\n*   `logicalStart`:\n    The first logical character index in the text.\n*   `length`:\n    The number of characters (at least one) in the run.\n\nSee [the icu docs][ubidi_getVisualRun] for more information.\n\n## Paragraph#getLogicalRun(logicalPosition)\n\nThis function returns information about a run and is used to retrieve\nruns in logical order.  This is especially useful for line-breaking on\na paragraph.\n\nReturns an object with the following properties:\n*   `logicalLimit`:\n    The limit of the corresponding run.\n*   `level`:\n    The [level][UBiDiLevel] of the corresponding run.\n*   `dir`:\n    The directionality of the run, either `'ltr'` or `'rtl'`.  This is\n    derived from bit 0 of the level; see [UBiDiLevel][].\n\nSee [the icu docs][ubidi_getLogicalRun] for more information.\n\n## Paragraph#getVisualIndex(logicalIndex)\n\nGet the visual position from a logical text position.\n\nThe value returned may be `ubidi.MAP_NOWHERE` if there is no visual\nposition because the corresponding text character is a Bidi control\nremoved from output by the option\n`ubidi.ReorderingOptions.REMOVE_CONTROLS`.\n\nSee [the icu docs][ubidi_getVisualIndex] for more information.\n\n## Paragraph#getLogicalIndex(visualIndex)\n\nGet the logical text position from a visual position.\n\nThe value returned may be `ubidi.MAP_NOWHERE` if there is no logical\nposition because the corresponding text character is a Bidi mark\ninserted in the output by option\n`ubidi.ReorderingOptions.INSERT_MARKS`.\n\nSee [the icu docs][ubidi_getLogicalIndex] for more information.\n\n## Paragraph#writeReordered([options])\n\nTake a `Paragraph` object containing the reordering information for a\npiece of text (one or more paragraphs) set by `new Paragraph` or for a\nline of text set by `Paragraph#setLine()` and returns a reordered string.\n\nThis function preserves the integrity of characters with multiple code\nunits and (optionally) combining characters. Characters in RTL runs\ncan be replaced by mirror-image characters in the returned\nstring. There are also options to insert or remove Bidi control\ncharacters.\n\nThe `options` argument is optional.  If it is present, it is a bit set\nof options for the reordering that control how the reordered text is\nwritten. The available options are:\n- [`ubidi.Reordered.KEEP_BASE_COMBINING`][UBIDI_KEEP_BASE_COMBINING]\n    Keep combining characters after their base characters in RTL runs.\n- [`ubidi.Reordered.DO_MIRRORING`][UBIDI_DO_MIRRORING]\n    Replace characters with the \"mirrored\" property in RTL runs by their\n    mirror-image mappings.\n- [`ubidi.Reordered.INSERT_LRM_FOR_NUMERIC`][UBIDI_INSERT_LRM_FOR_NUMERIC]\n    Surround the run with LRMs if necessary; this is part of the approximate\n    \"inverse Bidi\" algorithm.\n- [`ubidi.Reordered.REMOVE_BIDI_CONTROLS`][UBIDI_REMOVE_BIDI_CONTROLS]\n    Remove Bidi control characters (this does not affect\n    `ubidi.Reordered.INSERT_LRM_FOR_NUMERIC`).\n- [`ubidi.Reordered.OUTPUT_REVERSE`][UBIDI_OUTPUT_REVERSE]\n    Write the output in reverse order.\n\nSee [the icu docs][ubidi_writeReordered] for more information.\n\n[ubidi_setPara]:              http://icu-project.org/apiref/icu4c/ubidi_8h.html#abdfe9e113a19dd8521d3b7ac8220fe11\n[ubidi_setReorderingMode]:    http://icu-project.org/apiref/icu4c/ubidi_8h.html#afe123acc1196c4d7363f968ca6af6faa\n[ubidi_setReorderingOptions]: http://icu-project.org/apiref/icu4c/ubidi_8h.html#a25dd2aba9db100133217b9fe76de01de\n[ubidi_orderParagraphsLTR]:   http://icu-project.org/apiref/icu4c/ubidi_8h.html#ab7b9785b85169b3830034029729c672e\n[ubidi_setInverse]:           http://icu-project.org/apiref/icu4c/ubidi_8h.html#a836b2eaf83ca712cf28e69cd4ba934f4\n[ubidi_setContext]:           http://icu-project.org/apiref/icu4c/ubidi_8h.html#a1e38e9d7036f4aa7cc5aea5a435b3e63\n[UBiDiReorderingOption]:      http://icu-project.org/apiref/icu4c/ubidi_8h.html#a4505e4adc8da792501414b770f49f386\n[ubidi_setLine]:              http://icu-project.org/apiref/icu4c/ubidi_8h.html#ac7d96b281cd6ab2d56900bfdc37c808a\n[ubidi_getDirection]:         http://icu-project.org/apiref/icu4c/ubidi_8h.html#af31ec52194764c663c224f5171e95ea3\n[ubidi_getLength]:            http://icu-project.org/apiref/icu4c/ubidi_8h.html#a8f51ac46083e7ce52b6bea4bc7ac14a8\n[ubidi_getProcessedLength]:   http://icu-project.org/apiref/icu4c/ubidi_8h.html#abf3d2acd9d73fb4a3a25deb0ebca28d5\n[ubidi_getResultLength]:      http://icu-project.org/apiref/icu4c/ubidi_8h.html#a3247782277731ee82cfb3ba700f598a8\n[ubidi_getParaLevel]:         http://icu-project.org/apiref/icu4c/ubidi_8h.html#a6724e673e9ff8f0ee47bd24e47ceb95a\n[ubidi_countParagraphs]:      http://icu-project.org/apiref/icu4c/ubidi_8h.html#a8f4b5bb9a8e37d8065490af4e6825563\n[ubidi_getParagraph]:         http://icu-project.org/apiref/icu4c/ubidi_8h.html#a5cd3d78464b8e3b71886a643f70f25ab\n[ubidi_getParagraphByIndex]:  http://icu-project.org/apiref/icu4c/ubidi_8h.html#a62377f811a750130246dfb49c1cc6dc0\n[ubidi_getLevelAt]:           http://icu-project.org/apiref/icu4c/ubidi_8h.html#ad363767eacb66359de7c639a722338c8\n[ubidi_countRuns]:            http://icu-project.org/apiref/icu4c/ubidi_8h.html#a18c2f5cfaf8c8717759d6e0feaa58c99\n[ubidi_getVisualRun]:         http://icu-project.org/apiref/icu4c/ubidi_8h.html#ae923ec697e2eb77652fca9f1fcddc894\n[ubidi_getLogicalRun]:        http://icu-project.org/apiref/icu4c/ubidi_8h.html#aaa99079b617dcc6c15910558306b7145\n[ubidi_getVisualIndex]:       http://icu-project.org/apiref/icu4c/ubidi_8h.html#a17696c56f06e1a48270f0ff3b69edd79\n[ubidi_getLogicalIndex]:      http://icu-project.org/apiref/icu4c/ubidi_8h.html#a95ad84e638be70e73b23809fc132582f\n[ubidi_writeReordered]:       http://icu-project.org/apiref/icu4c/ubidi_8h.html#a26790ff71c59f223ded4047da5626725\n[UBIDI_KEEP_BASE_COMBINING]:  http://icu-project.org/apiref/icu4c/ubidi_8h.html#a2e022ccd0d2c55a21c2aa233c30ecd88\n[UBIDI_DO_MIRRORING]:         http://icu-project.org/apiref/icu4c/ubidi_8h.html#a0b1370dda1e3ad8ef9c94fd28320153d\n[UBIDI_INSERT_LRM_FOR_NUMERIC]: http://icu-project.org/apiref/icu4c/ubidi_8h.html#adad66f9132bc4e4621427091acfc0f40\n[UBIDI_REMOVE_BIDI_CONTROLS]: http://icu-project.org/apiref/icu4c/ubidi_8h.html#a039000c1e298cbad5909d07a55ca5312\n[UBIDI_OUTPUT_REVERSE]:       http://icu-project.org/apiref/icu4c/ubidi_8h.html#a4a10c3aac68ceca1569bac717156cef3\n[UBiDiLevel]:                 http://icu-project.org/apiref/icu4c/ubidi_8h.html#ab2460a19f323ab9787a79a95db91a606\n\n# INSTALLING\n\nYou can use [`npm`](https://github.com/isaacs/npm) to download and install:\n\n* The latest `icu-bidi` package: `npm install icu-bidi`\n\n* GitHub's `master` branch: `npm install https://github.com/cscott/node-icu-bidi/tarball/master`\n\nIn both cases the module is automatically built with npm's internal version of `node-gyp`,\nand thus your system must meet [node-gyp's requirements](https://github.com/TooTallNate/node-gyp#installation).\n\nIt is also possible to make your own build of `icu-bidi` from its source instead of its npm package ([see below](#building-from-the-source)).\n\n# BUILDING FROM THE SOURCE\n\nUnless building via `npm install` (which uses its own `node-gyp`) you will need `node-gyp` installed globally:\n\n    npm install node-gyp -g\n\nThe `icu-bidi` module depends only on `libicu`. However, by default, an internal/bundled copy of `libicu` will be built and statically linked, so an externally installed `libicu` is not required.\n\nIf you wish to install against an external `libicu` then you need to\npass the `--libicu` argument to `node-gyp`, `npm install` or the\n`configure` wrapper.\n\n    ./configure --libicu=external\n    make\n\nOr, using the node-gyp directly:\n\n     node-gyp --libicu=external rebuild\n\nOr, using npm:\n\n     npm install --libicu=external\n\nIf building against an external `libicu` make sure to have the\ndevelopment headers available. Mac OS X ships with these by\ndefault. If you don't have them installed, install the `-dev` package\nwith your package manager, e.g. `apt-get install libicu-dev` for\nDebian/Ubuntu. Make sure that you have at least `libicu` \u003e= 52.1\n\n# TESTING\n\n[mocha](https://github.com/visionmedia/mocha) is required to run unit tests.\n\n    npm install mocha\n    npm test\n\n\n# CONTRIBUTORS\n\n* [C. Scott Ananian](https://github.com/cscott)\n\n# RELATED PROJECTS\n\n* [ICU][]\n* [GNU FriBiDi](http://fribidi.org/)\n\n# LICENSE\nCopyright (c) 2013-2014 C. Scott Ananian.\n\n`icu-bidi` is licensed using the same [ICU license] as the libicu library\nitself.  It is an MIT/X-style license.\n\n[ICU]:         http://icu-project.org/\n[ICU license]: http://source.icu-project.org/repos/icu/icu/trunk/license.html\n[BiDi]:        http://www.unicode.org/unicode/reports/tr9/\n\n[NPM1]: https://nodei.co/npm/icu-bidi.png\n[NPM2]: https://nodei.co/npm/icu-bidi/\n\n[1]: https://travis-ci.org/cscott/node-icu-bidi.png\n[2]: https://travis-ci.org/cscott/node-icu-bidi\n[3]: https://david-dm.org/cscott/node-icu-bidi.png\n[4]: https://david-dm.org/cscott/node-icu-bidi\n[5]: https://david-dm.org/cscott/node-icu-bidi/dev-status.png\n[6]: https://david-dm.org/cscott/node-icu-bidi#info=devDependencies\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcscott%2Fnode-icu-bidi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcscott%2Fnode-icu-bidi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcscott%2Fnode-icu-bidi/lists"}