🏑 index : github.com/captn3m0/cosmere-books.git

# Example: extract only texts from html

require "../src/myhtml"

str = if filename = ARGV[0]?
        File.read(filename, "UTF-8", invalid: :skip)
      else
        <<-HTML
        <html>
          <br />
          <hr size="2" width="100%" />
          НазваниС: <b>Π§Ρ‚ΠΎ я сдСлал?</b><br />
          ΠžΡ‚Π²Π΅Ρ‚ΠΈΠ»: <b>Π§ΡƒΠ΄ΠΈΡ‰Π΅-Π—ΠΌΠ΅ΠΉ</b> Π½Π° <b>21 ΠžΠΊΡ‚ΡΠ±Ρ€ΡŒ 2005, 18:11</b>
          <hr />
          <div style="margin: 0 5ex;">Π”Π°Π²Π°ΠΉΡ‚Π΅ Π² этой Ρ‚Π΅ΠΌΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сСгодня ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ</div>
          <br />
          <hr size="2" width="100%" />
          НазваниС: <b>Π§Ρ‚ΠΎ я сдСлал?</b><br />
          ΠžΡ‚Π²Π΅Ρ‚ΠΈΠ»: <b>Rostik</b> Π½Π° <b>21 ΠžΠΊΡ‚ΡΠ±Ρ€ΡŒ 2005, 18:15</b>
          <hr />
          <div style="margin: 0 5ex;"><b>Π§ΡƒΠ΄ΠΈΡ‰Π΅-Π—ΠΌΠ΅ΠΉ</b>, Π° Π³Π΄Π΅ ΠΆ Ρ‚Ρ‹ успСл ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, Ссли ΡƒΠ²ΠΈΠ»ΡŒΠ½ΡƒΠ»?</div>
          <br />
        </html>
        HTML
      end

struct Myhtml::Node
  def displayble?
    visible? && !object? && !is_tag_noindex?
  end
end

def words(parser)
  parser
    .nodes(:_text)                         # iterate through all TEXT nodes
    .select(&.parents.all?(&.displayble?)) # select only which parents are visible good tag
    .map(&.tag_text)                       # mapping node text
    .reject(&.blank?)                      # reject blanked texts
    .map(&.strip.gsub(/\s{2,}/, " "))      # remove extra spaces
end

parser = Myhtml::Parser.new(str)
puts words(parser).join(" | ")

# Output:
#   НазваниС: | Π§Ρ‚ΠΎ я сдСлал? | ΠžΡ‚Π²Π΅Ρ‚ΠΈΠ»: | Π§ΡƒΠ΄ΠΈΡ‰Π΅-Π—ΠΌΠ΅ΠΉ | Π½Π° | 21 ΠžΠΊΡ‚ΡΠ±Ρ€ΡŒ 2005, 18:11 |
#   Π”Π°Π²Π°ΠΉΡ‚Π΅ Π² этой Ρ‚Π΅ΠΌΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сСгодня ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ | НазваниС: | Π§Ρ‚ΠΎ я сдСлал? | ΠžΡ‚Π²Π΅Ρ‚ΠΈΠ»: | Rostik | Π½Π° |
#   21 ΠžΠΊΡ‚ΡΠ±Ρ€ΡŒ 2005, 18:15 | Π§ΡƒΠ΄ΠΈΡ‰Π΅-Π—ΠΌΠ΅ΠΉ | , Π° Π³Π΄Π΅ ΠΆ Ρ‚Ρ‹ успСл ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, Ссли ΡƒΠ²ΠΈΠ»ΡŒΠ½ΡƒΠ»?