ruby - RSS 作成 - リンク先を再帰検索

 
1. 概要
2. モジュール

1. 概要

 ひとつ前のモジュールから親としての URI とリンク先の URI をもらい、リンク先を探していくモジュールです。

2. モジュール

 今んとここんな感じ(2018年11月08日)。
require('pry')

class CheckChild < BaseClass
  def initialize(original)
    protocol, userinfo, domain, other  = URI.split(original)
    @top = "#{protocol}" + "://" + "#{domain}"
  end

  def execute(parent, doc, child, checked, contents)
    #puts("[#{self.class.name}.#{__method__}] parent=[#{parent}] child=[#{child}]")

    # parent の URI の末尾を加工してインデックスまでを求める
    index = parent

    if (index[-1, 1] != '/')      # 末尾が / でない場合は 末尾のひとつ前の / までをインデックスファイルとする
      split = parent.split('/')
      last  = split.last

      if (last.include?('.'))
        index = parent[0,parent.length-last.length]
      end
    end

    child.each_key do | key |

      # key に対して URI のフルパスを設定する

      value = Hash.new
      value[:URI] = AssembleURI(index, key)
      child[key] = value;
    end

    mytree = Hash.new

    #binding.pry

    child.each_value do | value |
      begin
        #tree = Hash.new
        tree = { value[:URI] => 'UNKNOWN' }
        parentproc = CheckParent.new(value[:URI])
        returnvalue = parentproc.execute(value[:URI], tree, checked, contents)

        if (returnvalue == 'unknown')

          # 本プログラムでは種別や結果はない

          $result[value[:URI]] = { :リンク元 => index, :リンク => value[:URI] }
        end

        mytree[value[:URI]] = returnvalue

      rescue => error
        puts("#{parent} → #{value[:URI]} 取得時にエラー")
        next
      end
   end

   return mytree;

  rescue => error
    exeptlog = ExceptLog.new
    binding.pry
    exeptlog.execute(self, error)
    exit 1
  end

  # リンクチェックプログラムでは Assemble クラスで定義していたもの
  # 本プログラムは内部リンクしか見ないので
  # 相対リンクを絶対 URI に変更するだけ

  def AssembleURI(index, original)
    uri = original;

    begin
      if (original == '../')                              # ../ のみであれば
        split = index.split('/')                          # ひとつ上のインデックスとする
        uri = index[0, index.length-(split.last.length+1)]

      elsif (original[0, 2] == '..')                      # ../ インデックスのひとつ上に / 以降を加える
        split = index.split('/')
        uri = index[0, index.length-(split.last.length+2)] + original[2,original.length-2]

      elsif (original == '.')                             # . 一文字のみ
        uri = index + '*'                                 # あえて変なことにしちゃう(落ちないように)
      else                                                # ./  インデックスに / 以降を加える
        uri = index + original[2,original.length-2]
      end
    rescue => error
      puts('index'+"[#{index}]")
      puts('original'+"[#{original}]")

      binding.pry
      puts "例外発生[#{error.class}]"
      puts "#{error.backtrace}"
      puts "[#{self.class.name}][#{error.message}]"
      exit 1
    end

    return uri
  end
end

 これもリンクチェック時のモジュールを流用しているため、不要な処理がたくさんあります。  だいぶ減らして、配下の不要なクラスも使用しないようにしました(2018年11月09日)。