class Hypertext

Copyright © 2021 Michel Martens

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Copyright © 2021 Michel Martens

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Constants

ENTITIES

Public Class Methods

escape(str) click to toggle source
# File lib/hypertext.rb, line 44
def self.escape(str)
  str.gsub(/['&\"<>]/, ENTITIES)
end
new() { |self| ... } click to toggle source
# File lib/hypertext.rb, line 48
def initialize
  @dom = []

  if block_given?
    yield self
  end
end
render(array, indent = " ", level = 0) click to toggle source
# File lib/hypertext.rb, line 32
def self.render(array, indent = "  ", level = 0)
  indentation = indent * level

  array.map do |element|
    if Array === element
      render(element, indent, level + 1)
    else
      sprintf "%s%s\n", indentation, element
    end
  end.join
end

Public Instance Methods

append(value) click to toggle source
# File lib/hypertext.rb, line 56
def append(value)
  @dom.push(*value)
end
tag(name, attributes = {}) { || ... } click to toggle source
# File lib/hypertext.rb, line 60
def tag(name, attributes = {})
  atts = compile(attributes)

  if block_given?
    append("<#{name}#{atts}>")

    original, @dom = @dom, []
    yield
    @dom = original << @dom

    append("</#{name}>")
  else
    append("<#{name}#{atts} />")
  end
end
text(value) click to toggle source
# File lib/hypertext.rb, line 76
def text(value)
  append(escape(value))
end
to_a() click to toggle source
# File lib/hypertext.rb, line 80
def to_a
  @dom
end
to_s(indent = " ") click to toggle source
# File lib/hypertext.rb, line 84
def to_s(indent = "  ")
  self.class.render(@dom, indent)
end

Private Instance Methods

compile(attributes) click to toggle source
# File lib/hypertext.rb, line 94
def compile(attributes)
  attributes.map do |key, val|
    case val
    when false
    when true
      %[ #{key}]
    else
      %[ #{key}="#{escape(val.to_s)}"]
    end
  end.join
end
escape(str) click to toggle source
# File lib/hypertext.rb, line 90
def escape(str)
  self.class.escape(str)
end