]> gitweb.factorcode.org Git - factor.git/blob - basis/xmode/rules/rules.factor
factor: trim using lists
[factor.git] / basis / xmode / rules / rules.factor
1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs kernel regexp sequences unicode
4 xmode.keyword-map ;
5 IN: xmode.rules
6
7 TUPLE: string-matcher string ignore-case? ;
8
9 C: <string-matcher> string-matcher
10
11 ! Based on org.gjt.sp.jedit.syntax.ParserRuleSet
12 TUPLE: rule-set
13 name
14 props
15 keywords
16 rules
17 imports
18 terminate-char
19 ignore-case?
20 default
21 escape-rule
22 highlight-digits?
23 digit-re
24 no-word-sep
25 finalized?
26 ;
27
28 : <rule-set> ( -- ruleset )
29     rule-set new
30         H{ } clone >>rules
31         H{ } clone >>props
32         V{ } clone >>imports ;
33
34 MEMO: standard-rule-set ( id -- ruleset )
35     <rule-set> swap >>default ;
36
37 : import-rule-set ( import ruleset -- )
38     imports>> push ;
39
40 : inverted-index ( hashes key index -- )
41     [ swapd push-at ] 2curry each ;
42
43 : ?push-all ( seq1 seq2 -- seq1+seq2 )
44     [
45         over [ [ V{ } like ] dip append! ] [ nip ] if
46     ] when* ;
47
48 : rule-set-no-word-sep* ( ruleset -- str )
49     [ no-word-sep>> ]
50     [ keywords>> ] bi
51     dup [ keyword-map-no-word-sep* ] when
52     "_" 3append ;
53
54 ! Match restrictions
55 TUPLE: matcher text at-line-start? at-whitespace-end? at-word-start? ;
56
57 C: <matcher> matcher
58
59 ! Based on org.gjt.sp.jedit.syntax.ParserRule
60 TUPLE: rule
61 no-line-break?
62 no-word-break?
63 no-escape?
64 start
65 end
66 match-token
67 body-token
68 delegate
69 chars
70 ;
71
72 TUPLE: seq-rule < rule ;
73
74 TUPLE: span-rule < rule ;
75
76 TUPLE: eol-span-rule < rule ;
77
78 : init-span ( rule -- )
79     dup delegate>> [ drop ] [
80         dup body-token>> standard-rule-set
81         swap delegate<<
82     ] if ;
83
84 : init-eol-span ( rule -- )
85     dup init-span
86     t >>no-line-break? drop ;
87
88 TUPLE: mark-following-rule < rule ;
89
90 TUPLE: mark-previous-rule < rule ;
91
92 TUPLE: escape-rule < rule ;
93
94 : <escape-rule> ( string -- rule )
95     f <string-matcher> f f f <matcher>
96     escape-rule new swap >>start ;
97
98 GENERIC: text-hash-char ( text -- ch )
99
100 M: f text-hash-char ;
101
102 M: string-matcher text-hash-char string>> first ;
103
104 M: regexp text-hash-char drop f ;
105
106 : rule-chars* ( rule -- string )
107     [ chars>> ] [ start>> ] bi text>>
108     text-hash-char [ suffix ] when* ;
109
110 : add-rule ( rule ruleset -- )
111     [ dup rule-chars* >upper swap ] dip rules>> inverted-index ;
112
113 : add-escape-rule ( string ruleset -- )
114     over [
115         [ <escape-rule> ] dip
116         2dup escape-rule<<
117         add-rule
118     ] [
119         2drop
120     ] if ;