poe-css 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +186 -0
  4. data/.ruby-version +1 -0
  5. data/CONTRIBUTING.md +85 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +105 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +275 -0
  10. data/Rakefile +10 -0
  11. data/bin/poe-css +14 -0
  12. data/demo/Gemfile +11 -0
  13. data/demo/Gemfile.lock +45 -0
  14. data/demo/app.rb +21 -0
  15. data/demo/views/index.haml +105 -0
  16. data/lib/dependencies.rb +11 -0
  17. data/lib/poe-css.rb +253 -0
  18. data/lib/poe-css/generator.rb +108 -0
  19. data/lib/poe-css/parser.rb +177 -0
  20. data/lib/poe-css/preprocessor.rb +186 -0
  21. data/lib/poe-css/simplifier.rb +201 -0
  22. data/lib/poe-css/version.rb +5 -0
  23. data/poe-css.gemspec +32 -0
  24. data/tests/poecss/all-clauses-1.output +23 -0
  25. data/tests/poecss/all-clauses-1.poecss +24 -0
  26. data/tests/poecss/alternation-1.output +8 -0
  27. data/tests/poecss/alternation-1.poecss +4 -0
  28. data/tests/poecss/nesting-1.output +8 -0
  29. data/tests/poecss/nesting-1.poecss +8 -0
  30. data/tests/poecss/nesting-2.output +30 -0
  31. data/tests/poecss/nesting-2.poecss +23 -0
  32. data/tests/poecss/nesting-3.output +15 -0
  33. data/tests/poecss/nesting-3.poecss +15 -0
  34. data/tests/poecss/nesting-4.output +14 -0
  35. data/tests/poecss/nesting-4.poecss +13 -0
  36. data/tests/poecss/performance-1.output +3 -0
  37. data/tests/poecss/performance-1.poecss +59 -0
  38. data/tests/poecss/performance-2.output +60 -0
  39. data/tests/poecss/performance-2.poecss +75 -0
  40. data/tests/poecss/rule-ordering-1.output +25 -0
  41. data/tests/poecss/rule-ordering-1.poecss +30 -0
  42. data/tests/poecss/rule-ordering-2.output +3 -0
  43. data/tests/poecss/rule-ordering-2.poecss +29 -0
  44. data/tests/poecss/rule-ordering-3.output +30 -0
  45. data/tests/poecss/rule-ordering-3.poecss +29 -0
  46. data/tests/poecss/rule-ordering-4.output +20 -0
  47. data/tests/poecss/rule-ordering-4.poecss +30 -0
  48. data/tests/poecss/rule-ordering-5.output +8 -0
  49. data/tests/poecss/rule-ordering-5.poecss +9 -0
  50. data/tests/poecss/rule-ordering-6.output +7 -0
  51. data/tests/poecss/rule-ordering-6.poecss +14 -0
  52. data/tests/poecss/simple-1.output +7 -0
  53. data/tests/poecss/simple-1.poecss +8 -0
  54. data/tests/poecss/simplification-1.output +6 -0
  55. data/tests/poecss/simplification-1.poecss +7 -0
  56. data/tests/poecss/simplification-2.output +6 -0
  57. data/tests/poecss/simplification-2.poecss +8 -0
  58. data/tests/poecss/simplification-3.output +2 -0
  59. data/tests/poecss/simplification-3.poecss +3 -0
  60. data/tests/poecss/simplification-4.output +3 -0
  61. data/tests/poecss/simplification-4.poecss +4 -0
  62. data/tests/poecss/simplification-5.output +3 -0
  63. data/tests/poecss/simplification-5.poecss +8 -0
  64. data/tests/poecss/simplification-6.output +2 -0
  65. data/tests/poecss/simplification-6.poecss +4 -0
  66. data/tests/preprocessor/arity-mismatch-1.error.preprocessor +4 -0
  67. data/tests/preprocessor/arity-mismatch-2.error.preprocessor +4 -0
  68. data/tests/preprocessor/complex.output +20 -0
  69. data/tests/preprocessor/complex.preprocessor +19 -0
  70. data/tests/preprocessor/empty.output +0 -0
  71. data/tests/preprocessor/empty.preprocessor +0 -0
  72. data/tests/preprocessor/macro-newlines.output +5 -0
  73. data/tests/preprocessor/macro-newlines.preprocessor +9 -0
  74. data/tests/preprocessor/macro.output +3 -0
  75. data/tests/preprocessor/macro.preprocessor +7 -0
  76. data/tests/preprocessor/missing-identifier-1.error.preprocessor +1 -0
  77. data/tests/preprocessor/missing-identifier-2.error.preprocessor +1 -0
  78. data/tests/preprocessor/normal-newlines.output +2 -0
  79. data/tests/preprocessor/normal-newlines.preprocessor +2 -0
  80. data/tests/preprocessor/parse-error-1.error.preprocessor +1 -0
  81. data/tests/preprocessor/parse-error-2.error.preprocessor +1 -0
  82. data/tests/preprocessor/parse-error-3.error.preprocessor +4 -0
  83. data/tests/preprocessor/simple.output +1 -0
  84. data/tests/preprocessor/simple.preprocessor +3 -0
  85. data/tests/run-all-tests.rb +60 -0
  86. data/tests/unit/simplify-bounds-test.rb +57 -0
  87. data/tests/unit/stricter-query-test.rb +24 -0
  88. metadata +292 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2b354fe9096a347a375766d95be283aa4a8bc756
