{"id":29926680,"url":"https://github.com/ecomfe/san-anode-utils","last_synced_at":"2025-08-02T12:43:13.144Z","repository":{"id":40765285,"uuid":"269307107","full_name":"ecomfe/san-anode-utils","owner":"ecomfe","description":"Util Functions for San ANode","archived":false,"fork":false,"pushed_at":"2023-12-07T02:24:24.000Z","size":166,"stargazers_count":13,"open_issues_count":12,"forks_count":3,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-05-25T08:05:21.867Z","etag":null,"topics":["anode","san"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/ecomfe.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2020-06-04T08:48:06.000Z","updated_at":"2023-04-18T08:56:46.000Z","dependencies_parsed_at":"2023-02-05T17:00:52.044Z","dependency_job_id":null,"html_url":"https://github.com/ecomfe/san-anode-utils","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/ecomfe/san-anode-utils","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecomfe%2Fsan-anode-utils","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecomfe%2Fsan-anode-utils/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecomfe%2Fsan-anode-utils/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecomfe%2Fsan-anode-utils/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ecomfe","download_url":"https://codeload.github.com/ecomfe/san-anode-utils/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ecomfe%2Fsan-anode-utils/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268392189,"owners_count":24243297,"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-08-02T02:00:12.353Z","response_time":74,"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":["anode","san"],"created_at":"2025-08-02T12:42:47.092Z","updated_at":"2025-08-02T12:43:13.111Z","avatar_url":"https://github.com/ecomfe.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# San ANode Utils\n\nUtil Functions for San [ANode](https://github.com/baidu/san/blob/master/doc/anode.md). 和 [San](https://github.com/baidu/san) [ANode](https://github.com/baidu/san/blob/master/doc/anode.md) 相关的功能函数集。\n\n[![NPM version](http://img.shields.io/npm/v/san-anode-utils.svg?style=flat-square)](https://npmjs.org/package/san-anode-utils)\n[![License](https://img.shields.io/github/license/ecomfe/san-anode-utils.svg?style=flat-square)](https://npmjs.org/package/san-anode-utils)\n[![CircleCI](https://circleci.com/gh/ecomfe/san-anode-utils.svg?style=svg)](https://circleci.com/gh/ecomfe/san-anode-utils)\n\n\n## 版本说明\n\n由于 [San](https://github.com/baidu/san) 在不同的 minor 版本号之间，[ANode](https://github.com/baidu/san/blob/master/doc/anode.md) 会有细微差别。所以，san-anode-utils 的版本号与 [San](https://github.com/baidu/san) 版本号二位兼容。也就是说，san-anode-utils `3.9.x` 版本支持 [San](https://github.com/baidu/san) `3.9.x`。\n\n## 安装\n\n```\n$ npm i --save san-anode-utils\n```\n\n## Properties\n\n### ExprType\n\n表达式类型枚举常量。包含表达式见下方示例。\n\n`Object`\n\n```js\nExprType = {\n    STRING,\n    NUMBER,\n    BOOL,\n    ACCESSOR,\n    INTERP,\n    CALL,\n    TEXT,\n    BINARY,\n    UNARY,\n    TERTIARY,\n    OBJECT,\n    ARRAY,\n    NULL\n};\n```\n\n## Functions\n\n### parseTemplate\n\n`parseTemplate({string}template): {ANode}`\n\n将模板字符串解析成 [ANode](https://github.com/baidu/san/blob/master/doc/anode.md) 对象。\n\n```js\nconst aNodeUtils = require('san-anode-utils');\n\nlet aNode = aNodeUtils.parseTemplate('\u003cp\u003eHello {{name}}\u003c/p\u003e');\n/* aNode\n{\n    \"directives\": {},\n    \"props\": [],\n    \"events\": [],\n    \"children\": [\n        {\n            \"directives\": {},\n            \"props\": [],\n            \"events\": [],\n            \"children\": [\n                {\n                    \"textExpr\": {\n                        \"type\": 7,\n                        \"segs\": [\n                            {\n                                \"type\": 1,\n                                \"value\": \"Hello \"\n                            },\n                            {\n                                \"type\": 5,\n                                \"expr\": {\n                                    \"type\": 4,\n                                    \"paths\": [\n                                        {\n                                            \"type\": 1,\n                                            \"value\": \"name\"\n                                        }\n                                    ]\n                                },\n                                \"filters\": []\n                            }\n                        ]\n                    }\n                }\n            ],\n            \"tagName\": \"p\"\n        }\n    ]\n}\n*/\n```\n\n### parseComponentTemplate\n\n将组件的模板解析成 [ANode](https://github.com/baidu/san/blob/master/doc/anode.md) 对象。与直接调用 `parseTemplate` 不同，`parseComponentTemplate` 会自动抽取第一个子元素作为组件根元素，为其附加 `id/style/class` 的逻辑，其行为与运行时组件编译完全相同。\n\n`parseComponentTemplate({Function}ComponentClass): {ANode}`\n\n```js\nconst aNodeUtils = require('san-anode-utils');\nconst san = require('san');\n\nconst MyComponent = san.defineComponent({\n    template: '\u003cp\u003eHello {{name}}\u003c/p\u003e'\n});\nlet aNode = aNodeUtils.parseComponentTemplate(MyComponent);\n/* aNode\n{\n    \"directives\": {},\n    \"props\": [\n        {\n            \"name\": \"class\",\n            \"expr\": {\n                \"type\": 5,\n                \"expr\": {\n                    \"type\": 4,\n                    \"paths\": [\n                        {\n                            \"type\": 1,\n                            \"value\": \"class\"\n                        }\n                    ]\n                },\n                \"filters\": [\n                    {\n                        \"type\": 6,\n                        \"args\": [],\n                        \"name\": {\n                            \"type\": 4,\n                            \"paths\": [\n                                {\n                                    \"type\": 1,\n                                    \"value\": \"_class\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"style\",\n            \"expr\": {\n                \"type\": 5,\n                \"expr\": {\n                    \"type\": 4,\n                    \"paths\": [\n                        {\n                            \"type\": 1,\n                            \"value\": \"style\"\n                        }\n                    ]\n                },\n                \"filters\": [\n                    {\n                        \"type\": 6,\n                        \"args\": [],\n                        \"name\": {\n                            \"type\": 4,\n                            \"paths\": [\n                                {\n                                    \"type\": 1,\n                                    \"value\": \"_style\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"id\",\n            \"expr\": {\n                \"type\": 4,\n                \"paths\": [\n                    {\n                        \"type\": 1,\n                        \"value\": \"id\"\n                    }\n                ]\n            }\n        }\n    ],\n    \"events\": [],\n    \"children\": [\n        {\n            \"textExpr\": {\n                \"type\": 7,\n                \"segs\": [\n                    {\n                        \"type\": 1,\n                        \"value\": \"Hello \"\n                    },\n                    {\n                        \"type\": 5,\n                        \"expr\": {\n                            \"type\": 4,\n                            \"paths\": [\n                                {\n                                    \"type\": 1,\n                                    \"value\": \"name\"\n                                }\n                            ]\n                        },\n                        \"filters\": []\n                    }\n                ]\n            }\n        }\n    ],\n    \"tagName\": \"p\"\n}\n*/\n```\n\n### parseExpr\n\n将表达式源码解析成 [ANode](https://github.com/baidu/san/blob/master/doc/anode.md) 对象。\n\n`parseExpr({string}source): {ANode}`\n\n```js\nconst aNodeUtils = require('san-anode-utils');\n\nlet aNode = aNodeUtils.parseExpr('num + 1');\n/* aNode\n{\n    \"type\": 8,\n    \"operator\": 43,\n    \"segs\": [\n        {\n            \"type\": 4,\n            \"paths\": [\n                {\n                    \"type\": 1,\n                    \"value\": \"num\"\n                }\n            ]\n        },\n        {\n            \"type\": 2,\n            \"value\": 1\n        }\n    ]\n}\n*/\n```\n\n### pack\n\n将 [ANode](https://github.com/baidu/san/blob/master/doc/anode.md) 压缩成 [APack](https://github.com/baidu/san/blob/master/doc/anode-pack.md)。\n\n`pack({ANode}source): {Array}`\n\n```js\nconst aNodeUtils = require('san-anode-utils');\n\nlet aNode = aNodeUtils.parseTemplate('\u003cp\u003eHello {{name}}\u003c/p\u003e');\nlet aPack = aNodeUtils.pack(aNode.children[0]);\n/* aPack\n[\n    1,\n    \"p\",\n    1,\n    undefined,\n    9,\n    undefined,\n    2,\n    3,\n    \"Hello \",\n    7,\n    undefined,\n    6,\n    1,\n    3,\n    \"name\",\n    undefined\n]\n*/\n```\n\n### pack.stringify\n\n将 [APack](https://github.com/baidu/san/blob/master/doc/anode.md) 转换成字符串。\n\n`pack.stringify({ANode}source): {Array}`\n\n```js\nconst aNodeUtils = require('san-anode-utils');\n\nlet aNode = aNodeUtils.parseTemplate('\u003cp\u003eHello {{name}}\u003c/p\u003e');\nlet aPack = aNodeUtils.pack(aNode.children[0]);\nlet aPackString = aNodeUtils.pack.stringify(aPack);\n/* aPackString\n[1,\"p\",1,,9,,2,3,\"Hello \",7,,6,1,3,\"name\",]\n*/\n```\n\n### unpack\n\n将 [APack](https://github.com/baidu/san/blob/master/doc/anode-pack.md) 解压缩成 [ANode](https://github.com/baidu/san/blob/master/doc/anode.md)。\n\n`unpack({Array}aPack): {ANode}`\n\n```js\nconst aNodeUtils = require('san-anode-utils');\n\nlet aNode = aNodeUtils.unpack([1,\"p\",1,,9,,2,3,\"Hello \",7,,6,1,3,\"name\",]);\n/* aNode\n{\n    \"directives\": {},\n    \"props\": [],\n    \"events\": [],\n    \"children\": [\n        {\n            \"textExpr\": {\n                \"type\": 7,\n                \"segs\": [\n                    {\n                        \"type\": 1,\n                        \"value\": \"Hello \"\n                    },\n                    {\n                        \"type\": 5,\n                        \"expr\": {\n                            \"type\": 4,\n                            \"paths\": [\n                                {\n                                    \"type\": 1,\n                                    \"value\": \"name\"\n                                }\n                            ]\n                        },\n                        \"filters\": []\n                    }\n                ]\n            }\n        }\n    ],\n    \"tagName\": \"p\"\n}\n*/\n```\n\n## License\n\nsan-anode-utils is [MIT licensed](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fecomfe%2Fsan-anode-utils","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fecomfe%2Fsan-anode-utils","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fecomfe%2Fsan-anode-utils/lists"}