]> git.draconx.ca Git - homepage.git/blob - lib/scss-var.rb
cdecl99-1.3 bash-5 hotfix
[homepage.git] / lib / scss-var.rb
1 # Nick's web site: Helper to retrieve global style variables in ruby.
2 #
3 # Copyright © 2020, 2022 Nick Bowler
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
17
18 require 'sass'
19
20 class GetSCSSGlobals < Sass::Tree::Visitors::Perform
21     def self.visit(root, name = nil)
22         x = new(nil)
23         x.send(:visit, root)
24         result = x.instance_variable_get(:@globals)
25         return result.freeze if name.nil?
26
27         x.send(:rubify_result, result[name])
28     end
29
30     protected
31
32     def initialize(environment)
33         @globals = {}
34         @globals.default_proc = proc { |h, k|
35             if h.key? k.to_s then h[k.to_s] end }
36         super
37     end
38
39     def visit_variable(node)
40         super
41
42         x = @environment.global_env.var(node.name)
43         @globals[node.name] = x unless x.nil?
44     end
45
46     # Convert SASS maps and lists to ruby equivalents that are actually usable.
47     def rubify_result(val)
48         case val
49         when Sass::Script::Value::Map
50             val.to_h.each_with_object({}) do |(k, v), h|
51                 h[k.to_s.to_sym] = rubify_result(v)
52             end
53         when Sass::Script::Value::List
54             val.to_a.map { |v| rubify_result(v) }
55         else
56             val
57         end
58     end
59 end
60
61 def scss_get_var(variable, item = @items["/style.scss"])
62     engine = Sass::Engine.for_file(item.raw_filename, {
63         :syntax => :scss,
64         :load_paths => ["."],
65     })
66     return GetSCSSGlobals.visit(engine.to_tree, variable)
67 end
68
69 def scss_get_colour(colour, index = 0, item = @items["/style.scss"])
70     cmap = scss_get_var(:colourmap, item);
71     [cmap[colour]].flatten[index]
72 end