├── .gitignore
├── LICENSE.md
├── Makefile.am
├── README-EN.md
├── ReadMe.md
├── autogen.sh
├── configure.ac
├── examples
└── main.cpp
├── projectStruct-CN.svg
├── projectStruct-EN.svg
└── src
├── Applicability
├── HTMLCSSRefAdaptor.cpp
├── HTMLCSSRefAdaptor.h
├── PseudoSelectorRefChiefJudge.cpp
└── PseudoSelectorRefChiefJudge.hpp
├── CSSParser
├── CSSLex.cpp
├── CSSLex.hpp
├── CSSLexStatus.h
├── CSSParser.cpp
├── CSSParser.hpp
├── CSSParserStatus.h
├── Keyword
│ ├── KeywordItem.cpp
│ └── KeywordItem.hpp
└── Selectors
│ ├── AttributeSelector.cpp
│ ├── AttributeSelector.hpp
│ ├── ClassSelector.cpp
│ ├── ClassSelector.hpp
│ ├── CombineSelector.cpp
│ ├── CombineSelector.hpp
│ ├── IdSelector.cpp
│ ├── IdSelector.hpp
│ ├── PseudoSelector.cpp
│ ├── PseudoSelector.hpp
│ ├── Selector.cpp
│ ├── Selector.hpp
│ ├── SelectorGroup.cpp
│ ├── SelectorGroup.hpp
│ ├── SelectorSequence.cpp
│ ├── SelectorSequence.hpp
│ ├── SelectorsHeader.h
│ ├── SignSelector.cpp
│ ├── SignSelector.hpp
│ ├── TypeSelector.cpp
│ ├── TypeSelector.hpp
│ ├── UniversalSelector.cpp
│ └── UniversalSelector.hpp
└── Vendor
├── Utils
├── ContainerUtil.cpp
├── ContainerUtil.hpp
├── StringUtil.cpp
└── StringUtil.h
└── gumbo
├── CHANGES.md
├── CONTRIBUTING.md
├── GumboInterface.cpp
├── GumboInterface.h
├── Thanks
├── UrlUtil.cpp
├── UrlUtil.h
├── attribute.c
├── attribute.h
├── char_ref.c
├── char_ref.h
├── char_ref.rl
├── error.c
├── error.h
├── gumbo.h
├── gumbo_edit.c
├── gumbo_edit.h
├── include
├── gumbo_windll.def
└── strings.h
├── insertion_mode.h
├── parser.c
├── parser.h
├── string_buffer.c
├── string_buffer.h
├── string_piece.c
├── string_piece.h
├── tag.c
├── tag.in
├── tag_enum.h
├── tag_perf.h
├── tag_sizes.h
├── tag_strings.h
├── token_type.h
├── tokenizer.c
├── tokenizer.h
├── tokenizer_states.h
├── utf8.c
├── utf8.h
├── util.c
├── util.h
├── vector.c
└── vector.h
/.gitignore:
--------------------------------------------------------------------------------
1 | #build products
2 | *.o
3 | *.d
4 | *.a
5 |
6 | # Editor swap files
7 | *.swp
8 | *.swo
9 | *.swn
10 |
11 | # Other build artifacts
12 | /Debug
13 | /visualc/Debug
14 | /visualc/Release
15 | /visualc/gumbo.sdf
16 | /visualc/gumbo.opensdf
17 | /build
18 | .log
19 | .sdf
20 | .opensdf
21 | .deps
22 | .dirstamp
23 | .libs
24 | Makefile
25 | Makefile.in
26 | aclocal.m4
27 | autom4te.cache
28 | compile
29 | config.guess
30 | config.log
31 | config.status
32 | config.sub
33 | configure
34 | depcomp
35 | gumbo.pc
36 | gumbo_test
37 | gumbo_test.log
38 | gumbo_test.trs
39 | install-sh
40 | libtool
41 | ltmain.sh
42 | m4/
43 | missing
44 | test-driver
45 | test-suite.log
46 | ar-lib
47 | config.h.in
48 | config.h
49 | stamp-h1
50 |
51 | #bin
52 | example
53 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | Copyright (c) 2018 Beijing logicreation Information & Technology Co., Ltd
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/Makefile.am:
--------------------------------------------------------------------------------
1 | lib_LIBRARIES = libcssparser.a
2 | libcssparser_a_SOURCES = \
3 | src/CSSParser/CSSParser.cpp\
4 | src/CSSParser/CSSLex.cpp\
5 | src/CSSParser/Keyword/KeywordItem.cpp\
6 | src/CSSParser/Selectors/ClassSelector.cpp\
7 | src/CSSParser/Selectors/PseudoSelector.cpp\
8 | src/CSSParser/Selectors/SelectorGroup.cpp\
9 | src/CSSParser/Selectors/SignSelector.cpp\
10 | src/CSSParser/Selectors/CombineSelector.cpp\
11 | src/CSSParser/Selectors/AttributeSelector.cpp\
12 | src/CSSParser/Selectors/SelectorSequence.cpp\
13 | src/CSSParser/Selectors/UniversalSelector.cpp\
14 | src/CSSParser/Selectors/TypeSelector.cpp\
15 | src/CSSParser/Selectors/Selector.cpp\
16 | src/CSSParser/Selectors/IdSelector.cpp\
17 | src/Applicability/HTMLCSSRefAdaptor.cpp\
18 | src/Applicability/PseudoSelectorRefChiefJudge.cpp\
19 | src/Vendor/gumbo/string_buffer.c\
20 | src/Vendor/gumbo/util.c\
21 | src/Vendor/gumbo/vector.c\
22 | src/Vendor/gumbo/attribute.c\
23 | src/Vendor/gumbo/UrlUtil.cpp\
24 | src/Vendor/gumbo/char_ref.c\
25 | src/Vendor/gumbo/utf8.c\
26 | src/Vendor/gumbo/error.c\
27 | src/Vendor/gumbo/tag.c\
28 | src/Vendor/gumbo/GumboInterface.cpp\
29 | src/Vendor/gumbo/parser.c\
30 | src/Vendor/gumbo/tokenizer.c\
31 | src/Vendor/gumbo/string_piece.c\
32 | src/Vendor/gumbo/gumbo_edit.c\
33 | src/Vendor/Utils/ContainerUtil.cpp\
34 | src/Vendor/Utils/StringUtil.cpp
35 |
36 | bin_PROGRAMS = example
37 | libcssparser_a_CPPFLAGS = \
38 | -Isrc/Applicability\
39 | -Isrc/CSSParser\
40 | -Isrc/CSSParser/Keyword\
41 | -Isrc/CSSParser/Selectors\
42 | -Isrc/Vendor/gumbo\
43 | -Isrc/Vendor/Utils
44 | example_CPPFLAGS =\
45 | -Isrc/Applicability\
46 | -Isrc/CSSParser\
47 | -Isrc/CSSParser/Keyword\
48 | -Isrc/CSSParser/Selectors\
49 | -Isrc/Vendor/gumbo\
50 | -Isrc/Vendor/Utils
51 | example_SOURCES = examples/main.cpp
52 | example_DEPENDENCIES = libcssparser.a
53 | example_LDADD = libcssparser.a
54 |
--------------------------------------------------------------------------------
/README-EN.md:
--------------------------------------------------------------------------------
1 | # DDCSSParser - a C++ CSS Parser
2 |
3 | [](./LICENSE.md)
4 |
5 | [中文文档](./README.md)
6 |
7 | ------
8 |
9 | DDCSSParser 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.
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | ## Installation
18 |
19 | ##### Using Code
20 |
21 | * Copy source code in working directory `git clone https://github.com/luojilab/CSSParser.git`
22 | * Extract the source code in **Src** directory into working project
23 |
24 | ##### Running Demo
25 |
26 | - `./autogen.sh`
27 | - `./configure`
28 | - `make`
29 | - `./example fullpath/to/htmlfile fullpath/to/cssfile`
30 |
31 | ## Features
32 |
33 | #### Supported CSS Selector:
34 |
35 | - Simple Selector:
36 | - Type Selector
37 | - Universal Selector
38 | - Attribute Selector
39 | - Class Selector
40 | - ID Selector
41 | - Pseudo Class
42 | - Selector Sequence
43 | - Selector Group
44 | - Combinators:
45 | - Descendant combinator
46 | - Child combinators
47 | - Sibling combinators
48 |
49 | ## Goals to Achive
50 |
51 | * Remove dependency to [Gumbo](https://github.com/google/gumbo-parser)
52 | * Support modeling for CSS rule
53 | * Remove some potential bugs
54 |
55 | ## Basic Usage
56 |
57 | * Modling CSS Selector
58 |
59 | ```c++
60 | // parse css file
61 | future::CSSParser* parser = new future::CSSParser;
62 | parser->parseByFile("/Path/to/CssFile");
63 | std::listselectors = parser>getSelectors();
64 | // parse css string
65 | parser->parseByString("body #id {}");
66 | std::listselectors = parser>getSelectors();
67 | ```
68 |
69 | * Check whether a CSS selector can be applied to an HTML DOM node
70 |
71 | ```c++
72 | // selectors is all selector model parsed by a css file
73 | future::Selector* selector = *selectors.begin();
74 | // get a DOM node (root node in this example)
75 | GumboNode *root = gi.get_root_node();
76 | // initial argument
77 | future::HTMLCSSRefAdaptor::GumboArray nodesArray = &root;
78 | // check whether a CSS selector can be applied to an HTML DOM node
79 | future::HTMLCSSRefAdaptor::nodeAdaptToSelector(&nodesArray, selector);
80 | ```
81 |
82 | * Find out all the HTML DOM nodes that can use a specific CSS node
83 |
84 | ```c++
85 | // tranverse DOM tree
86 | void AllNodesApplyToSelector(GumboNode *root, future::Selector* selector, std::list&list)
87 | {
88 | if (root->type == GUMBO_NODE_ELEMENT) {
89 | GumboVector children = root->v.element.children;
90 | for (unsigned int i = 0; i < children.length; i++) {
91 | GumboNode*child = (GumboNode *)(children.data[i]);
92 | AllNodesApplyToSelector(child, selector, list);
93 | }
94 | future::HTMLCSSRefAdaptor::GumboArray nodesArray = &root;
95 | if (future::HTMLCSSRefAdaptor::nodeAdaptToSelector(&nodesArray, selector)) {
96 | list.push_back(root);
97 | }
98 | }
99 | future::HTMLCSSRefAdaptor::CleanResource();
100 | }
101 | // Find out all the HTML DOM nodes that can use a specific CSS node
102 | std::list&allNodesRef = allNodes;
103 | future::Selector* s = *selectors.begin();
104 | AllNodesApplyToSelector(gi.get_root_node(), s, allNodesRef);
105 | ```
106 |
107 | ## Applicability
108 |
109 | The code has been test on iOS/Android/Linux/Windows
110 |
111 | Using on Android, you must write a seperator API for Java
112 |
113 | ## Dependency
114 |
115 | * [Google Gumbo](https://github.com/google/gumbo-parser)
--------------------------------------------------------------------------------
/ReadMe.md:
--------------------------------------------------------------------------------
1 | # DDCSSParser - C++的CSS解析器
2 |
3 | [](./LICENSE.md)
4 |
5 | [English document](./README-EN.md)
6 |
7 | ------
8 |
9 | DDCSSParser是一个C++实现的css解析器。最终会生成一系列的selector的模型(Selector类),并且会依据一个Selector判断CSS是否适用于某一个HTML的DOM节点。
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | ## 安装
18 |
19 | ##### 使用代码
20 |
21 | * 将代码拷贝至本地`git clone https://github.com/luojilab/CSSParser.git`
22 | * 提取出来**Src**文件夹中的内容到工程中
23 |
24 | ##### 运行demo
25 |
26 | * `./autogen.sh`
27 | * `./configure`
28 | * `make`
29 | * `./example fullpath/to/htmlfile fullpath/to/cssfile`
30 |
31 | ## 特性
32 |
33 | #### 支持的CSS Selector:
34 |
35 | * Simple Selector:
36 | * Type Selector
37 | * Universal Selector
38 | * Attribute Selector
39 | * Class Selector
40 | * ID Selector
41 | * Pseudo Class
42 | * Selector Sequence
43 | * Selector Group
44 | * Combinators:
45 | * Descendant combinator
46 | * Child combinators
47 | * Sibling combinators
48 |
49 | #### 将要实现的目标:
50 |
51 | * 移除对于[Gumbo](https://github.com/google/gumbo-parser)的依赖
52 | * 增加对于CSS规则的建模
53 | * 消除可能存在的一些bug
54 |
55 | ## 基础用法
56 |
57 | * 建立CSS Selector的模型
58 |
59 | ```c++
60 | // 解析css文件
61 | future::CSSParser* parser = new future::CSSParser;
62 | parser->parseByFile("/Path/to/CssFile");
63 | std::listselectors = parser>getSelectors();
64 | // 解析css字符串
65 | parser->parseByString("body #id {}");
66 | std::listselectors = parser>getSelectors();
67 | ```
68 |
69 | * 查询CSS某一条规则是否应用到HTML的某一节点上
70 |
71 | ```c++
72 | // selectors为解析出来的所有selector的选择器模型
73 | future::Selector* selector = *selectors.begin();
74 | // 获取某一个节点(本例是根结点)
75 | GumboNode *root = gi.get_root_node();
76 | // 初始化数据
77 | future::HTMLCSSRefAdaptor::GumboArray nodesArray = &root;
78 | // 查询selector这个css选择是否可以应用到root这个DOM节点中
79 | future::HTMLCSSRefAdaptor::nodeAdaptToSelector(&nodesArray, selector);
80 | ```
81 |
82 | * 查询满足某一个Selector的所有DOM节点
83 |
84 | ```c++
85 | // 遍历DOM树
86 | void AllNodesApplyToSelector(GumboNode *root, future::Selector* selector, std::list&list)
87 | {
88 | if (root->type == GUMBO_NODE_ELEMENT) {
89 | GumboVector children = root->v.element.children;
90 | for (unsigned int i = 0; i < children.length; i++) {
91 | GumboNode*child = (GumboNode *)(children.data[i]);
92 | AllNodesApplyToSelector(child, selector, list);
93 | }
94 | future::HTMLCSSRefAdaptor::GumboArray nodesArray = &root;
95 | if (future::HTMLCSSRefAdaptor::nodeAdaptToSelector(&nodesArray, selector)) {
96 | list.push_back(root);
97 | }
98 | }
99 | future::HTMLCSSRefAdaptor::CleanResource();
100 | }
101 | // 查找所有满足选择器s的所有DOM节点
102 | std::list&allNodesRef = allNodes;
103 | future::Selector* s = *selectors.begin();
104 | AllNodesApplyToSelector(gi.get_root_node(), s, allNodesRef);
105 | ```
106 |
107 | ## 适用性
108 |
109 | 本代码经过测试已经在iOS/Android/Linux/windows上测试通过。
110 |
111 | *Android需要单独写接口对接Java*
112 |
113 |
114 | ## 依赖
115 |
116 | * [Google Gumbo](https://github.com/google/gumbo-parser)
117 |
118 |
--------------------------------------------------------------------------------
/autogen.sh:
--------------------------------------------------------------------------------
1 | if test -z "$LIBTOOLIZE" -a "`uname`" = "Darwin"; then
2 | if command -v "glibtoolize" >/dev/null; then
3 | LIBTOOLIZE=glibtoolize
4 | elif command -v "libtoolize" >/dev/null; then
5 | LIBTOOLIZE=libtoolize
6 | else
7 | echo "autogen.sh: line $LINENO: command glibtoolize or libtoolize not found"
8 | exit 1
9 | fi
10 | fi
11 |
12 | autoreconf --install
13 |
--------------------------------------------------------------------------------
/configure.ac:
--------------------------------------------------------------------------------
1 | AC_INIT([cssparser], [1.0], [fuguoqiang@luojilab.com])
2 | AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
3 | AC_PROG_CC
4 | AC_PROG_CXX
5 | AC_PROG_RANLIB
6 | AM_PROG_AR
7 | AC_CONFIG_HEADERS([config.h])
8 | AC_CONFIG_FILES([
9 | Makefile
10 | ])
11 | AC_OUTPUT
12 |
--------------------------------------------------------------------------------
/examples/main.cpp:
--------------------------------------------------------------------------------
1 | //
2 | // main.cpp
3 | // DDCSSParser
4 | //
5 | // Created by 1m0nster on 2018/8/1.
6 | // Copyright © 2018 1m0nster. All rights reserved.
7 | //
8 |
9 | #include
10 | #include "CSSParser.hpp"
11 | #include "KeywordItem.hpp"
12 | #include "gumbo.h"
13 | #include "GumboInterface.h"
14 | #include "HTMLCSSRefAdaptor.h"
15 |
16 | void Applicability(GumboNode *root, future::Selector* selector);
17 | void AllNodesApplyToSelector(GumboNode *root, future::Selector* selector, std::list&list);
18 |
19 | int main(int argc, const char * argv[]) {
20 | if (argc < 3) {
21 | printf("Please enter html path and css path\n");
22 | return 0;
23 | }
24 | const char* htmlPath = argv[1];
25 | const char* cssPath = argv[2];
26 | if (!strlen(htmlPath)) {
27 | printf("HTML path is empty\n");
28 | return 0;
29 | }
30 | if (!strlen(cssPath)) {
31 | printf("css path is empty\n");
32 | return 0;
33 | }
34 |
35 | FILE *f = fopen(htmlPath, "r");
36 | if (!f) { printf("HTML file open failed\n"); return 0;}
37 | fseek(f, 0, SEEK_END);
38 | size_t size = ftell(f);
39 | if (size == 0) { printf("HTML file is empty\n"); return 0; }
40 | fseek(f, 0, SEEK_SET);
41 | char* ptr = new char[size + 1];
42 | memset(ptr, 0, size + 1);
43 | fread((void *)ptr, size, 1, f);
44 | fclose(f);
45 |
46 | future::GumboInterface gi(ptr, "2");
47 | future::CSSParser* parser = new future::CSSParser;
48 | parser->parseByFile(cssPath);
49 | std::setselectors = parser->getSelectors();
50 |
51 | printf("********** All Keywords **********\n");
52 | for(future::KeywordItem* keyword : parser->getKeywords()) {
53 | printf("%s\n", keyword->getName().c_str());
54 | }
55 | // Print all selectors
56 | printf("\n\n********** All Selectors **********\n");
57 | for(future::Selector *s : selectors) {
58 | printf("%s\n", s->description().c_str());
59 | }
60 | printf("\n");
61 | // Demo1:
62 | // 检测html中的node,是否适用于一个css的selector
63 | // Check whether a css selector canapply to a html node
64 | for (future::Selector *s : selectors) {
65 | // Tranvers DOM tree
66 | Applicability(gi.get_root_node(), s);
67 | }
68 | // Demo2:
69 | // 找到所有适用于某一selector的DMO节点
70 | // checkout All Nodes in DOM that can apply to a specific selector
71 | std::listallNodes;
72 | std::list&allNodesRef = allNodes;
73 | future::Selector* s = *selectors.begin();
74 | AllNodesApplyToSelector(gi.get_root_node(), s, allNodesRef);
75 | delete [] ptr;
76 | delete parser;
77 | return 0;
78 | }
79 |
80 | void Applicability(GumboNode *root, future::Selector* selector)
81 | {
82 | if (root->type == GUMBO_NODE_ELEMENT) {
83 | GumboVector children = root->v.element.children;
84 | for (unsigned int i = 0; i < children.length; i++) {
85 | GumboNode*child = (GumboNode *)(children.data[i]);
86 | Applicability(child, selector);
87 | }
88 | const char* name = HTMLTagNames[root->v.element.tag];
89 | future::HTMLCSSRefAdaptor::GumboArray nodesArray = &root;
90 | int *temp = new int(1);
91 | printf("%s match selector %s line: %d\n",
92 | name,
93 | future::HTMLCSSRefAdaptor::nodeAdaptToSelector(&nodesArray, selector, temp) ? "YES" : "FALSE",
94 | root->v.element.start_pos.line);
95 | delete temp;
96 |
97 | }
98 | future::HTMLCSSRefAdaptor::CleanResource();
99 | }
100 |
101 | void AllNodesApplyToSelector(GumboNode *root, future::Selector* selector, std::list&list)
102 | {
103 | if (root->type == GUMBO_NODE_ELEMENT) {
104 | GumboVector children = root->v.element.children;
105 | for (unsigned int i = 0; i < children.length; i++) {
106 | GumboNode*child = (GumboNode *)(children.data[i]);
107 | AllNodesApplyToSelector(child, selector, list);
108 | }
109 | future::HTMLCSSRefAdaptor::GumboArray nodesArray = &root;
110 | int *temp = new int(1);
111 | if (future::HTMLCSSRefAdaptor::nodeAdaptToSelector(&nodesArray, selector, temp)) {
112 | list.push_back(root);
113 | }
114 | }
115 | future::HTMLCSSRefAdaptor::CleanResource();
116 | }
117 |
--------------------------------------------------------------------------------
/projectStruct-EN.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
178 |
--------------------------------------------------------------------------------
/src/Applicability/HTMLCSSRefAdaptor.h:
--------------------------------------------------------------------------------
1 | /*
2 | * HTMLCSSRefAdaptor.h
3 | *
4 | * Created on: 2018-8-9
5 | * Author: 1m0nster
6 | */
7 |
8 | #ifndef HTMLCSSREFADAPTOR_H_
9 | #define HTMLCSSREFADAPTOR_H_
10 | #include "gumbo.h"
11 | #include "SelectorsHeader.h"
12 |
13 | namespace future {
14 |
15 | class HTMLCSSRefAdaptor {
16 | public:
17 | typedef GumboNode*** GumboArrayPtr;
18 | typedef GumboNode** GumboArray;
19 | HTMLCSSRefAdaptor();
20 | virtual ~HTMLCSSRefAdaptor();
21 | /**
22 | * Check Whether a selector can apply to the node in nodes
23 | * @param nodes the check nodes
24 | * @param selector the selector
25 | * @param potentialSize the size of nodes array
26 | * @note the nodes can be changed after the comparing.
27 | */
28 | static bool nodeAdaptToSelector(GumboArrayPtr nodes, Selector* selector, int *potentialSize);
29 |
30 | /**
31 | * Clean all resource after the compare
32 | */
33 | static void CleanResource();
34 |
35 | private:
36 | static bool nodeAdaptToIDSelector(GumboArrayPtr node, IdSelector* selector, int *potentialSize);
37 | static bool nodeAdaptToClassSelector(GumboArrayPtr node, ClassSelector* selector, int *potentialSize);
38 | static bool nodeAdaptToTypeSelector(GumboArrayPtr node, TypeSelector* selector, int *potentialSize);
39 | static bool nodeAdaptToAttributeSelector(GumboArrayPtr node, AttributeSelector* selector, int *potentialSize);
40 | static bool nodeAdaptToPseudoSelector(GumboArrayPtr node, PseudoSelector* selector, int *potentialSize);
41 | static bool nodeAdaptToSequenceSelector(GumboArrayPtr node, SequenceSelector* selector, int *potentialSize);
42 | static bool nodeAdaptToCombineSelector(GumboArrayPtr node, CombineSelector* selector, int *potentialSize);
43 | static bool nodeAdaptToGroupSelector(GumboArrayPtr node, GroupSelector* selector, int *potentialSize);
44 | static void updateNextNodes(const std::list&, GumboArrayPtr arrayPtr, int *size);
45 | };
46 |
47 | }
48 |
49 | #endif /* HTMLCSSREFADAPTOR_H_ */
50 |
--------------------------------------------------------------------------------
/src/Applicability/PseudoSelectorRefChiefJudge.hpp:
--------------------------------------------------------------------------------
1 | //
2 | // PseudoSelectorRefChiefJudge.hpp
3 | // DDCSSParser
4 | //
5 | // Created by 1m0nster on 2018/9/12.
6 | // Copyright © 2018 1m0nster. All rights reserved.
7 | //
8 |
9 | #ifndef PseudoSelectorRefChiefJudge_hpp
10 | #define PseudoSelectorRefChiefJudge_hpp
11 |
12 | #include