[Hiki-users 15] usr-theme プラグイン

Back to archive index

Hiroyuki Ito ZXB01****@nifty*****
2005年 4月 3日 (日) 22:09:27 JST


はじめまして。
伊東と申します。

閲覧者がテーマを選択できるようにするプラグインを作りました。
同じような物がありそうな気もするのですが、ちょっと探した範
囲では見当たらなかったので、こちらに投稿してみます。

Version 0.6.5 用です。

-------------- next part --------------
add_footer_proc {
  script
}

def script
  <<-EOF

    <script type="text/javascript">
      window.onload = init;
      window.onunload = save_usr_theme;
      cur_theme = "#{$theme}";

      function init(){
        var select, link = null, links, i, option;

        links = document.getElementsByTagName('link');
        if (links) {
          var s;
          s = cur_theme + "/" + cur_theme + ".css$";
          for (i = 0; i < links.length; i++) {
            if (links[i].href && links[i].href.search(s) > 0) {
              link = links[i];
              link.path = link.href.match("(.*)/[^/]+/[^/]+$")[1];
              link.set_theme = function (theme) {
                this.href = this.path + "/" + theme + "/" + theme + ".css";
                cur_theme = theme;
              }
              break;
            }
          }
        }

        cur_theme = get_cookie("theme");
        if (link && cur_theme) {
          link.set_theme(cur_theme);
        }

        select = get_select("theme");
        if (select) {
          select.target = link;
          select.onchange = function () {
            if (this.target) {
              this.target.set_theme(this.options[this.selectedIndex].value);
            }
          }
          for (i = 0; i < select.options.length; i++) {
            option = select.options[i];
            if (option.value == cur_theme) {
              option.selected = true;
            }
          }
        }
      }

      function save_usr_theme() {
        if (cur_theme) {
          set_cookie("theme", cur_theme);
        }
      }

      function get_select(name) {
        var i;
        var nodes = document.getElementsByName(name);
        if (! nodes) {
          return null;
        }
        for (i = 0; i < nodes.length; i++) {
          if (nodes[i].nodeName == 'SELECT') {
            return nodes[i];
          }
        }
        return null;
      }

      function set_cookie(key, val) {
        var today = new Date();
        var date = new Date(today.getTime() + 1000 * 60 * 60 * 24 * 7);
        var expires = new RegExp("expires=[^;]+;");
        var rex = new RegExp(key + "=[^;]+;");
        var cookie = document.cookie;

        cookie.replace(rex, "");
        cookie = key + "=" + val + ";" + cookie;

        cookie.replace(expires, "");
        cookie += ";expires=" + date.toGMTString() + ";";

        document.cookie = cookie;
      }

      function get_cookie(key) {
        var rex = new RegExp(key + "=([^;]+)")
        var val = rex.exec(document.cookie);

        if (val != null) {
          return val[1];
        } else {
          return null;
        }
      }
    </script>
  EOF
end

def usr_theme
  s = '<select name="theme">'
  Dir::glob("#{$theme_path }/*/*.css").sort.each {|t| 
    t = File::basename(t, '.css').escapeHTML
    s += %Q(\n<option value="#{t}")
    if $theme == t
      s += " selected"
    end
    s += ">#{t}" 
  }
  s += "\n</select>"
end



Hiki-users メーリングリストの案内
Back to archive index