module BannerParse
BannerParse — split !banner args into heading and optional subheadings. Public: parse, strip_colour_prefix, strip_engine_prefix Depends: IrcFormat, TextUtil, BannerEngines Tests: test/lib/banner_report_test.rb, test/plugins/banner_test.rb
Constants
- COLOUR_TOKEN_PATTERN
- DUAL_COLOUR_ONLY_PATTERN
- HEADING_PATTERN
- LOOKS_LIKE_COLOUR_PATTERN
- MAX_HEADING_LENGTH
- MAX_SUBHEADINGS
- SPACE_COLOUR_PATTERN
- USAGE
Public Instance Methods
Source
# File lib/banner_parse.rb, line 87 def parse(args) text = TextUtil.squish(args) return { error: USAGE } if text.empty? prefix = strip_colour_prefix(text) return { error: prefix[:error] } if prefix[:error] text = prefix[:text] engine_part = strip_engine_prefix(text) return { error: engine_part[:error] } if engine_part[:error] text = engine_part[:text] segments = text.split(/\s+\.\s+/) heading = TextUtil.squish(segments.first).upcase return { error: "Heading is required." } if heading.empty? return { error: "Heading may be at most #{MAX_HEADING_LENGTH} characters." } if heading.length > MAX_HEADING_LENGTH unless HEADING_PATTERN.match?(heading) return { error: "Heading may only contain letters, digits, and spaces." } end subheadings = [] segments.drop(1).each do |segment| piece = TextUtil.squish(segment) return { error: "Each subheading needs a label." } if piece.empty? label, body = piece.split(/\s+/, 2) subheadings << { label: label, body: body.to_s } end if subheadings.length > MAX_SUBHEADINGS return { error: "At most #{MAX_SUBHEADINGS} subheadings allowed." } end result = { heading: heading, subheadings: subheadings } result[:engine] = engine_part[:engine] if engine_part[:engine] if prefix.key?(:title_fg) result[:title_fg] = prefix[:title_fg] result[:title_bg] = prefix[:title_bg] end result end
Source
# File lib/banner_parse.rb, line 25 def strip_colour_prefix(text) squished = TextUtil.squish(text) return { text: squished } if squished.empty? if (match = squished.match(DUAL_COLOUR_ONLY_PATTERN)) fg_colour = IrcFormat.parse_colour_spec(match[1]) return fg_colour if fg_colour[:error] bg_colour = IrcFormat.parse_colour_spec(match[2]) return bg_colour if bg_colour[:error] return { error: "Heading is required." } end if (match = squished.match(SPACE_COLOUR_PATTERN)) fg_colour = IrcFormat.parse_colour_spec(match[1]) return fg_colour if fg_colour[:error] bg_colour = IrcFormat.parse_colour_spec(match[2]) return bg_colour if bg_colour[:error] return { text: match[3], title_fg: fg_colour[:fg], title_bg: bg_colour[:fg] } end return { text: squished } unless squished.match?(/\s/) first, rest = squished.split(/\s+/, 2) if first.match?(COLOUR_TOKEN_PATTERN) colour = IrcFormat.parse_colour_spec(first) return colour if colour[:error] return { text: rest, title_fg: colour[:fg], title_bg: colour[:bg] } end if first.match?(LOOKS_LIKE_COLOUR_PATTERN) return { error: "Invalid colour — use fg or fg,bg (0-98)." } end { text: squished } end
Source
# File lib/banner_parse.rb, line 74 def strip_engine_prefix(text) squished = TextUtil.squish(text) return { text: squished } if squished.empty? first, rest = squished.split(/\s+/, 2) engine = BannerEngines.resolve_id(first) return { text: squished } unless engine return { error: "Heading is required." } if rest.to_s.strip.empty? { engine: engine, text: rest } end