{"id":18898495,"url":"https://github.com/luojilab/cssparser","last_synced_at":"2025-04-15T02:32:09.890Z","repository":{"id":70525825,"uuid":"146852665","full_name":"luojilab/CSSParser","owner":"luojilab","description":"A CSS parser in C++","archived":false,"fork":false,"pushed_at":"2018-12-07T14:01:32.000Z","size":346,"stargazers_count":20,"open_issues_count":0,"forks_count":9,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-03-28T14:21:18.632Z","etag":null,"topics":["c","css","gumbo","html"],"latest_commit_sha":null,"homepage":"","language":"C++","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/luojilab.png","metadata":{"files":{"readme":"README-EN.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-08-31T06:44:06.000Z","updated_at":"2024-12-17T08:25:57.000Z","dependencies_parsed_at":"2023-04-17T16:16:56.756Z","dependency_job_id":null,"html_url":"https://github.com/luojilab/CSSParser","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luojilab%2FCSSParser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luojilab%2FCSSParser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luojilab%2FCSSParser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luojilab%2FCSSParser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luojilab","download_url":"https://codeload.github.com/luojilab/CSSParser/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248994013,"owners_count":21195296,"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":["c","css","gumbo","html"],"created_at":"2024-11-08T08:42:55.337Z","updated_at":"2025-04-15T02:32:09.530Z","avatar_url":"https://github.com/luojilab.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DDCSSParser - a C++ CSS Parser\n\n[![LISCENSE](https://img.shields.io/packagist/l/doctrine/orm.svg)](./LICENSE.md)\n\n[中文文档](./README.md)\n\n------\n\nDDCSSParser is a CSS parser implemented by c++. By this parser, user can get a series of CSS model and check whether a CSS model (a CSS rule) can be applied to an HTML DOM node.\n\n\n\n\u003cimg id=\"sc0\" src = \"./projectStruct-EN.svg\"/\u003e\n\n\n\n## Installation\n\n##### Using Code\n\n* Copy source code in working directory `git clone https://github.com/luojilab/CSSParser.git`\n* Extract the source code in **Src** directory into working project\n\n##### Running Demo\n\n- `./autogen.sh`\n- `./configure`\n- `make`\n- `./example fullpath/to/htmlfile fullpath/to/cssfile`\n\n## Features\n\n#### Supported CSS Selector:\n\n- Simple Selector:\n  - Type Selector\n  - Universal Selector\n  - Attribute Selector\n  - Class Selector\n  - ID Selector\n  - Pseudo Class\n- Selector Sequence\n- Selector Group\n- Combinators:\n  - Descendant combinator\n  - Child combinators\n  - Sibling combinators\n\n## Goals to Achive\n\n* Remove dependency to [Gumbo](https://github.com/google/gumbo-parser)\n* Support modeling for CSS rule\n* Remove some potential bugs\n\n## Basic Usage\n\n* Modling CSS Selector\n\n  ```c++\n  // parse css file\n  future::CSSParser* parser = new future::CSSParser;\n  parser-\u003eparseByFile(\"/Path/to/CssFile\");\n  std::list\u003cfuture::Selector *\u003eselectors = parser\u003egetSelectors();\n  // parse css string\n  parser-\u003eparseByString(\"body #id {}\");\n  std::list\u003cfuture::Selector *\u003eselectors = parser\u003egetSelectors();\n  ```\n\n* Check whether a CSS selector can be applied to an HTML DOM node\n\n  ```c++\n  // selectors is all selector model parsed by a css file\n  future::Selector* selector = *selectors.begin();\n  // get a DOM node (root node in this example)\n  GumboNode *root = gi.get_root_node();\n  // initial argument\n  future::HTMLCSSRefAdaptor::GumboArray nodesArray = \u0026root;\n  // check whether a CSS selector can be applied to an HTML DOM node\n  future::HTMLCSSRefAdaptor::nodeAdaptToSelector(\u0026nodesArray, selector);\n  ```\n\n* Find out all the HTML DOM nodes that can use a specific CSS node\n\n  ```c++\n  // tranverse DOM tree\n  void AllNodesApplyToSelector(GumboNode *root, future::Selector* selector, std::list\u003cGumboNode *\u003e\u0026list)\n  {\n      if (root-\u003etype == GUMBO_NODE_ELEMENT) {\n          GumboVector children = root-\u003ev.element.children;\n          for (unsigned int i = 0; i \u003c children.length; i++) {\n              GumboNode*child = (GumboNode *)(children.data[i]);\n              AllNodesApplyToSelector(child, selector, list);\n          }\n          future::HTMLCSSRefAdaptor::GumboArray nodesArray = \u0026root;\n          if (future::HTMLCSSRefAdaptor::nodeAdaptToSelector(\u0026nodesArray, selector)) {\n              list.push_back(root);\n          }\n      }\n      future::HTMLCSSRefAdaptor::CleanResource();\n  }\n  // Find out all the HTML DOM nodes that can use a specific CSS node\n  std::list\u003cGumboNode*\u003e\u0026allNodesRef = allNodes;\n  future::Selector* s = *selectors.begin();\n  AllNodesApplyToSelector(gi.get_root_node(), s, allNodesRef);\n  ```\n\n## Applicability\n\nThe code has been test on iOS/Android/Linux/Windows\n\nUsing on Android, you must write a seperator API for Java\n\n## Dependency\n\n* [Google Gumbo](https://github.com/google/gumbo-parser)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluojilab%2Fcssparser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluojilab%2Fcssparser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluojilab%2Fcssparser/lists"}