{"id":16556301,"url":"https://github.com/miraclx/stringd","last_synced_at":"2025-07-05T01:41:40.051Z","repository":{"id":43002635,"uuid":"171406824","full_name":"miraclx/stringd","owner":"miraclx","description":"NodeJS String Variable Parser","archived":false,"fork":false,"pushed_at":"2022-07-06T06:24:41.000Z","size":91,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-24T10:13:16.417Z","etag":null,"topics":["format","formatter","formatting","javascript","node","nodejs","output","parse","parser","print","printf","sprintf","string","stringvariable","variable"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/miraclx.png","metadata":{"files":{"readme":"README.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":"2019-02-19T04:46:45.000Z","updated_at":"2023-03-07T16:45:41.000Z","dependencies_parsed_at":"2022-09-16T11:50:22.866Z","dependency_job_id":null,"html_url":"https://github.com/miraclx/stringd","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/miraclx/stringd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miraclx%2Fstringd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miraclx%2Fstringd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miraclx%2Fstringd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miraclx%2Fstringd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/miraclx","download_url":"https://codeload.github.com/miraclx/stringd/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/miraclx%2Fstringd/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262147124,"owners_count":23266257,"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":["format","formatter","formatting","javascript","node","nodejs","output","parse","parser","print","printf","sprintf","string","stringvariable","variable"],"created_at":"2024-10-11T20:04:07.550Z","updated_at":"2025-07-05T01:41:40.011Z","avatar_url":"https://github.com/miraclx.png","language":"JavaScript","readme":"# STRING-D\n\n\u003e NodeJS String Variable Parser\n\n[![NPM Version][npm-image]][npm-url]\n[![NPM Downloads][downloads-image]][downloads-url]\n\nCreate parsable strings using template formats by argument mapping.\n\nSimilar to [printf][printf] but supports nesting and exclusive recursions\n\n[![NPM][npm-image-url]][npm-url]\n\n## Installing\n\nVia [NPM][npm]:\n\n``` bash\nnpm install stringd\n```\n\n## Usage\n\n``` javascript\nimport stringd from 'stringd';\n\nstringd('Hello :{name}', {name: 'World'});\n// Hello World\n\nstringd(':{last}, :{first} :{last}', {last: 'Doe', first: 'John'});\n// Doe, John Doe\n```\n\n## API\n\n### stringd(template, object[, ignore])\n\n* `tmp`: \u0026lt;[string][]\u0026gt;\n* `props`: \u0026lt;[object][]\u0026gt;\n* `ignore`: \u0026lt;[string][][]\u0026gt;\n* Returns: \u0026lt;[string][]\u0026gt;\n\nParse the `tmp` string, replacing variable sections with flexibly defined values within the `props` object\nString tags within the `ignore` array are skipped in the process. (used specifically to avoid repetition/recursion)\n\n## Features\n\n### Multi parse methods\n\nWhichever is more comfortable for you would work just fine\n\n``` javascript\nstringd('Hello :{name}', {name: 'World'});  // Hello World\nstringd('Hello %{name}', {name: 'World'});  // Hello World\nstringd('Hello ${name}', {name: 'World'});  // Hello World\nstringd('Hello :{name%}', {name: 'World'}); // Hello World\nstringd('Hello %{name%}', {name: 'World'}); // Hello World\nstringd('Hello ${name%}', {name: 'World'}); // Hello World\n```\n\n### Nesting\n\n``` javascript\nassert.equal('John Davis', stringd(':{name}', {\n  name: ':{first} :{last}',\n  last: 'Davis',\n  first: 'John',\n}));\n```\n\n### Extended, Variable Passing\n\n``` javascript\nassert.equal(\n  'Age Difference = [32 + 25]  = [57]',\n  stringd(\n    stringd('Age Difference = [:{age1} + :{age2}]  = [:{add(:{age1}, :{age2})}]', {\n      age1: 32,\n      age2: 25,\n    }),\n    {add: (_, data) =\u003e data.args.reduce((a, v) =\u003e a + +v.trim(), 0)},\n  ),\n);\n```\n\n``` javascript\nassert.equal(\n  'Hello, Guys; Hello, World. How are you doing?',\n  stringd(':{greet(Guys, post=How are you doing?, World)}', {\n    greet: (_, names) =\u003e\n      names.args\n        .map(name =\u003e `Hello, ${name.trim()}`)\n        .join('; ')\n        .concat('. ', names.matched.post),\n  }),\n);\n```\n\n### Functional Evaluation\n\n``` javascript\nassert.equal(\n  'Hello John Davis, you have contributed $585 in the span of 13 months',\n  stringd(':{name:parsed}', {\n    name: ':{first} :{last}',\n    last: 'Davis',\n    first: 'John',\n    greeting: 'Hello :{name}',\n    months: 13,\n    duration: ':{months} months',\n    contribution: 45,\n    // Functions get the entire template object as an argument\n    // so you can do advanced processing\n    cash: ({contribution, months}) =\u003e contribution * months,\n    'name:parsed': `:{greeting}, you have contributed $:{cash} in the span of :{duration}`,\n  })\n);\n```\n\n### Forward Padding, Space\n\n``` javascript\nassert.equal('   10', stringd(':5{val}', {val: 10}));\n```\n\n### End Padding, Space\n\n``` javascript\nassert.equal('10   ', stringd(':-5{val}', {val: 10}));\n```\n\n### Forward Padding, Zero\n\n``` javascript\nassert.equal('00010', stringd(':05{val}', {val: 10}));\n```\n\n### End Padding, Zero\n\n``` javascript\nassert.equal('10000', stringd(':-05{val}', {val: 10}));\n```\n\n### Complex Nesting with exclusive recursion\n\nRecursive nesting is unparsed at the second level, otherwise, it continues until its done parsing the entire string\n\n``` javascript\nassert.equal(\n  'James:{name} :{name} :{data} :{data} :{all} :{name} :{data}Jack James:{data}Jack James:{data}Jack :{misc} :{data} :{all} James:{data}Jack :{misc}',\n  stringd(':{name} :{misc}', {\n    name: ':{first}:{data}:{last}',\n    first: 'James',\n    last: 'Jack',\n    misc: ':{data}',\n    data: ':{name} :{all}',\n    all: ':{name} :{misc} :{data} :{all} :{name} :{misc}',\n  })\n);\n```\n\n### Iterative processing\n\n``` javascript\nassert.equal('      2364', stringd(stringd('::{pad}{price}', {pad: 10}), {price: 2364}))\n```\n\n### Precedence\n\n`stringd` replaces keys in order precedence. Keys that appear first are replaced first\n\n``` javascript\nstringd( // str key appears first\n  stringd(':{tro:{str}}', {str: 'y', 'tro:{str}': ':{tron}'}),\n  { tron: 'Movie', troy: 'Dude' }\n); // Dude\n\nstringd( // str key appears later\n  stringd(':{tro:{str}}', {'tro:{str}': ':{tron}', str: 'y'}),\n  { tron: 'Movie', troy: 'Dude' }\n); // Movie\n```\n\n## Development\n\nFeel free to clone, use in adherance to the [license](#license). Pull requests are very much welcome.\n\n``` bash\ngit clone https://github.com/miraclx/stringd.git\ncd stringd\nnpm install\n# hack on code\nnpm test\n```\n\n### Testing\n\nTests are executed with [Jest][jest]. To use it, simple run `npm install`, it will install\nJest and its dependencies in your project's `node_modules` directory and finally `npm test`.\n\nTo run the tests:\n\n```bash\nnpm install\nnpm test\n```\n\n## License\n\n[Apache 2.0][license] © **Miraculous Owonubi** ([@miraclx][author-url]) \u0026lt;omiraculous@gmail.com\u0026gt;\n\n[npm]:  https://github.com/npm/cli \"The Node Package Manager\"\n[jest]:  https://github.com/facebook/jest \"Delightful JavaScript Testing\"\n[printf]:  https://github.com/adaltas/node-printf\n[license]:  LICENSE \"Apache 2.0 License\"\n[author-url]: https://github.com/miraclx\n\n[npm-url]: https://npmjs.org/package/stringd\n[npm-image]: https://badgen.net/npm/node/stringd\n[npm-image-url]: https://nodei.co/npm/stringd.png?stars\u0026downloads\n[downloads-url]: https://npmjs.org/package/stringd\n[downloads-image]: https://badgen.net/npm/dm/stringd\n\n[string]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[object]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmiraclx%2Fstringd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmiraclx%2Fstringd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmiraclx%2Fstringd/lists"}