Class: IsoDoc::CssBorderParser::BorderParser

Inherits:
Object
  • Object
show all
Defined in:
lib/isodoc/css_border_parser.rb,
lib/isodoc/css_border_parser_vars.rb

Overview

BorderParser class handles the parsing of CSS border properties

Constant Summary collapse

DEFAULT_VALUES =

Default values according to CSS specifications

{
  "width" => "medium",
  "style" => "none",
  "color" => "currentColor",
}.freeze
BORDER_WIDTHS =

CSS border width values

["thin", "medium", "thick"].freeze
BORDER_STYLES =

CSS border style values

[
  "none", "hidden", "dotted", "dashed", "solid", "double",
  "groove", "ridge", "inset", "outset"
].freeze
COLOR_KEYWORDS =

CSS color keywords

[
  "black", "silver", "gray", "white", "maroon", "red", "purple",
  "fuchsia", "green", "lime", "olive", "yellow", "navy", "blue",
  "teal", "aqua", "orange", "aliceblue", "antiquewhite", "aquamarine",
  "azure", "beige", "bisque", "blanchedalmond", "blueviolet", "brown",
  "burlywood", "cadetblue", "chartreuse", "chocolate", "coral",
  "cornflowerblue", "cornsilk", "crimson", "cyan", "darkblue",
  "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey",
  "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange",
  "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue",
  "darkslategray", "darkslategrey", "darkturquoise", "darkviolet",
  "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue",
  "firebrick", "floralwhite", "forestgreen", "gainsboro", "ghostwhite",
  "gold", "goldenrod", "greenyellow", "grey", "honeydew", "hotpink",
  "indianred", "indigo", "ivory", "khaki", "lavender", "lavenderblush",
  "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan",
  "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey",
  "lightpink", "lightsalmon", "lightseagreen", "lightskyblue",
  "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow",
  "limegreen", "linen", "magenta", "mediumaquamarine", "mediumblue",
  "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue",
  "mediumspringgreen", "mediumturquoise", "mediumvioletred",
  "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite",
  "oldlace", "olivedrab", "orangered", "orchid", "palegoldenrod",
  "palegreen", "paleturquoise", "palevioletred", "papayawhip",
  "peachpuff", "peru", "pink", "plum", "powderblue", "rosybrown",
  "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen",
  "seashell", "sienna", "skyblue", "slateblue", "slategray",
  "slategrey", "snow", "springgreen", "steelblue", "tan", "thistle",
  "tomato", "turquoise", "violet", "wheat", "whitesmoke",
  "yellowgreen", "transparent", "currentColor"
].freeze
COLOR_MAP =

Mapping of CSS color names to RGB hex values

