読者です 読者をやめる 読者になる 読者になる

現在形

Windows fub

誰も興味がなさそうな fub の話の続き。

ちなみに、昨日は恥ずかしくてつい、話に必要な部分だけ残して削っちゃったんですが、今の形はこんな感じです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using fubPlugin;
using mshtml;

namespace fubPlugin
{
  public partial class NavigationBar : PluginBase, IToolbar
  {
    private string prev_word_candidate_at = { "前のページ", "前へ" };
    private string next_word_candidate_at = { "次のページ", "次へ" };

    public NavigationBar()
    {
      PluginName = "NavigationBar";
      InitializeComponent();
    }

    private void prev_button_Click(object sender, EventArgs e)
    {
      get_and_move("prev");
    }

    private void next_button_Click(object sender, EventArgs e)
    {
      get_and_move("next");
    }

    private bool get_and_move(string prev_next)
    {
      if (prev_next != "next" && prev_next != "prev")
      {
        return false;
      }

      string[] word_candidate_at
        = (prev_next == "prev") ? prev_word_candidate_at : next_word_candidate_at;
      IHTMLDocument2 HTMLDocument = (IHTMLDocument2)GetActiveFrameDocument();
      IHTMLElementCollection link_elements
        = (IHTMLElementCollection)HTMLDocument.all.tags("link");

      // link たぐあるか
      if (link_elements.length > 0)
      {
        foreach (HTMLLinkElement link_element in link_elements)
        {
          if (link_element.rel == prev_next)
          {
            HTMLDocument.url = link_element.href;
            return true;
          }
        }
      }

      //そもそも link タグなかったので、さらに a タグを掘るぞ
      IHTMLElementCollection a_elements
        = (IHTMLElementCollection)HTMLDocument.all.tags("a");

      if (a_elements.length > 0)
      {
        foreach (HTMLAnchorElement a_element in a_elements)
        {
          if (a_element.innerText != null)
          {
            for (int i = 0; i < word_candidate_at.Length; i++)
            {
              if (a_element.innerText.Contains(word_candidate_at[i]))
              {
                HTMLDocument.url = a_element.href;
                return true;
              }
            }
          }
        }
      }

      return false;
    }
  }
}

もし link タグの rel="(prev|next)" が見つからなければ、今度は「次のページ」やら「次へ」といった言葉を中に含む a タグを総ざらいして見つかったら飛ばすという力業。

これで、というか全然英語ページに対応してませんが、これで link ナビゲーションの付いてない Google の結果画面やらブログの記事やらを延々このボタンだけで行き来できます。使ってみると結構これ、楽ですよ!。これだけはどうしても欲しかったので、気合いだけで作りました。未だわからないことだらけ。しかし動いてるからいっか!。さぁ、合い言葉は、落ちても自分の fub が落ちるだけ!。