File: referer.rb

package info (click to toggle)
hiki 0.8.7-1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 1,796 kB
  • ctags: 1,736
  • sloc: ruby: 20,269; lisp: 926; sh: 269; makefile: 12
file content (124 lines) | stat: -rw-r--r-- 3,054 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# $Id: referer.rb,v 1.13 2006/07/21 07:36:37 znz Exp $
# Copyright (C) 2003 TAKEUCHI Hitoshi <hitoshi@namaraii.com>

require 'hiki/db/ptstore'

def add_referer(db)
  begin
    raise unless @db.exist?(@page)
    omit_url = false
    
    if @options['referer.omit_url'] && @cgi.referer
      omit_url = Regexp.new("(#{@options['referer.omit_url'].join('|')})") =~ @cgi.referer
    end
      
    raise if 'HEAD' == @cgi.request_method || ! @cgi.referer ||
                       /^https?/ !~ @cgi.referer || omit_url

    db.transaction do
      db[@cgi.referer] = (db.root?(@cgi.referer) ? db[@cgi.referer] : 0) + 1
    end
  rescue Exception
  end
end

def referers(db)
  db.transaction(true) do
    db.roots.collect do |p|
      [p, db[p]]
    end.sort do |a,b|
      b[1] <=> a[1]
    end
  end
end

def show_short_referer(db)
  s = %Q!<div class="referer">#{referer_short_label} |!
  
  referers(db).each_with_index do |ref, i|
    break if i == @options['referer_limit']
    disp = replace_url(ref[0].unescape).escapeHTML
    s << make_anchor("#{ref[0].escapeHTML}", " #{ref[1]}").gsub(/<a\s+([^>]+)>/i) { %Q!<a #{$1} title="#{disp}">! }
    s << ' |'
  end
  
  s << '</div>'
end

def show_referer(db)
  s = %Q!<div class="referer">#{referer_long_label}<ul>!
  
  referers(db).each_with_index do |ref, i|
    break if i == @options['referer_limit']
    disp = replace_url(ref[0].unescape).escapeHTML
    s << %!<li>#{ref[1]} ! + make_anchor("#{ref[0].escapeHTML}", "#{disp}") + "</li>"
  end
  
  s << '</ul></div>'
end

def referer_path
 "#{@cache_path}/referer"
end

def referer_map
  path = referer_path
  s = ''
  return s unless File.exist?(path)

  s << "<ul>\n"

  Dir.entries(path).sort {|a, b| a.unescape <=> b.unescape}.each do |f|
    next if /(?:^\.)|(?:~$)/ =~ f
    next unless @db.exist?(f.untaint.unescape)
    db = PTStore::new("#{path}/#{f}")
    p = File.basename(f)
    s << "<li>#{hiki_anchor(p, page_name(p.unescape))}</li>\n"
    s << "<ul>\n"
    referers(db).each_with_index do |ref, i|
      break if i == @options['referer_limit']
      disp = replace_url(ref[0].unescape).escapeHTML
      s << %!<li>#{ref[1]} ! + make_anchor("#{ref[0].escapeHTML}", "#{disp}")+"</li>"
    end
    db.close_cache
    s << "</ul>\n"
  end
  
  s << "</ul>\n"
end

def replace_url(url)
  replace_list = @options['referer.replace_url']
  return url unless replace_list
  
  replaced_url = url
  replace_list.each do |list|
    rep_url, rep_str = list.split(' ')
    replaced_url = url.sub(Regexp.new(rep_url), rep_str)
    break if url != replaced_url
  end
  replaced_url
end

add_body_leave_proc(Proc.new do
  begin
    Dir.mkdir(referer_path) unless File.exist?(referer_path)

    file_name = "#{referer_path}/#{@page.escape.to_euc}"
    db = PTStore::new(file_name)
    add_referer(db)
    
    case @options['referer.display_type']
    when 'none'
    when 'long'
      show_referer(db)
    else
      show_short_referer(db)
    end
  rescue Exception
  ensure
    db.close_cache if db 
  end
end)

export_plugin_methods(:referer_map)