{
  "black" => "#000000",
  "silver" => "#C0C0C0",
  "gray" => "#808080",
  "white" => "#FFFFFF",
  "maroon" => "#800000",
  "red" => "#FF0000",
  "purple" => "#800080",
  "fuchsia" => "#FF00FF",
  "green" => "#008000",
  "lime" => "#00FF00",
  "olive" => "#808000",
  "yellow" => "#FFFF00",
  "navy" => "#000080",
  "blue" => "#0000FF",
  "teal" => "#008080",
  "aqua" => "#00FFFF",
  "orange" => "#FFA500",
  "aliceblue" => "#F0F8FF",
  "antiquewhite" => "#FAEBD7",
  "aquamarine" => "#7FFFD4",
  "azure" => "#F0FFFF",
  "beige" => "#F5F5DC",
  "bisque" => "#FFE4C4",
  "blanchedalmond" => "#FFEBCD",
  "blueviolet" => "#8A2BE2",
  "brown" => "#A52A2A",
  "burlywood" => "#DEB887",
  "cadetblue" => "#5F9EA0",
  "chartreuse" => "#7FFF00",
  "chocolate" => "#D2691E",
  "coral" => "#FF7F50",
  "cornflowerblue" => "#6495ED",
  "cornsilk" => "#FFF8DC",
  "crimson" => "#DC143C",
  "cyan" => "#00FFFF",
  "darkblue" => "#00008B",
  "darkcyan" => "#008B8B",
  "darkgoldenrod" => "#B8860B",
  "darkgray" => "#A9A9A9",
  "darkgreen" => "#006400",
  "darkgrey" => "#A9A9A9",
  "darkkhaki" => "#BDB76B",
  "darkmagenta" => "#8B008B",
  "darkolivegreen" => "#556B2F",
  "darkorange" => "#FF8C00",
  "darkorchid" => "#9932CC",
  "darkred" => "#8B0000",
  "darksalmon" => "#E9967A",
  "darkseagreen" => "#8FBC8F",
  "darkslateblue" => "#483D8B",
  "darkslategray" => "#2F4F4F",
  "darkslategrey" => "#2F4F4F",
  "darkturquoise" => "#00CED1",
  "darkviolet" => "#9400D3",
  "deeppink" => "#FF1493",
  "deepskyblue" => "#00BFFF",
  "dimgray" => "#696969",
  "dimgrey" => "#696969",
  "dodgerblue" => "#1E90FF",
  "firebrick" => "#B22222",
  "floralwhite" => "#FFFAF0",
  "forestgreen" => "#228B22",
  "gainsboro" => "#DCDCDC",
  "ghostwhite" => "#F8F8FF",
  "gold" => "#FFD700",
  "goldenrod" => "#DAA520",
  "greenyellow" => "#ADFF2F",
  "grey" => "#808080",
  "honeydew" => "#F0FFF0",
  "hotpink" => "#FF69B4",
  "indianred" => "#CD5C5C",
  "indigo" => "#4B0082",
  "ivory" => "#FFFFF0",
  "khaki" => "#F0E68C",
  "lavender" => "#E6E6FA",
  "lavenderblush" => "#FFF0F5",
  "lawngreen" => "#7CFC00",
  "lemonchiffon" => "#FFFACD",
  "lightblue" => "#ADD8E6",
  "lightcoral" => "#F08080",
  "lightcyan" => "#E0FFFF",
  "lightgoldenrodyellow" => "#FAFAD2",
  "lightgray" => "#D3D3D3",
  "lightgreen" => "#90EE90",
  "lightgrey" => "#D3D3D3",
  "lightpink" => "#FFB6C1",
  "lightsalmon" => "#FFA07A",
  "lightseagreen" => "#20B2AA",
  "lightskyblue" => "#87CEFA",
  "lightslategray" => "#778899",
  "lightslategrey" => "#778899",
  "lightsteelblue" => "#B0C4DE",
  "lightyellow" => "#FFFFE0",
  "limegreen" => "#32CD32",
  "linen" => "#FAF0E6",
  "magenta" => "#FF00FF",
  "mediumaquamarine" => "#66CDAA",
  "mediumblue" => "#0000CD",
  "mediumorchid" => "#BA55D3",
  "mediumpurple" => "#9370DB",
  "mediumseagreen" => "#3CB371",
  "mediumslateblue" => "#7B68EE",
  "mediumspringgreen" => "#00FA9A",
  "mediumturquoise" => "#48D1CC",
  "mediumvioletred" => "#C71585",
  "midnightblue" => "#191970",
  "mintcream" => "#F5FFFA",
  "mistyrose" => "#FFE4E1",
  "moccasin" => "#FFE4B5",
  "navajowhite" => "#FFDEAD",
  "oldlace" => "#FDF5E6",
  "olivedrab" => "#6B8E23",
  "orangered" => "#FF4500",
  "orchid" => "#DA70D6",
  "palegoldenrod" => "#EEE8AA",
  "palegreen" => "#98FB98",
  "paleturquoise" => "#AFEEEE",
  "palevioletred" => "#DB7093",
  "papayawhip" => "#FFEFD5",
  "peachpuff" => "#FFDAB9",
  "peru" => "#CD853F",
  "pink" => "#FFC0CB",
  "plum" => "#DDA0DD",
  "powderblue" => "#B0E0E6",
  "rosybrown" => "#BC8F8F",
  "royalblue" => "#4169E1",
  "saddlebrown" => "#8B4513",
  "salmon" => "#FA8072",
  "sandybrown" => "#F4A460",
  "seagreen" => "#2E8B57",
  "seashell" => "#FFF5EE",
  "sienna" => "#A0522D",
  "skyblue" => "#87CEEB",
  "slateblue" => "#6A5ACD",
  "slategray" => "#708090",
  "slategrey" => "#708090",
  "snow" => "#FFFAFA",
  "springgreen" => "#00FF7F",
  "steelblue" => "#4682B4",
  "tan" => "#D2B48C",
  "thistle" => "#D8BFD8",
  "tomato" => "#FF6347",
  "turquoise" => "#40E0D0",
  "violet" => "#EE82EE",
  "wheat" => "#F5DEB3",
  "whitesmoke" => "#F5F5F5",
  "yellowgreen" => "#9ACD32",
  # Special values that should not be converted
  "transparent" => "transparent",
  "currentColor" => "currentColor",
}.freeze

