module ThemePaintRules
ThemePaintRules โ build theme paint_rules from registered PaintSamples. Public: first_block_pos, irc_card_rules, merge_for_palette Depends: IrcPaint, PaintSamples Tests: test/lib/theme_paint_rules_test.rb
Public Instance Methods
Source
# File lib/theme_paint_rules.rb, line 56 def auto_rules(plugin:, palette:) lines = PaintSamples.lines(plugin) return [] unless lines && !lines.empty? rules = [] lines.each_with_index do |line, idx| line_num = idx + 1 IrcPaint.segments(line).each do |segment| role = classify_segment(segment[:text], line_num: line_num, total_lines: lines.length) next unless role rule = { plugin: plugin.to_s, line: line_num, pos: segment[:plain_start], fg: role_fg(role, palette) } bg = role_bg(role, palette) rule[:bg] = bg if bg rules << rule end end dedupe_rules(rules) end
Source
# File lib/theme_paint_rules.rb, line 76 def classify_segment(text, line_num:, total_lines:) plain = text.to_s return :tag if plain.include?("ยซ") || plain.include?("ยป") return :title if plain.include?("-=//") || plain.include?("\\=-") return :footer if line_num == total_lines && plain.start_with?("(") nil end
Source
# File lib/theme_paint_rules.rb, line 98 def dedupe_rules(rules) rules.uniq { |rule| [rule[:plugin], rule[:line], rule[:pos]] } end
Source
# File lib/theme_paint_rules.rb, line 14 def first_block_pos(line) segment = IrcPaint.segments(line).first segment ? segment[:plain_start] : nil end
Source
# File lib/theme_paint_rules.rb, line 19 def irc_card_rules(plugin:, title_fg:, title_bg: nil, tag_fg: nil, tag_bg: nil, footer_fg: nil, footer_bg: nil) lines = PaintSamples.lines(plugin) return [] unless lines && !lines.empty? rules = [] tag_pos = first_block_pos(lines[0]) if tag_pos tag_rule = { plugin: plugin.to_s, line: 1, pos: tag_pos, fg: tag_fg || 9 } tag_rule[:bg] = tag_bg if tag_bg rules << tag_rule end if lines.length >= 2 title_pos = first_block_pos(lines[1]) if title_pos title_rule = { plugin: plugin.to_s, line: 2, pos: title_pos, fg: title_fg } title_rule[:bg] = title_bg if title_bg rules << title_rule end end if lines.length >= 3 footer_pos = first_block_pos(lines[-1]) if footer_pos footer_rule = { plugin: plugin.to_s, line: lines.length, pos: footer_pos, fg: footer_fg || 14 } footer_rule[:bg] = footer_bg if footer_bg rules << footer_rule end end rules end
Source
# File lib/theme_paint_rules.rb, line 52 def merge_for_palette(plugins, palette:) Array(plugins).flat_map { |plugin| auto_rules(plugin: plugin, palette: palette) } end
Source
# File lib/theme_paint_rules.rb, line 103 def progress_gutter_rules(palette:) lines = PaintSamples.lines("progress") return [] unless lines && !lines.empty? merged = palette.merge( progress_percent: palette[:progress_percent] || [11, 2] ) fg, bg = merged[:progress_percent] [{ plugin: "progress", line: 1, pos: 1, fg: fg, bg: bg }] end
Source
# File lib/theme_paint_rules.rb, line 92 def role_bg(role, palette) pair = Array(palette[role] || palette[:title] || [0, 4]) pair.length == 2 ? pair[1] : nil end
Source
# File lib/theme_paint_rules.rb, line 86 def role_fg(role, palette) pair = Array(palette[role] || palette[:title] || [0, 4]) pair[0] end