{"id":31333264,"url":"https://github.com/csauve/todotxt-parser","last_synced_at":"2025-09-26T01:08:32.892Z","repository":{"id":26270116,"uuid":"29717459","full_name":"csauve/todotxt-parser","owner":"csauve","description":"A parser for Gina Trapani's todo.txt format with optional extended features","archived":false,"fork":false,"pushed_at":"2022-09-05T19:43:25.000Z","size":35,"stargazers_count":16,"open_issues_count":1,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-08-23T19:43:58.046Z","etag":null,"topics":["coffeescript","js","node","parser","todotxt"],"latest_commit_sha":null,"homepage":"","language":"CoffeeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/csauve.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":"2015-01-23T05:03:55.000Z","updated_at":"2023-01-25T13:06:53.000Z","dependencies_parsed_at":"2022-08-30T12:31:14.642Z","dependency_job_id":null,"html_url":"https://github.com/csauve/todotxt-parser","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/csauve/todotxt-parser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/csauve%2Ftodotxt-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/csauve%2Ftodotxt-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/csauve%2Ftodotxt-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/csauve%2Ftodotxt-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/csauve","download_url":"https://codeload.github.com/csauve/todotxt-parser/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/csauve%2Ftodotxt-parser/sbom","scorecard":{"id":310643,"data":{"date":"2025-08-11","repo":{"name":"github.com/csauve/todotxt-parser","commit":"95b041b061335be186876152a56ef3582e56a15c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 1/16 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 1 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"26 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-2j2x-2gpw-g8fm","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-2pr6-76vf-7546","Warn: Project is vulnerable to: GHSA-8j8c-7jfh-h6hx","Warn: Project is vulnerable to: GHSA-6c8f-qphg-qjgp","Warn: Project is vulnerable to: GHSA-jf85-cpcp-j695","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-fhjf-83wg-r2j9","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-4g88-fppr-53pp","Warn: Project is vulnerable to: GHSA-4jqc-8m5r-9rpr","Warn: Project is vulnerable to: GHSA-cf4h-3jhx-xvhq","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T23:07:41.883Z","repository_id":26270116,"created_at":"2025-08-17T23:07:41.883Z","updated_at":"2025-08-17T23:07:41.883Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":277005397,"owners_count":25743717,"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","status":"online","status_checked_at":"2025-09-25T02:00:09.612Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["coffeescript","js","node","parser","todotxt"],"created_at":"2025-09-26T01:04:17.243Z","updated_at":"2025-09-26T01:08:32.875Z","avatar_url":"https://github.com/csauve.png","language":"CoffeeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# todotxt-parser\nThis is a Node.js module for parsing [the todo.txt format](http://todotxt.com) created by [Gina Trapani](http://ginatrapani.org/). A variety of configuration options allow it to parse a strict canonical todo.txt format, or a more relaxed version permitting more liberal whitespace, comments, user-defined metadata extensions, and even indented hierarchical tasks with metadata inheritance.\n\n## About the Format\nThe todo.txt format attempts to maintain all the benefits of portable, human-readable flat files but still provide structured metadata for tools built on the format. For example, your `todo.txt` might look like this:\n\n```\n(A) Thank Mom for the meatballs @phone\n(B) Schedule Goodwill pickup +GarageSale @phone\nPost signs around the neighborhood +GarageSale\n@GroceryStore Eskimo pies\nSubmit expense report for work travel due:2015-01-25\nx 2015-01-10 See the new exhibit at the museum\n```\n\nEach line in the file is one task, and tasks can have priority (`(A)`), projects (`+GarageSale`), contexts (`@phone`), dates, and other metadata attached to them. Priority, project, and context are 3 main sliceable axes in an effective todo list. See the [todo.txt-cli wiki](https://github.com/ginatrapani/todo.txt-cli/wiki/The-Todo.txt-Format) for full description of the format.\n\n## Installation\n```sh\n$ npm install todotxt-parser\n```\n\n## API\nThe API consumes a multilined string and returns an array of task objects in the order they appeared in the input:\n```js\nvar parser = require(\"todotxt-parser\");\nvar tasks = parser.relaxed(\"x 2014-07-04 (A) 2014-06-19 Document YTD spending on +SocialEvents for @Alex due:2014-08-01\");\n```\n`tasks` looks like this:\n```js\n[\n  {\n    // the original untrimmed content of the line\n    \"raw\": \"x 2014-07-04 (A) 2014-06-19 Document YTD spending on +SocialEvents for @Alex due:2014-08-01\",\n    // the trimmed content of the line following the creation date\n    \"text\": \"Document YTD spending on +SocialEvents for @Alex due:2014-08-01\",\n    /* projects are found in the `text` field and begin with \"+\".\n     * Empty when none present */\n    \"projects\": [\"SocialEvents\"],\n    /* contexts are found in the `text` field and begin with \"@\".\n     * Empty when none present */\n    \"contexts\": [\"Alex\"],\n    // indicates if the task is marked as completed\n    \"complete\": true,\n    // ISO 8601 UTC datetime. Null if not present\n    \"dateCreated\": \"2014-06-19T00:00:00.000Z\",\n    // ISO 8601 UTC datetime. Null if not present\n    \"dateCompleted\": \"2014-07-04T00:00:00.000Z\",\n    /* The upper case A-Z priority. If priority was not\n     * explicitly given, `metadata.pri` will be used if\n     * it's present. Otherwise null\n     */\n    \"priority\": \"A\",\n    // Stores data parsed by metadata extensions. Defaults to {}\n    \"metadata\": {\"due\": \"2014-08-01\"},\n    /* In hierarchical mode, contains any direct children\n     * at a higher indentation level\n     */\n    \"subtasks\": [],\n    /* Indentation level of the task in character columns.\n     * See hierarchical mode for more details\n     */\n    \"indentLevel\": 2\n  }\n]\n```\n\nThere are two parsing functions availalbe: `parser.relaxed(input, options)` and `parser.parse(input, options)`. Options can be omitted or partial, and these functions only differ in their default options. Calling `parser.relaxed(input)` is equivalent to calling `parser.parse(input, parser.options.RELAXED)`. The default options for `parser.parse(input)` are equal to `parser.options.CANONICAL`.\n\n## Options\n*(Examples in CoffeeScript)*\n\nThe exposed default options are as follows:\n```coffee\noptions:\n  # Gina Trapani's todo.txt-cli format \u0026 implementation\n  CANONICAL:\n    dateParser: (s) -\u003e new Date(s).toJSON()\n    dateRegex: /\\d{4}-\\d{2}-\\d{2}/\n    relaxedWhitespace: false\n    requireCompletionDate: true\n    ignorePriorityCase: false\n    heirarchical: false\n    inherit: false\n    commentRegex: null\n    projectRegex: /(?:\\s|^)\\+(\\S+)/g\n    contextRegex: /(?:\\s|^)@(\\S+)/g\n    extensions: []\n  RELAXED:\n    dateParser: (s) -\u003e new Date(s).toJSON()\n    dateRegex: /\\d{4}-\\d{2}-\\d{2}/\n    relaxedWhitespace: true\n    requireCompletionDate: false\n    ignorePriorityCase: true\n    heirarchical: false\n    inherit: false\n    commentRegex: /^\\s*#.*$/\n    projectRegex: /(?:\\s+|^)\\+(\\S+)/g\n    contextRegex: /(?:\\s+|^)@(\\S+)/g\n    extensions: [\n      (text) -\u003e\n        metadata = {}\n        metadataRegex = /(?:\\s+|^)(\\S+):(\\S+)/g\n        while match = metadataRegex.exec text\n          metadata[match[1].toLowerCase()] = match[2]\n        metadata\n    ]\n```\n\n### dateParser\nA function accepting a string and returning a string, used to convert captured dates for the `dateCreated` and `dateCompleted` fields. It is recommended to return an ISO 8601 UTC datetime for consistency with the default date parser:\n```coffee\n(s) -\u003e new Date(s).toJSON()\n```\n\n### dateRegex\nA `RegExp` used to match the creation and completion dates. It should not contain any capture groups, and any modifiers (like case insensitivity) will be ignored. Matches will be parsed by the `dateParser` function. This option defaults to capturing \"YYYY-MM-DD\" format:\n```coffee\n/\\d{4}-\\d{2}-\\d{2}/\n```\n\n### relaxedWhitespace\nThe todo.txt specification does not allow for more than 1 space between the completion mark, completion date, priority, creation date, and text. This ensures priorities and tasks line up so lines can be sorted consistently. When `relaxedWhitespace` is set to `true`, these restrictions are lifted.\n```coffee\n# none of these longer whitespace gaps would have been valid\nparser.parse \"x   2013-11-11   (B)   2013-10-11   Clean up\",\n  relaxedWhitespace: true\n# with `relaxedWhitespace`, this is allowed now\nparser.parse \"    Task B\",\n  relaxedWhitespace: true\n```\n\n### requireCompletionDate\nA task is marked completed by adding a lower case \"x\" marker to the start of the line, followed by a single space and then a completion date. Changing 'requireCompletionDate' to false makes the date optional, allowing tasks like this:\n```coffee\nparser.parse \"x Walk the dog\",\n  requireCompletionDate: false\n```\nNote: It is possible for a tasks creation date to become its completion date with this option disabled:\n```coffee\n# this date will become the creation date\nparser.parse \"2014-12-02 Task A\",\n  requireCompletionDate: false\n\n# but now it is the completion date\nparser.parse \"x 2014-12-02 Task A\",\n  requireCompletionDate: false\n\n# a priority clears the ambiguity; it's now the creation date\nparser.parse \"x (A) 2014-12-02 Task A\",\n  requireCompletionDate: false\n```\n\n### ignorePriorityCase\nWhen set to `true`, both `A-Z` and `a-z` will be allowed for priority. The priority is still always converted to upper case after capture.\n\n### hierarchical\nStandard `todo.txt` has no notion of subtasks. Indentation is not allowed because the result is no longer sortable in a meaningful way. If you want to group a set of tasks under one project, each task needs to be annotated with the same `+Project` tag. This can clutter large projects, and it's difficult to see at a glance which tasks are associated by project. If the ability to sort lines alphabetically is not important to you, and you would rather be able to logically group tasks under other tasks, then there is **hierarchical mode**:\n\n```coffee\ntasks = parser.relaxed \"\"\"\n  Task A\n    Task B\n    Task C\n      Task D\n      Task E\n  Task F\n\"\"\", hierarchical: true\n```\nInstead of all tasks being stored in a single array, like standard mode with `relaxedWhitespace: true` would return, the `subtasks` field of each task is now used to store child tasks:\n\n*(Fields other than `text`, `indentLevel`, and `subtasks` omitted for brevity)*\n```coffee\n# parse still returns an array, but it only contains the root level tasks\n[\n  { text: \"Task A\", indentLevel: 0, subtasks: [\n    { text: \"Task B\", indentLevel: 2, subtasks: [] }\n    { text: \"Task C\", indentLevel: 2, subtasks: [\n      # a task is a leaf when `subtasks` is empty\n      { text: \"Task D\", indentLevel: 4, subtasks: [] }\n      { text: \"Task E\", indentLevel: 4, subtasks: [] }\n    ]}\n  ]}\n  # tasks A and F are siblings\n  { text: \"Task F\", indentLevel: 0, subtasks: [] }\n]\n```\n\nHierarchical mode implies `relaxedWhitespace: true`. A task is considered a subtask when its indentation level is greater than its parent's. A new parent is chosen when the indentation level is greater than the previous sibling's indentation level. For example, what is the output of this?\n\n```coffee\ntasks = parser.relaxed \"\"\"\n   Task A\n  Task B\n       Task C\n     Task D\n       Task E\n    Task F\n\"\"\", hierarchical: true\n```\n\nTasks A and B will be root level siblings even though they are not indented the same amount. Task B has three subtasks: C, D, and F. Task D has a single subtask, E. Even though tasks E and C are indented the same amount, it's their position relative to the previous task that matters. The best practice is to use consistent indentation.\n\nHow is `indentLevel` determined? There are two rules:\n\n1. If the line **immediately** begins with the completion mark \"x\", then `indentLevel` counts it **and** contiguous whitespace characters following it\n2. Otherwise, `indentLevel` is the number of leading whitespace characters\n\nThis means you can either place the completion mark in the first column, or after the indent:\n```\n  x Task B\n  Task C\n    x Task D\n    x Task E\n    Task F\n  Task G\n```\nis equivalent to:\n```\nx Task B\n  Task C\nx   Task D\nx   Task E\n    Task F\n  Task G\n```\nIt's important to note that tasks B and C are siblings. If the intent was to have C be a subtask of B, then the first format should have been used (add at least 1 extra column of leading whitespace).\n\n### inherit\nThe `inherit` option is only applicable to hierarchical mode, and is disabled by default. When enabled, subtasks will inherit the metadata of their ancestors. This includes projects, contexts, completeness, creation and completion dates, priority, and extension metadata. Subtasks can shadow ancestral metadata by explicitly defining it themselves.\n\n```coffee\ntasks = parser.relaxed \"\"\"\n  (A) 2014-06-19 Task A +Project1 @context1 due:2014-09-13 t:2014-05-01\n    Task B +Project2 due:2014-08-15\n\"\"\", hierarchical: true, inherit: true\n```\nTask B will have inhereted task A's metadata:\n```coffee\nraw: \"  Task B +Project2 due:2014-08-15\"\ntext: \"Task B +Project2 due:2014-08-15\"\n# `projects` and `contexts` are considered sets, so you won't\n# get duplicates if they're also found in an ancestor\nprojects: [\"Project 1\", \"Project 2\"]\ncontexts: [\"context1\"]\ncomplete: false\ndatecreated: \"2014-06-19T00:00:00.000Z\"\ndateCompleted: null\npriority: \"A\"\n# note that `due` is shadowing the parent's value\nmetadata: {due: \"2014-08-15\", t: \"2014-05-01\"}\nsubtasks: []\nindentLevel: 2\n```\n\n### commentRegex\nThis RegExp tests if the line is a comment, and should therefore be ignored. Comments are not part of the todo.txt specification, so this is `null` by default.\n\n### projectRegex, contextRegex\nThese two RegExp are used to match projects and contexts only inside the task's `text` field, which is anything following the creation date. The defaults match `+Project` and `@context`.\n```coffee\nprojectRegex: /(?:\\s|^)\\+(\\S+)/g\ncontextRegex: /(?:\\s|^)@(\\S+)/g\n```\nWhen supplying your own expressions, makes sure to have a capture group for the context/project itself, and to enable global matching with the `g` modifier.\n\n### extensions\nExtensions are functions that are passed the `text` field of the task and return an object of key-value metadata. The results of all extensions are merged into a task's `metadata` field. The order of functions in `extensions` matters: later functions can overwrite values for a key. No extensions are used by default, but relaxed mode will find any \"key:value\" pairs with this function:\n```coffee\nextensions: [\n  (text) -\u003e\n    metadata = {}\n    metadataRegex = /(?:\\s+|^)(\\S+):(\\S+)/g\n    while match = metadataRegex.exec text\n      metadata[match[1].toLowerCase()] = match[2]\n    metadata\n]\n```\n\n## Future work\n* Add a formatter that turns a list or hierarchy of tasks back into a string.\n\n## Testing\nUse node package manager to install dependencies and run the tests:\n```sh\n  $ npm install\n  $ npm test\n```\n\n## License\nSee the LICENSE file (MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcsauve%2Ftodotxt-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcsauve%2Ftodotxt-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcsauve%2Ftodotxt-parser/lists"}