Instance Method Summary collapse

Constructor Details

#initializeBorderParser

No initialization needed



11
# File 'lib/isodoc/css_border_parser.rb', line 11

def initialize; end

Instance Method Details

#parse(css_string) ⇒ Hash

Parse CSS and extract border properties

Parameters:

  • css_string (String)

    CSS content to parse

Returns:

  • (Hash)

    Parsed border properties organized by selector



17
18
19
20
21
22
23
24
25
26
27
# File 'lib/isodoc/css_border_parser.rb', line 17

def parse(css_string)
  results = {}
  rule_sets = extract_rule_sets(css_string)
  rule_sets.each do |selector, declarations|
    results[selector] = {}
    process_border_properties(declarations, results[selector])
    store_non_border_properties(declarations, results[selector])
  end

  results
end

#parse_declaration(css_declaration) ⇒ Hash

Parse a CSS declaration string

(can contain multiple declarations)

Parameters:

  • css_declaration (String)

    CSS declaration string

Returns:

  • (Hash)

    Parsed border properties



34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/isodoc/css_border_parser.rb', line 34

def parse_declaration(css_declaration)
  result = {}
  declarations = css_declaration.split(";").each_with_object({}) do |d, m|
    d = d.strip
    d.empty? and next
    property, value = d.split(":", 2).map(&:strip)
    m[property] = value
  end
  process_border_properties(declarations, result)
  store_non_border_properties(declarations, result)
  result
end

#to_css_string(parsed_properties, format: :inline, selector: nil) ⇒ String

Generate a CSS string from parsed properties

Parameters:

  • parsed_properties (Hash)

    Parsed CSS properties

  • format (Symbol) (defaults to: :inline)

    Output format (:inline, :rule_set)

  • selector (String) (defaults to: nil)

    CSS selector (only used with :rule_set format)

Returns:

  • (String)

    CSS string representation



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/isodoc/css_border_parser.rb', line 53

def to_css_string(parsed_properties, format: :inline, selector: nil)
  css_parts = []
  parsed_properties.each do |property_group, components|
    property_group == "other_properties" and next
    if property_group == "border"
      components.each do |property_type, value|
        css_parts << "border-#{property_type}: #{value};"
      end
    elsif property_group.start_with?("border-")
      # direction-specific border properties
      direction = property_group.sub("border-", "")
      components.each do |property_type, value|
        css_parts << "border-#{direction}-#{property_type}: #{value};"
      end
    end
  end
  # non-border properties
  parsed_properties["other_properties"]&.each do |property, value|
    css_parts << "#{property}: #{value};"
  end
  format_properties(format, css_parts, selector)
end