-
-
Notifications
You must be signed in to change notification settings - Fork 10
/
about.html
109 lines (105 loc) · 17.8 KB
/
about.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8"> <title>Clss</title> <meta name="viewport" content="width=device-width"> <meta name="description" content="A DOM tree searching engine based on CSS selectors."> <meta name="author" content="Nicolas Hafner <[email protected]>"> <style type="text/css"> body{
max-width: 1024px;
margin: 0 auto 0 auto;
font-family: sans-serif;
color: #333333;
font-size: 14pt;
padding: 5px;
}
body>header{
display:flex;
align-items: center;
justify-content: center;
flex-direction: column;
max-width: 100%;
text-align: center;
}
body>header img{
max-width: 50%;
}
img{
max-width: 100%;
max-height: 100%;
}
code{
font-family: Consolas, Inconsolata, monospace;
}
a{
text-decoration: none;
color: #0055AA;
}
a img{
border: none;
}
#documentation{
text-align: justify;
}
#documentation pre{
margin-left: 20px;
overflow: auto;
}
#documentation img{
margin: 5px;
}
#symbol-index>ul{
list-style: none;
padding: 0;
}
#symbol-index .package>ul{
list-style: none;
padding: 0 0 0 10px;
}
#symbol-index .package .nicknames{
font-weight: normal;
}
#symbol-index .package h4{
display: inline-block;
margin: 0;
}
#symbol-index .package article{
margin: 0 0 15px 0;
}
#symbol-index .package article header{
font-size: 1.2em;
font-weight: normal;
}
#symbol-index .package .name{
margin-right: 5px;
}
#symbol-index .package .docstring{
margin: 0 0 0 15px;
white-space: pre-wrap;
font-size: 12pt;
}
@media (max-width: 800px){
body{font-size: 12pt;}
} </style> </head> <body> <header> <h1><img alt="clss" src="clss-logo.png"></h1> <span class="version">0.3.1</span> <p class="description">A DOM tree searching engine based on CSS selectors.</p> </header> <main> <article id="documentation"> <div><h2 id="about_clss">About CLSS</h2> <p>CLSS is a DOM traversal engine based on CSS selectors. It makes use of the <a href="https://shinmera.github.io/plump/">Plump-DOM</a> and is used by <a href="https://shinmera.github.io/lquery/">lQuery</a>.</p> <h2 id="how_to">How To</h2> <p>Load CLSS through Quicklisp or ASDF:</p> <pre><code>(ql:quickload :clss)
</code></pre> <p>Using a standard CSS selector you can retrieve a vector of nodes from the DOM:</p> <pre><code>(<a href="#CLSS:SELECT">clss:select</a> "img" (plump:parse "<div><p>A beautiful image: <img src="//example.com/image.png" alt="image" /></p></div>"))
</code></pre> <p>CLSS implements <a href="http://www.w3.org/TR/css3-selectors/">Level 3 selectors</a> and offers most of the features from the spec. Some things were left out as they make no sense outside a CSS context.
As Plump supports XML as well as HTML, it also includes special handling for a few nodes that are not elements and are thus not reachable by standard CSS selectors. In order to solve this problem, CLSS adds an extra operator, the <code>^</code> caret. The caret is followed by a Plump-DOM class-name and will then match any elements that conform to a <code><a href="http://l1sp.org/cl/typep">typep</a></code> test against it.</p> <pre><code>(<a href="#CLSS:SELECT">clss:select</a> "^CDATA" (plump:parse "<foo><![CDATA[bar]]></foo>"))
</code></pre> <p>CSS selectors in themselves also don't support XML namespaces due to the ambiguity arising with pseudo-selectors. CLSS solves this by interpreting a double colon as a name. Thus, a tag with the name of <code>foo:bar</code> is selected by <code>foo::bar</code>.</p> <p>CLSS attempts to be a fast engine and various parts of it have been tuned for this purpose, which limits the extensibility of CLSS a bit. However, it is still possible to f.e. programmatically construct a selector.</p> <h2 id="extending_clss">Extending CLSS</h2> <p>Using <code><a href="#CLSS:DEFINE-PSEUDO-SELECTOR">define-pseudo-selector</a></code> you can add your own extensions to CLSS:</p> <pre><code>(<a href="#CLSS:DEFINE-PSEUDO-SELECTOR">clss:define-pseudo-selector</a> outside-link (node)
(<a href="http://l1sp.org/cl/let">let</a> ((href (plump:attribute node "href")))
(<a href="http://l1sp.org/cl/and">and</a> href (cl-ppcre:scan "^(http|https)://" href))))
(<a href="#CLSS:SELECT">clss:select</a> "a:outside-link" (plump:parse "<foo><a href=\"/baloney\"/><a href=\"http://example.com\"/></foo>"))
</code></pre> </div> </article> <article id="copyright"> <h2>Copyright</h2> <span>clss</span> is licensed under the <span><a href="https://tldrlegal.com/search?q=Artistic">Artistic</a></span> license. © <span>Nicolas Hafner <[email protected]></span> . </article> <article id="symbol-index"> <h2>Package Index</h2> <ul><li class="package"> <h3> <a name="CLSS" href="#CLSS">CLSS</a> <span class="nicknames">(ORG.SHIRAKUMO.CLSS)</span> </h3> <ul><li> <a name="CLSS:PSEUDO-SELECTOR-NOT-AVAILABLE"> </a> <article id="CONDITION CLSS:PSEUDO-SELECTOR-NOT-AVAILABLE"> <header class="condition"> <span class="type">condition</span> <h4 class="name"><code><a href="#CONDITION%20CLSS%3APSEUDO-SELECTOR-NOT-AVAILABLE">PSEUDO-SELECTOR-NOT-AVAILABLE</a></code></h4> </header> <div class="docstring"><pre>Condition signalled when a pseudo selector is defined according to spec,
but makes no sense in the context of CLSS and has thus been left
unimplemented.</pre></div> </article> </li><li> <a name="CLSS:SELECTOR-MALFORMED"> </a> <article id="CONDITION CLSS:SELECTOR-MALFORMED"> <header class="condition"> <span class="type">condition</span> <h4 class="name"><code><a href="#CONDITION%20CLSS%3ASELECTOR-MALFORMED">SELECTOR-MALFORMED</a></code></h4> </header> <div class="docstring"><pre>Signalled when a selector or matcher has been found to be malformed.
This really shouldn't happen unless you're passing raw lists
for the selector to the matcher.</pre></div> </article> </li><li> <a name="CLSS:UNDEFINED-PSEUDO-SELECTOR"> </a> <article id="CONDITION CLSS:UNDEFINED-PSEUDO-SELECTOR"> <header class="condition"> <span class="type">condition</span> <h4 class="name"><code><a href="#CONDITION%20CLSS%3AUNDEFINED-PSEUDO-SELECTOR">UNDEFINED-PSEUDO-SELECTOR</a></code></h4> </header> <div class="docstring"><pre>Condition signalled when trying to use a pseudo selector that has not
been defined. This is signalled at match-time, rather than at
selector-compile-time.</pre></div> </article> </li><li> <a name="CLSS:NAME"> </a> <article id="ACCESSOR CLSS:NAME"> <header class="accessor"> <span class="type">accessor</span> <code>(</code><h4 class="name"><code><a href="#ACCESSOR%20CLSS%3ANAME">NAME</a></code></h4> <code class="qualifiers"></code> <code class="arguments">CONDITION</code><code>)</code> </header> <div class="docstring"><i>No docstring provided.</i></div> </article> </li><li> <a name="CLSS:PSEUDO-SELECTOR"> </a> <article id="ACCESSOR CLSS:PSEUDO-SELECTOR"> <header class="accessor"> <span class="type">accessor</span> <code>(</code><h4 class="name"><code><a href="#ACCESSOR%20CLSS%3APSEUDO-SELECTOR">PSEUDO-SELECTOR</a></code></h4> <code class="qualifiers"></code> <code class="arguments">NAME</code><code>)</code> </header> <div class="docstring"><pre>Returns the pseudo-selector function associated with NAME, if any.</pre></div> </article> </li><li> <a name="CLSS:SELECTOR"> </a> <article id="ACCESSOR CLSS:SELECTOR"> <header class="accessor"> <span class="type">accessor</span> <code>(</code><h4 class="name"><code><a href="#ACCESSOR%20CLSS%3ASELECTOR">SELECTOR</a></code></h4> <code class="qualifiers"></code> <code class="arguments">CONDITION</code><code>)</code> </header> <div class="docstring"><i>No docstring provided.</i></div> </article> </li><li> <a name="CLSS:MAKE-ANY-CONSTRAINT"> </a> <article id="FUNCTION CLSS:MAKE-ANY-CONSTRAINT"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMAKE-ANY-CONSTRAINT">MAKE-ANY-CONSTRAINT</a></code></h4> <code class="qualifiers"></code> <code class="arguments"></code><code>)</code> </header> <div class="docstring"><i>No docstring provided.</i></div> </article> </li><li> <a name="CLSS:MAKE-ATTRIBUTE-CONSTRAINT"> </a> <article id="FUNCTION CLSS:MAKE-ATTRIBUTE-CONSTRAINT"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMAKE-ATTRIBUTE-CONSTRAINT">MAKE-ATTRIBUTE-CONSTRAINT</a></code></h4> <code class="qualifiers"></code> <code class="arguments">ATTRIBUTE &OPTIONAL VALUE (COMPARATOR :=)</code><code>)</code> </header> <div class="docstring"><i>No docstring provided.</i></div> </article> </li><li> <a name="CLSS:MAKE-CLASS-CONSTRAINT"> </a> <article id="FUNCTION CLSS:MAKE-CLASS-CONSTRAINT"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMAKE-CLASS-CONSTRAINT">MAKE-CLASS-CONSTRAINT</a></code></h4> <code class="qualifiers"></code> <code class="arguments">CLASS</code><code>)</code> </header> <div class="docstring"><i>No docstring provided.</i></div> </article> </li><li> <a name="CLSS:MAKE-CLSS-MATCHER"> </a> <article id="FUNCTION CLSS:MAKE-CLSS-MATCHER"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMAKE-CLSS-MATCHER">MAKE-CLSS-MATCHER</a></code></h4> <code class="qualifiers"></code> <code class="arguments">&REST CONSTRAINTS</code><code>)</code> </header> <div class="docstring"><i>No docstring provided.</i></div> </article> </li><li> <a name="CLSS:MAKE-ID-CONSTRAINT"> </a> <article id="FUNCTION CLSS:MAKE-ID-CONSTRAINT"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMAKE-ID-CONSTRAINT">MAKE-ID-CONSTRAINT</a></code></h4> <code class="qualifiers"></code> <code class="arguments">ID</code><code>)</code> </header> <div class="docstring"><i>No docstring provided.</i></div> </article> </li><li> <a name="CLSS:MAKE-PSEUDO-CONSTRAINT"> </a> <article id="FUNCTION CLSS:MAKE-PSEUDO-CONSTRAINT"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMAKE-PSEUDO-CONSTRAINT">MAKE-PSEUDO-CONSTRAINT</a></code></h4> <code class="qualifiers"></code> <code class="arguments">FUNCTION &REST ARGS</code><code>)</code> </header> <div class="docstring"><i>No docstring provided.</i></div> </article> </li><li> <a name="CLSS:MAKE-SELECTOR"> </a> <article id="FUNCTION CLSS:MAKE-SELECTOR"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMAKE-SELECTOR">MAKE-SELECTOR</a></code></h4> <code class="qualifiers"></code> <code class="arguments">&REST GROUPS</code><code>)</code> </header> <div class="docstring"><i>No docstring provided.</i></div> </article> </li><li> <a name="CLSS:MAKE-TAG-CONSTRAINT"> </a> <article id="FUNCTION CLSS:MAKE-TAG-CONSTRAINT"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMAKE-TAG-CONSTRAINT">MAKE-TAG-CONSTRAINT</a></code></h4> <code class="qualifiers"></code> <code class="arguments">TAG</code><code>)</code> </header> <div class="docstring"><i>No docstring provided.</i></div> </article> </li><li> <a name="CLSS:MAKE-TYPE-CONSTRAINT"> </a> <article id="FUNCTION CLSS:MAKE-TYPE-CONSTRAINT"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMAKE-TYPE-CONSTRAINT">MAKE-TYPE-CONSTRAINT</a></code></h4> <code class="qualifiers"></code> <code class="arguments">NAME</code><code>)</code> </header> <div class="docstring"><i>No docstring provided.</i></div> </article> </li><li> <a name="CLSS:MATCH-CONSTRAINT"> </a> <article id="FUNCTION CLSS:MATCH-CONSTRAINT"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMATCH-CONSTRAINT">MATCH-CONSTRAINT</a></code></h4> <code class="qualifiers"></code> <code class="arguments">CONSTRAINT NODE</code><code>)</code> </header> <div class="docstring"><pre>Attempts to match the CONSTRAINT form against the node.
Returns NIL if it fails to do so, unspecified otherwise.</pre></div> </article> </li><li> <a name="CLSS:MATCH-GROUP"> </a> <article id="FUNCTION CLSS:MATCH-GROUP"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMATCH-GROUP">MATCH-GROUP</a></code></h4> <code class="qualifiers"></code> <code class="arguments">GROUP ROOT-NODE &OPTIONAL (SEARCH-TYPE :DEPTH-FIRST)</code><code>)</code> </header> <div class="docstring"><pre>Match a matcher group against the root-node and possibly all its children.
Returns an array of mached nodes.</pre></div> </article> </li><li> <a name="CLSS:MATCH-GROUP-BACKWARDS"> </a> <article id="FUNCTION CLSS:MATCH-GROUP-BACKWARDS"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMATCH-GROUP-BACKWARDS">MATCH-GROUP-BACKWARDS</a></code></h4> <code class="qualifiers"></code> <code class="arguments">GROUP NODE</code><code>)</code> </header> <div class="docstring"><i>No docstring provided.</i></div> </article> </li><li> <a name="CLSS:MATCH-MATCHER"> </a> <article id="FUNCTION CLSS:MATCH-MATCHER"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMATCH-MATCHER">MATCH-MATCHER</a></code></h4> <code class="qualifiers"></code> <code class="arguments">MATCHER NODE</code><code>)</code> </header> <div class="docstring"><pre>Attempts to match a matcher against a node.
Returns T if all constraints match, NIL otherwise.</pre></div> </article> </li><li> <a name="CLSS:MATCH-SELECTOR"> </a> <article id="FUNCTION CLSS:MATCH-SELECTOR"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AMATCH-SELECTOR">MATCH-SELECTOR</a></code></h4> <code class="qualifiers"></code> <code class="arguments">SELECTOR ROOT-NODE SEARCH-TYPE</code><code>)</code> </header> <div class="docstring"><pre>Match a selector against the root-node and possibly all its children.
Returns an array of matched nodes.</pre></div> </article> </li><li> <a name="CLSS:NODE-MATCHES-P"> </a> <article id="FUNCTION CLSS:NODE-MATCHES-P"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3ANODE-MATCHES-P">NODE-MATCHES-P</a></code></h4> <code class="qualifiers"></code> <code class="arguments">SELECTOR NODE</code><code>)</code> </header> <div class="docstring"><pre>Tests whether the node matches the selector.
SELECTOR --- A CSS-selector string or a compiled selector list.
NODE --- The node to test.</pre></div> </article> </li><li> <a name="CLSS:PARSE-SELECTOR"> </a> <article id="FUNCTION CLSS:PARSE-SELECTOR"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3APARSE-SELECTOR">PARSE-SELECTOR</a></code></h4> <code class="qualifiers"></code> <code class="arguments">STRING</code><code>)</code> </header> <div class="docstring"><pre>Parse a selector string into its "compiled" list form.</pre></div> </article> </li><li> <a name="CLSS:REMOVE-PSEUDO-SELECTOR"> </a> <article id="FUNCTION CLSS:REMOVE-PSEUDO-SELECTOR"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3AREMOVE-PSEUDO-SELECTOR">REMOVE-PSEUDO-SELECTOR</a></code></h4> <code class="qualifiers"></code> <code class="arguments">NAME</code><code>)</code> </header> <div class="docstring"><pre>Removes the pseudo-selector associated with NAME.</pre></div> </article> </li><li> <a name="CLSS:SELECT"> </a> <article id="FUNCTION CLSS:SELECT"> <header class="function"> <span class="type">function</span> <code>(</code><h4 class="name"><code><a href="#FUNCTION%20CLSS%3ASELECT">SELECT</a></code></h4> <code class="qualifiers"></code> <code class="arguments">SELECTOR ROOT-NODE &OPTIONAL (SEARCH-TYPE :DEPTH-FIRST)</code><code>)</code> </header> <div class="docstring"><pre>Match the given selector against the root-node and possibly all its children.
Returns an array of matched nodes.
SELECTOR --- A CSS-selector string or a compiled selector list.
ROOT-NODE --- A single node, list or vector of nodes to start matching from.
SEARCH-TYPE --- Select the search algorithm, options are ":depth-first" and ":breadth-first".</pre></div> </article> </li><li> <a name="CLSS:DEFINE-PSEUDO-SELECTOR"> </a> <article id="MACRO CLSS:DEFINE-PSEUDO-SELECTOR"> <header class="macro"> <span class="type">macro</span> <code>(</code><h4 class="name"><code><a href="#MACRO%20CLSS%3ADEFINE-PSEUDO-SELECTOR">DEFINE-PSEUDO-SELECTOR</a></code></h4> <code class="qualifiers"></code> <code class="arguments">NAME (NODENAME &REST ARGS-LAMBDA) &BODY BODY</code><code>)</code> </header> <div class="docstring"><pre>Define a new pseudo-selector of NAME.
NAME --- A symbol or string naming the selector (case insensitive always).
NODENAME --- A variable symbol the matched node is bound to.
ARGS-LAMBDA --- A lambda-list of the expected arguments for the pseudo-selector.
Note that keyword arguments make no sense in this context.
BODY ::= form*</pre></div> </article> </li></ul> </li></ul> </article> </main> </body> </html>