4
+ data.tar.gz: f5881993fa54ab9a20cb8b59e5d1cc05af2b720f
5
+ SHA512:
6
+ metadata.gz: ca625c6f6361c2248aaf62df0613c9860722d45b0837e5fe376af61c0fe2ef39c393058840d88a529f71b55b6ad6ca5f72a099ecd908799cab70983ea5324148
7
+ data.tar.gz: 5fba14481d64fc611b19ef0c5e47c966382a1fb3b7e5b58b45f73b9a8df74266ed566e63706f2299125c76540528d3b1298d83f012fda91b37426dc4c76f6508
@@ -0,0 +1,2 @@
1
+ .rubocop-cache
2
+ pkg
@@ -0,0 +1,186 @@
1
+ AllCops:
2
+ CacheRootDirectory: .rubocop-cache
3
+ TargetRubyVersion: 2.4.2
4
+
5
+ Layout/AlignParameters:
6
+ EnforcedStyle: with_fixed_indentation
7
+
8
+ Layout/EmptyLinesAroundArguments:
9
+ Enabled: false
10
+
11
+ Layout/FirstArrayElementLineBreak:
12
+ Enabled: true
13
+
14
+ Layout/FirstHashElementLineBreak:
15
+ Enabled: true
16
+
17
+ Layout/FirstMethodArgumentLineBreak:
18
+ Enabled: true
19
+
20
+ Layout/FirstMethodParameterLineBreak:
21
+ Enabled: true
22
+
23
+ Layout/IndentArray:
24
+ EnforcedStyle: consistent
25
+
26
+ Layout/IndentHash:
27
+ EnforcedStyle: consistent
28
+
29
+ Layout/MultilineMethodCallIndentation:
30
+ EnforcedStyle: indented
31
+
32
+ Layout/MultilineOperationIndentation:
33
+ EnforcedStyle: indented
34
+
35
+ Layout/SpaceAroundEqualsInParameterDefault:
36
+ EnforcedStyle: no_space
37
+
38
+ Layout/SpaceAroundOperators:
39
+ AllowForAlignment: false
40
+
41
+ Layout/SpaceBeforeBlockBraces:
42
+ EnforcedStyleForEmptyBraces: space
43
+ EnforcedStyle: space
44
+
45
+ Layout/SpaceInsideArrayLiteralBrackets:
46
+ Enabled: true
47
+ EnforcedStyle: space
48
+
49
+ Layout/SpaceInsideHashLiteralBraces:
50
+ EnforcedStyle: space
51
+
52
+ Lint/AssignmentInCondition:
53
+ AllowSafeAssignment: true
54
+
55
+ Metrics/AbcSize:
56
+ Enabled: false
57
+
58
+ Metrics/BlockLength:
59
+ Enabled: false
60
+
61
+ Metrics/BlockNesting:
62
+ Enabled: false
63
+
64
+ Metrics/ClassLength:
65
+ Enabled: false
66
+
67
+ Metrics/CyclomaticComplexity:
68
+ Enabled: false
69
+
70
+ Metrics/LineLength:
71
+ Max: 150
72
+
73
+ Metrics/MethodLength:
74
+ Enabled: false
75
+
76
+ Metrics/ModuleLength:
77
+ Enabled: false
78
+
79
+ Metrics/ParameterLists:
80
+ Enabled: false
81
+
82
+ Metrics/PerceivedComplexity:
83
+ Enabled: false
84
+
85
+ Naming/FileName:
86
+ Enabled: false
87
+
88
+ Naming/VariableNumber:
89
+ Enabled: false
90
+
91
+ Performance/Casecmp:
92
+ Enabled: false
93
+
94
+ Performance/Count:
95
+ SafeMode: false
96
+
97
+ Performance/Detect:
98
+ SafeMode: false
99
+
100
+ Style/Alias:
101
+ EnforcedStyle: prefer_alias_method
102
+
103
+ Style/AsciiComments:
104
+ Enabled: false
105
+
106
+ Style/AutoResourceCleanup:
107
+ Enabled: true
108
+
109
+ Style/BlockDelimiters:
110
+ Enabled: false
111
+
112
+ Style/BracesAroundHashParameters:
113
+ Enabled: false
114
+
115
+ Style/CollectionMethods:
116
+ PreferredMethods:
117
+ detect: find
118
+
119
+ Style/CommentAnnotation:
120
+ Enabled: false
121
+
122
+ Style/Documentation:
123
+ Enabled: false
124
+
125
+ Style/DoubleNegation:
126
+ Enabled: false
127
+
128
+ Style/FormatStringToken:
129
+ Enabled: false
130
+
131
+ Style/GuardClause:
132
+ Enabled: false
133
+
134
+ Style/IfUnlessModifier:
135
+ Enabled: false
136
+
137
+ Style/InverseMethods:
138
+ Enabled: false
139
+
140
+ Style/MethodCallWithoutArgsParentheses:
141
+ Enabled: false
142
+
143
+ Style/MultilineBlockChain:
144
+ Enabled: false
145
+
146
+ Style/MutableConstant:
147
+ Enabled: false
148
+
149
+ Style/NegatedIf:
150
+ Enabled: false
151
+
152
+ Style/NegatedWhile:
153
+ Enabled: false
154
+
155
+ Style/Next:
156
+ Enabled: false
157
+
158
+ Style/NumericPredicate:
159
+ EnforcedStyle: comparison
160
+
161
+ Style/OptionHash:
162
+ Enabled: false
163
+
164
+ Style/SignalException:
165
+ Enabled: false
166
+
167
+ Style/SingleLineBlockParams:
168
+ Enabled: false
169
+
170
+ Style/StringMethods:
171
+ Enabled: true
172
+
173
+ Style/SymbolArray:
174
+ Enabled: true
175
+
176
+ Style/TernaryParentheses:
177
+ Enabled: false
178
+
179
+ Style/TrailingCommaInArguments:
180
+ EnforcedStyleForMultiline: no_comma
181
+
182
+ Style/TrailingCommaInLiteral:
183
+ EnforcedStyleForMultiline: no_comma
184
+
185
+ Style/WhileUntilModifier:
186
+ Enabled: false
@@ -0,0 +1 @@
1
+ 2.4.2
@@ -0,0 +1,85 @@
1
+ # Contributing
2
+
3
+ When contributing to this repository, please first discuss the change you wish to make via issue,
4
+ email, or any other method with the owners of this repository before making a change.
5
+
6
+ Please note we have a code of conduct. Please follow it in all your interactions with the project.
7
+
8
+ ## Pull Request Process
9
+
10
+ Before merging, ensure that tests are passing (`bundle exec rake`) and that Rubocop is happy (`bundle exec rubocop`). If you are adding new features, please make sure they are tested.
11
+
12
+ ## Code of Conduct
13
+
14
+ ### Our Pledge
15
+
16
+ In the interest of fostering an open and welcoming environment, we as
17
+ contributors and maintainers pledge to making participation in our project and
18
+ our community a harassment-free experience for everyone, regardless of age, body
19
+ size, disability, ethnicity, gender identity and expression, level of experience,
20
+ nationality, personal appearance, race, religion, or sexual identity and
21
+ orientation.
22
+
23
+ ### Our Standards
24
+
25
+ Examples of behavior that contributes to creating a positive environment
26
+ include:
27
+
28
+ * Using welcoming and inclusive language
29
+ * Being respectful of differing viewpoints and experiences
30
+ * Gracefully accepting constructive criticism
31
+ * Focusing on what is best for the community
32
+ * Showing empathy towards other community members
33
+
34
+ Examples of unacceptable behavior by participants include:
35
+
36
+ * The use of sexualized language or imagery and unwelcome sexual attention or
37
+ advances
38
+ * Trolling, insulting/derogatory comments, and personal or political attacks
39
+ * Public or private harassment
40
+ * Publishing others' private information, such as a physical or electronic
41
+ address, without explicit permission
42
+ * Other conduct which could reasonably be considered inappropriate in a
43
+ professional setting
44
+
45
+ ### Our Responsibilities
46
+
47
+ Project maintainers are responsible for clarifying the standards of acceptable
48
+ behavior and are expected to take appropriate and fair corrective action in
49
+ response to any instances of unacceptable behavior.
50
+
51
+ Project maintainers have the right and responsibility to remove, edit, or
52
+ reject comments, commits, code, wiki edits, issues, and other contributions
53
+ that are not aligned to this Code of Conduct, or to ban temporarily or
54
+ permanently any contributor for other behaviors that they deem inappropriate,
55
+ threatening, offensive, or harmful.
56
+
57
+ ### Scope
58
+
59
+ This Code of Conduct applies both within project spaces and in public spaces
60
+ when an individual is representing the project or its community. Examples of
61
+ representing a project or community include using an official project e-mail
62
+ address, posting via an official social media account, or acting as an appointed
63
+ representative at an online or offline event. Representation of a project may be
64
+ further defined and clarified by project maintainers.
65
+
66
+ ### Enforcement
67
+
68
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
69
+ reported by contacting alexhquach@gmail.com. All complaints will be reviewed
70
+ and investigated and will result in a response that is deemed necessary and
71
+ appropriate to the circumstances. The project team is obligated to maintain
72
+ confidentiality with regard to the reporter of an incident. Further details of
73
+ specific enforcement policies may be posted separately.
74
+
75
+ Project maintainers who do not follow or enforce the Code of Conduct in good
76
+ faith may face temporary or permanent repercussions as determined by other
77
+ members of the project's leadership.
78
+
79
+ ### Attribution
80
+
81
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
82
+ available at [http://contributor-covenant.org/version/1/4][version]
83
+
84
+ [homepage]: http://contributor-covenant.org
85
+ [version]: http://contributor-covenant.org/version/1/4/
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ ruby '2.4.2'
4
+
5
+ gemspec
@@ -0,0 +1,105 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ poe-css (0.0.1)
5
+ parslet
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ ansi (1.5.0)
11
+ ast (2.3.0)
12
+ binding.repl (3.0.0)
13
+ builder (3.2.3)
14
+ cd (1.0.1)
15
+ clipboard (1.1.1)
16
+ code (0.9.2)
17
+ coderay (~> 1.1)
18
+ method_source (~> 0.9)
19
+ coderay (1.1.2)
20
+ debugging (1.1.1)
21
+ binding.repl (~> 3.0)
22
+ paint (>= 0.9, < 3.0)
23
+ every_day_irb (2.0.0)
24
+ cd (~> 1.0)
25
+ fancy_irb (1.1.0)
26
+ paint (>= 0.9, < 3.0)
27
+ unicode-display_width (~> 1.1)
28
+ ffi (1.9.18)
29
+ hirb (0.7.3)
30
+ instance (0.2.0)
31
+ interactive_editor (0.0.10)
32
+ spoon (>= 0.0.1)
33
+ irbtools (2.1.0)
34
+ binding.repl (~> 3.0)
35
+ clipboard (~> 1.1)
36
+ code (~> 0.9)
37
+ coderay (~> 1.1)
38
+ debugging (~> 1.1)
39
+ every_day_irb (~> 2.0)
40
+ fancy_irb (~> 1.1)
41
+ hirb (~> 0.7, >= 0.7.3)
42
+ instance (~> 0.2)
43
+ interactive_editor (~> 0.0, >= 0.0.10)
44
+ method_locator (~> 0.0, >= 0.0.4)
45
+ methodfinder (~> 2.0)
46
+ ori (~> 0.1.0)
47
+ os (~> 1.0)
48
+ paint (>= 0.9, < 3.0)
49
+ ruby_engine (~> 1.0)
50
+ ruby_info (~> 1.0)
51
+ ruby_version (~> 1.0)
52
+ wirb (~> 2.0)
53
+ method_locator (0.0.4)
54
+ method_source (0.9.0)
55
+ methodfinder (2.1.0)
56
+ minitest (5.10.3)
57
+ minitest-reporters (1.1.18)
58
+ ansi
59
+ builder
60
+ minitest (>= 5.0)
61
+ ruby-progressbar
62
+ ori (0.1.0)
63
+ os (1.0.0)
64
+ paint (1.0.1)
65
+ parallel (1.12.1)
66
+ parser (2.4.0.2)
67
+ ast (~> 2.3)
68
+ parslet (1.8.1)
69
+ powerpack (0.1.1)
70
+ rainbow (3.0.0)
71
+ rake (10.5.0)
72
+ rubocop (0.52.0)
73
+ parallel (~> 1.10)
74
+ parser (>= 2.4.0.2, < 3.0)
75
+ powerpack (~> 0.1)
76
+ rainbow (>= 2.2.2, < 4.0)
77
+ ruby-progressbar (~> 1.7)
78
+ unicode-display_width (~> 1.0, >= 1.0.1)
79
+ ruby-progressbar (1.9.0)
80
+ ruby_engine (1.0.1)
81
+ ruby_info (1.0.1)
82
+ ruby_version (1.0.1)
83
+ spoon (0.0.6)
84
+ ffi
85
+ unicode-display_width (1.3.0)
86
+ wirb (2.1.1)
87
+ paint (>= 0.9, < 3.0)
88
+
89
+ PLATFORMS
90
+ ruby
91
+
92
+ DEPENDENCIES
93
+ bundler (~> 1.14)
94
+ irbtools
95
+ minitest
96
+ minitest-reporters
97
+ poe-css!
98
+ rake (~> 10.0)
99
+ rubocop
100
+
101
+ RUBY VERSION
102
+ ruby 2.4.2p198
103
+
104
+ BUNDLED WITH
105
+ 1.15.3
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 Alex Quach
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
22
+
@@ -0,0 +1,275 @@
1
+ # PoE CSS
2
+
3
+ A better way to write item filters for Path of Exile.
4
+
5
+ Example:
6
+
7
+ ```
8
+ @black: RGB(0, 0, 0)
9
+ @white: RGB(255, 255, 255)
10
+
11
+ @t1-gem-text-color: RGB(30, 200, 200)
12
+ @t1-gem-border-color: RGB(30, 150, 180)
13
+ @t1-gem-bg-color: @white
14
+
15
+ @volume: 300
16
+ @t1-drop-sound: 6 @volume
17
+ @unique-drop-sound: 3 @volume
18
+ @value-drop-sound: 2 @volume
19
+
20
+ @gem-styling() {
21
+ SetTextColor @t1-gem-text-color
22
+ SetBorderColor @t1-gem-border-color
23
+ }
24
+
25
+ Class Gems {
26
+ Hide
27
+ SetFontSize 36
28
+ SetBorderColor @black
29
+
30
+ Quality >= 1 {
31
+ Show
32
+ SetFontSize 40
33
+ SetBorderColor @t1-gem-border-color
34
+ }
35
+
36
+ BaseType "Detonate Mines" "Added Chaos Damage" "Vaal" "Enhance" | Quality >= 14 {
37
+ Show
38
+ SetFontSize 40
39
+ @gem-styling()
40
+ PlayAlertSound @value-drop-sound
41
+ }
42
+
43
+ BaseType "Portal" "Empower" "Enlighten" "Vaal Haste" "Vaal Grace" "Item Quantity" "Vaal Breach" {
44
+ Show
45
+ SetFontSize 45
46
+ @gem-styling()
47
+ PlayAlertSound @unique-drop-sound
48
+ }
49
+ }
50
+ ```
51
+
52
+ Via the website or the command line tool, filters written in PoE CSS can be
53
+ transpiled into the native item filter language and plugged right into Path of
54
+ Exile.
55
+
56
+ ### Features
57
+
58
+ * CSS-style semantics: multiple clauses can match any item, rather than just the first match in the base filter language.
59
+ * Constants
60
+ * Macro expansion
61
+ * Nested and OR matches
62
+
63
+ ## Getting Started
64
+
65
+ `poe-css` is available online at LINK and as a command line utility. Both
66
+ transform PoE CSS filters into standard item filters that can be plugged into
67
+ Path of Exile. **PoE CSS filters are not directly compatible with Path of Exile**.
68
+ Below are instructions for installing the command line tool.
69
+
70
+ ## Syntax
71
+
72
+ It's likely easiest to get a sense of the syntax by looking at the example
73
+ above. It should be familiar to anyone comfortable with Path of Exile's item
74
+ filter language as well as people comfortable with CSS/LESS/SASS.
75
+
76
+ First, everything in PoE CSS is case-insensitive.
77
+
78
+ A PoE CSS file is a list of clauses. A clause generally looks like this:
79
+
80
+ ```
81
+ <list of matches, comma separated> {
82
+ <commands>
83
+ }
84
+ ```
85
+
86
+ For example,
87
+
88
+ ```
89
+ ItemLevel >= 25 {
90
+ Show
91
+ SetFontSize 16
92
+ }
93
+ ```
94
+
95
+ This clause will style any item whose item level is greater than or equal to
96
+ 25. To see all possible conditions and styles, check out the [item filter
97
+ wiki](https://pathofexile.gamepedia.com/Item_filter). It's missing a few new
98
+ matches like ShapedItem though.
99
+
100
+ **To combine conditions so that all must match, use a comma**:
101
+
102
+ ```
103
+ ItemLevel >= 25, Rarity Unique {
104
+ Show
105
+ SetFontSize 24
106
+ }
107
+ ```
108
+
109
+ **Differently from the base item filter language, multiple clauses can match any
110
+ item, just like CSS.** To get an item's final style, PoE CSS finds all clauses
111
+ that match the given item, then combines all of their respective styles. Later
112
+ properties override earlier properties, so later clauses are generally more powerful than earlier clauses.
113
+
114
+ ```
115
+ ItemLevel >= 25 {
116
+ Show
117
+ SetFontSize 25
118
+ SetBackgroundColor RGB(0, 255, 0)
119
+ }
120
+
121
+ Rarity Unique {
122
+ Show
123
+ SetBackgroundColor RGB(255, 0, 0)
124
+ }
125
+ ```
126
+
127
+ ilvl >= 25 items that are not unique will have the font size change and a green
128
+ background. Unique items will have a red background. ilvl >= 25 items that are
129
+ also unique will have the font size change and a red background.
130
+
131
+ This solves a common pain point with item filters, which is that adding new
132
+ clauses is very difficult and often accidentally overrides later styles.
133
+
134
+ To match one of many conditions (OR), **use `|`**:
135
+
136
+ ```
137
+ ItemLevel >= 25 | Rarity Unique {
138
+ Show
139
+ SetFontSize 24
140
+ }
141
+ ```
142
+
143
+ This is identical to writing it out long form.
144
+
145
+ ```
146
+ ItemLevel >= 25 {
147
+ Show
148
+ SetFontSize 24
149
+ }
150
+
151
+ Rarity Unique {
152
+ Show
153
+ SetFontSize 24
154
+ }
155
+ ```
156
+
157
+ **Nested clauses** are considered to be restrictions on the parent clause.
158
+
159
+ ```
160
+ ItemLevel >= 25 {
161
+ Show
162
+ SetFontSize 24
163
+
164
+ Rarity Unique {
165
+ Show
166
+ SetBackgroundColor RGB(255, 0, 0)
167
+ }
168
+ }
169
+ ```
170
+
171
+ In this filter, items with ilvl >= 25 will have font size 24, and items with ilvl >= 25 and are unique will have a red background color.
172
+
173
+ Nested clauses are useful when you'd like to work within a certain constraint without repeating yourself.
174
+
175
+ ```
176
+ Class "Bows" {
177
+ # All clauses in here will only match bows.
178
+
179
+ Show
180
+
181
+ ItemLevel >= 65 { SetFontSize 13 }
182
+ ItemLevel >= 70 { SetFontSize 14 }
183
+ ItemLevel >= 75 { SetFontSize 15 }
184
+ }
185
+ ```
186
+
187
+ You can **define a constant with `@`**. Constants can only be defined once.
188
+
189
+ ```
190
+ @rare-color: RGB(255, 255, 119)
191
+
192
+ Rarity Rare {
193
+ SetFontColor @rare-color
194
+ }
195
+ ```
196
+
197
+ Constants are substituted with naive string substitution. This means anything can be made a constant.
198
+
199
+ ```
200
+ @sfc: SetFontColor
201
+
202
+ Rarity Rare {
203
+ @sfc RGB(255, 0, 0)
204
+ }
205
+ ```
206
+
207
+ **For multi-line substitutions or substitutions with variables, you can define macros.**
208
+
209
+ ```
210
+ @ilvl-scaled() {
211
+ ItemLevel >= 65 { Show; SetFontSize 13 }
212
+ ItemLevel >= 70 { Show; SetFontSize 14 }
213
+ ItemLevel >= 75 { Show; SetFontSize 15 }
214
+ }
215
+
216
+ Class "Bows" {
217
+ Show
218
+ @ilvl-scaled()
219
+ }
220
+
221
+ Class "Maces" {
222
+ Show
223
+ @ilvl-scaled()
224
+ }
225
+ ```
226
+
227
+ Macros can have arguments:
228
+
229
+ ```
230
+ @hide-under(@ilvl) {
231
+ ItemLevel < @ilvl {
232
+ Hide
233
+ }
234
+ }
235
+
236
+ Class Shield {
237
+ @hide-under(25)
238
+ }
239
+ ```
240
+
241
+ Finally, you can write comments with `#`. Anything after `#` and the `#` will be ignored.
242
+
243
+ ## Prerequisites
244
+
245
+ Ruby >= 2 is necessary to install the command line tool. If you have that, just run `gem install poe-css` and then `poe-css <input file>`.
246
+
247
+ ## Running the tests
248
+
249
+ `bundle exec rake`
250
+
251
+ ## Built With
252
+
253
+ * [Parslet](https://kschiess.github.io/parslet/) - Ruby PEG Parser
254
+
255
+ ## Contributing
256
+
257
+ Please read
258
+ [CONTRIBUTING.md](https://github.com/aquach/poe-css/blob/master/CONTRIBUTING.md)
259
+ for details on our code of conduct, and the process for submitting pull
260
+ requests to us.
261
+
262
+ ## Versioning
263
+
264
+ We use [SemVer](http://semver.org/) for versioning. For the versions available,
265
+ see the [tags on this repository](https://github.com/aquach/poe-css/tags).
266
+
267
+ ## Authors
268
+
269
+ * **Alex Quach** - *Initial work* - [aquach](https://github.com/aquach)
270
+
271
+ See also the list of [contributors](https://github.com/your/project/contributors) who participated in this project.
272
+
273
+ ## License
274
+
275
+ This project is licensed under the MIT License - see the [LICENSE.txt](LICENSE.txt) file for details