Index: misc/refresh-cache.rb
===================================================================
--- misc/refresh-cache.rb (.../vendor) (revision 0)
+++ misc/refresh-cache.rb (.../branches/wiki) (revision 58)
@@ -0,0 +1,47 @@
+#!/usr/bin/env ruby
+#
+# $Id$
+#
+
+require 'getopts'
+
+def usage(status)
+ (status == 0 ? $stdout : $stderr).print(< err
- $stderr.puts err.message
- $stderr.puts parser.help
- exit 1
- end
-
- load './bitchannelrc'
- setup_environment
- wiki = bitchannel_context()
- wiki._repository.link_cache.clear
- wiki._repository.revlink_cache.clear
- revlinks = {}
- wiki._repository.pages.each do |page|
- page.links
- page.links.each do |dest|
- (revlinks[dest] ||= []).push page.name
- end
- end
- revlinks.each do |name, revlinks|
- wiki._repository.revlink_cache[name] = revlinks
- end
-end
-
-main
Index: lib/bitchannel/repository.rb
===================================================================
--- lib/bitchannel/repository.rb (.../vendor) (revision 58)
+++ lib/bitchannel/repository.rb (.../branches/wiki) (revision 58)
@@ -120,6 +120,7 @@
conf.required! :cachedir
@link_cache = LinkCache.new("#{conf[:cachedir]}/link".untaint)
@revlink_cache = LinkCache.new("#{conf[:cachedir]}/revlink".untaint)
+ @title_cache = TitleCache.new("#{conf[:cachedir]}/title")
@notifier = conf[:notifier]
}
# per-request cache
@@ -145,6 +146,7 @@
# internal use only
attr_reader :link_cache
attr_reader :revlink_cache
+ attr_reader :title_cache
def read_only?
@read_only_p
@@ -153,12 +155,12 @@
attr_reader :syntax
attr_writer :syntax # FIXME: tmp
- def page_names
- @wc_read.cvs_Entries.keys.map {|name| decode_filename(name) }
+ def page_names_and_titles
+ @wc_read.cvs_Entries.keys.map {|name| [decode_filename(name), name2title(name)] }
end
def pages
- page_names().map {|name| new_page(name) }
+ page_names_and_titles().map {|name,| new_page(name) }
end
def orphan_pages
@@ -216,11 +218,16 @@
new_page(name)
end
- def updated(name, new_rev, new_text)
+ def updated(name, new_rev, new_title, new_text)
update_linkcache name, @syntax.extract_links(new_text)
+ update_titlecache name, new_title
notify name, new_rev
end
+ def name2title(name)
+ @title_cache[name] || name
+ end
+
def updated_externally(name)
@wc_read.chdir {|wc|
wc.cvs_update name
@@ -255,6 +262,10 @@
}
end
+ def update_titlecache(name, new_title)
+ @title_cache[name] = new_title
+ end
+
def notify(name, new_rev)
return unless @notifier
# fork twice not to make zombie
@@ -277,7 +288,7 @@
end # class Repository
- class LinkCache
+ class Cache
include FilenameEncoding
include LockUtils
@@ -292,42 +303,43 @@
FileUtils.rm_rf @dir
Dir.mkdir @dir
end
-
- def entries
- Dir.entries(@dir)\
- .reject {|ent| /\,tmp\z/ =~ ent }\
- .select {|ent| File.file?("#{@dir}/#{ent.untaint}") }\
- .map {|ent| decode_filename(ent) }
- end
-
+
def [](name)
read_cache(cache_path(name))
end
- def []=(name, links)
+ def []=(name, values)
lock {
- write_cache cache_path(name), links
+ write_cache cache_path(name), values
}
end
-
- def add_link(name, lnk)
- links = (read_cache(cache_path(name)) || [])
- write_cache cache_path(name), (links + [lnk]).uniq.sort
+
+ def updating
+ lock {
+ yield self
+ }
end
+
+ private
- def del_link(name, lnk)
- links = (read_cache(cache_path(name)) || [])
- write_cache cache_path(name), (links - [lnk]).uniq.sort
+ def read_cache(path)
+ File.readlines(path).map {|line| line.strip.untaint }
+ rescue Errno::ENOENT
+ return nil
end
- def updating
- lock {
- yield self
+ def write_cache(path, values)
+ tmp = "#{path},tmp"
+ File.open(tmp, 'w') {|f|
+ values.each do |line|
+ f.puts line
+ end
}
+ File.rename tmp, path
+ ensure
+ File.unlink tmp if File.exist?(tmp)
end
- private
-
def lock
if @locking
yield
@@ -347,35 +359,71 @@
"#{@dir}/#{encode_filename(name)}"
end
- def read_cache(path)
- File.readlines(path).map {|line| line.strip.untaint }
- rescue Errno::ENOENT
- return nil
+ end # Class Cache
+
+
+ class LinkCache < Cache
+
+ def entries
+ Dir.entries(@dir)\
+ .reject {|ent| /\,tmp\z/ =~ ent }\
+ .select {|ent| File.file?("#{@dir}/#{ent.untaint}") }\
+ .map {|ent| decode_filename(ent) }
end
+
+ def add_link(name, lnk)
+ links = (read_cache(cache_path(name)) || [])
+ write_cache cache_path(name), (links + [lnk]).uniq.sort
+ end
- def write_cache(path, links)
- tmp = "#{path},tmp"
- File.open(tmp, 'w') {|f|
- links.each do |lnk|
- f.puts lnk
- end
- }
- File.rename tmp, path
- ensure
- File.unlink tmp if File.exist?(tmp)
+ def del_link(name, lnk)
+ links = (read_cache(cache_path(name)) || [])
+ write_cache cache_path(name), (links - [lnk]).uniq.sort
end
end # class LinkCache
+
+ class TitleCache < Cache
+
+ SEPARATOR = "\001"
+ CACHEFILE_NAME = 'name2title'
+
+ def initialize(dir)
+ super
+ @cache = {}
+ (read_cache(cache_path(CACHEFILE_NAME)) || {})\
+ .map {|line| line.split(/#{SEPARATOR}/o)}\
+ .each {|name, title| @cache[name] = title}
+ end
+ def [](name)
+ @cache[name] || name
+ end
+
+ def []=(name, title)
+ lock {
+ @cache[name] = title
+ write_cache cache_path(CACHEFILE_NAME), @cache.map {|item| item.join(SEPARATOR)}
+ }
+ end
+
+ def clear
+ super
+ @cache = {}
+ end
+
+ end # Class TitleCache
+
+
module CVSRevision
def cvsrev_to_i(rev, on1111 = 1)
return on1111 if rev == '1.1.1.1'
rev.slice(/\A1\.(\d+)\z/, 1).to_i
end
end
+
-
class CVSWorkingCopy
include FilenameEncoding
@@ -811,10 +859,12 @@
@revision = nil
@links = nil
@revlinks = nil
+ @title = repository.name2title(name)
end
attr_reader :repository
attr_reader :name
+ attr_reader :title
def syntax
@repository.syntax
@@ -917,7 +967,8 @@
@wc_read.chdir {|wc|
wc.cvs_update @name
}
- @repository.updated @name, new_rev, new_text
+ new_title = syntax.title(new_text) || @name
+ @repository.updated @name, new_rev, new_title, new_text
end
def edit
Index: lib/bitchannel/syntax.rb
===================================================================
--- lib/bitchannel/syntax.rb (.../vendor) (revision 58)
+++ lib/bitchannel/syntax.rb (.../branches/wiki) (revision 58)
@@ -25,6 +25,11 @@
@interwikinames = nil
end
+ def title(str)
+ first_line = str.slice(/\A.*/)
+ TITLE =~ first_line ? Regexp.last_match.post_match.strip : nil
+ end
+
def compile(str, page_name)
@f = LineInput.new(StringIO.new(str))
@page_name = page_name
@@ -70,6 +75,9 @@
def DUMMY_REPOSITORY.inspect
'#'
end
+ def DUMMY_REPOSITORY.name2title(name)
+ name
+ end
def Syntax.extract_links(str)
new(DUMMY_CONFIG, DUMMY_REPOSITORY)._extract_links(str)
@@ -91,6 +99,7 @@
# Block
#
+ TITLE = /\A=(?=[^=])/
CAPTION = /\A(?:={2,4}|!{1,4})/
UL = /\A\s*\*|\A-/
OL = /\A\s*\(\d+\)|\A\#/ # should not allow spaces before '#'
@@ -105,6 +114,9 @@
CITE, TABLE, PRE, INDENTED, BLOCKEXT)
def do_compile
+ if @f.next? and TITLE =~ @f.peek
+ @f.gets # skip
+ end
while @f.next?
case @f.peek
when CAPTION then caption @f.gets
@@ -434,7 +446,7 @@
return escape_html(name) if @repository.invalid?(name)
@internal_links.push name
if @repository.exist?(name)
- then %Q[#{escape_html(name)}]
+ then %Q[#{escape_html(@repository.name2title(name))}]
else %Q[?#{escape_html(name)}]
end
end
Index: lib/bitchannel/asissyntax.rb
===================================================================
--- lib/bitchannel/asissyntax.rb (.../vendor) (revision 58)
+++ lib/bitchannel/asissyntax.rb (.../branches/wiki) (revision 58)
@@ -21,6 +21,10 @@
@repository = repo
end
+ def title(str)
+ nil
+ end
+
def extract_links(str)
[]
end
Index: lib/bitchannel/page.rb
===================================================================
--- lib/bitchannel/page.rb (.../vendor) (revision 58)
+++ lib/bitchannel/page.rb (.../branches/wiki) (revision 58)
@@ -121,6 +121,10 @@
escape_html(@page.name)
end
+ def page_title
+ escape_html(@page.title)
+ end
+
def page_url
escape_url(@page.name)
end
@@ -181,11 +185,11 @@
end
def menuitem_top_enabled?()
- @page.name != FRONT_PAGE_NAME
+ @page.title != FRONT_PAGE_NAME
end
def menuitem_help_enabled?()
- @page.name != HELP_PAGE_NAME
+ @page.title != HELP_PAGE_NAME
end
def diff_base_revision
@@ -411,6 +415,10 @@
'preview'
end
+ def page_title
+ @page.syntax.title(@text) || page_name
+ end
+
def diff_base_revision
@original_revision || @page.revision || 0
end
@@ -468,7 +476,7 @@
end
def page_list
- @repository.page_names.sort_by {|name| name.downcase }
+ @repository.page_names_and_titles.sort_by {|name, title| title.downcase }
end
def orphan_page?(name)
@@ -527,7 +535,7 @@
def matched_pages(&block)
title_match, not_match = *@repository.pages\
- .partition {|page| @patterns.all? {|re| re =~ page.name } }
+ .partition {|page| @patterns.all? {|re| re =~ page.title } }
title_match\
.sort_by {|page| -page.mtime.to_i }.each(&block)
not_match\
Index: template/revlinks.rhtml
===================================================================
--- template/revlinks.rhtml (.../vendor) (revision 58)
+++ template/revlinks.rhtml (.../branches/wiki) (revision 58)
@@ -3,7 +3,7 @@
<%
show_max = 10
ordered_revlinks()[0, show_max].each do |page|
-%><%= escape_html(page.name) %>
+%><%= escape_html(page.repository.name2title(page.name)) %>
<%
end
%>
Index: template/history.rhtml
===================================================================
--- template/history.rhtml (.../vendor) (revision 58)
+++ template/history.rhtml (.../branches/wiki) (revision 58)
@@ -5,13 +5,13 @@
- <%= page_name() %> : History
+ <%= page_title() %> : History
.include menu
-<%= logo_url() %><%= page_name() %> : History
+<%= logo_url() %><%= page_title() %> : History
<%
logs().sort_by {|log| -log.revision }.each do |log| %>
Index: template/search_result.rhtml
===================================================================
--- template/search_result.rhtml (.../vendor) (revision 58)
+++ template/search_result.rhtml (.../branches/wiki) (revision 58)
@@ -19,7 +19,7 @@
n_hits = 0
matched_pages do |page|
%>
-- <%= escape_html(page.name) %> <%= escape_html(shorten(page.source)) %>
+- <%= escape_html(page.title) %> <%= escape_html(shorten(page.source)) %>
<%
n_hits += 1
end
Index: template/diff.rhtml
===================================================================
--- template/diff.rhtml (.../vendor) (revision 58)
+++ template/diff.rhtml (.../branches/wiki) (revision 58)
@@ -5,13 +5,13 @@
- <%= page_name() %> : Diff
+ <%= page_title() %> : Diff
.include menu
-<%= logo_url() %><%= page_name() %> : Diff rev <%= rev1() %> <=> rev <%= rev2() %>
+<%= logo_url() %><%= page_title() %> : Diff rev <%= rev1() %> <=> rev <%= rev2() %>
[<% if rev1() > 1 %>
Index: template/annotate.rhtml
===================================================================
--- template/annotate.rhtml (.../vendor) (revision 58)
+++ template/annotate.rhtml (.../branches/wiki) (revision 58)
@@ -5,13 +5,13 @@
-
<%= page_name() %> : Annotate
+ <%= page_title() %> : Annotate
.include menu
-<%= logo_url() %><%= page_name() %> : Annotate<%= (revision() ? " rev #{revision()}" : '') %>
+<%= logo_url() %><%= page_title() %> : Annotate<%= (revision() ? " rev #{revision()}" : '') %>
[>>HEAD]
Index: template/view.rhtml
===================================================================
--- template/view.rhtml (.../vendor) (revision 58)
+++ template/view.rhtml (.../branches/wiki) (revision 58)
@@ -4,13 +4,13 @@
- <%= front_page?() ? site_name() : page_name() %>
+ <%= front_page?() ? site_name() : page_title() %>
.include menu
-<%= logo_url() %><%= front_page?() ? site_name() : page_name() %>
+<%= logo_url() %><%= front_page?() ? site_name() : page_title() %>
<%= format_time(last_modified()) %>
(<%= times_before(last_modified()) %>);
Index: template/list.rhtml
===================================================================
--- template/list.rhtml (.../vendor) (revision 58)
+++ template/list.rhtml (.../branches/wiki) (revision 58)
@@ -13,9 +13,9 @@
<%= logo_url() %>List of All Pages
-<% page_list().each do |page| %>
-- <%= escape_html(page) %>
- <% if orphan_page?(page) %>[orphan]<% end %>
+<% page_list().each do |name, title| %>
+- <%= escape_html(title) %>
+ <% if orphan_page?(name) %>[orphan]<% end %>
<% end %>
Index: template/gdiff.rhtml
===================================================================
--- template/gdiff.rhtml (.../vendor) (revision 58)
+++ template/gdiff.rhtml (.../branches/wiki) (revision 58)
@@ -17,7 +17,7 @@
[Diff from my last visit]
<% diffs().each do |log| %>
-
+
[Diff from my last visit]
<% page_list().each do |page| %>
-- <%= format_time(page.mtime) %>: <%= escape_html(page.name) %>
+- <%= format_time(page.mtime) %>: <%= escape_html(page.title) %>
<% end %>
Index: template/preview.rhtml
===================================================================
--- template/preview.rhtml (.../vendor) (revision 58)
+++ template/preview.rhtml (.../branches/wiki) (revision 58)
@@ -5,7 +5,7 @@
- <%= page_name() %> : Preview
+ <%= page_title() %> : Preview
@@ -15,7 +15,7 @@
Preview
-<%= logo_url() %><%= page_name() %>
+<%= logo_url() %><%= page_title() %>
<%= compiled_body() %>
Index: template/edit.rhtml
===================================================================
--- template/edit.rhtml (.../vendor) (revision 58)
+++ template/edit.rhtml (.../branches/wiki) (revision 58)
@@ -5,7 +5,7 @@
- <%= page_name() %> : Edit
+ <%= page_title() %> : Edit
Index: template/viewrev.rhtml
===================================================================
--- template/viewrev.rhtml (.../vendor) (revision 58)
+++ template/viewrev.rhtml (.../branches/wiki) (revision 58)
@@ -5,13 +5,13 @@
- <%= page_name() %> rev 1.<%= revision() %>
+ <%= page_title() %> rev 1.<%= revision() %>
.include menu
-<%= logo_url() %><%= page_name() %> rev <%= revision() %>
+<%= logo_url() %><%= page_title() %> rev <%= revision() %>
Saved at: <%= format_time(last_modified()) %>