class Qwik::Site

Constants

CACHE_DIR
COMMENT
ML_LIFE_TIME_ALLOWANCE
PLAN_RE
plan

Attributes

cache[R]
cache_path[R]
path[R]
sitename[R]

Public Class Methods

new(config, memory, sitename) click to toggle source
# File vendor/qwik/lib/qwik/site.rb, line 27
    def initialize(config, memory, sitename)
      @config = config
      @memory = memory

      @sitename = sitename
      @path = "#{@config.sites_dir}/#{sitename}".path
      @pages = Pages.new(@config, @path)

      @cache_path = @path + CACHE_DIR
      @cache_path.check_directory

      @cache = {}

      init_group_config         # site-group.rb

#      init_site_search
    end
parse_charset(content) click to toggle source

FIXME: Same as in group-config.rb

# File vendor/qwik/lib/qwik/site-report.rb, line 151
def self.parse_charset(content)
  return (content.to_a.first || '').chomp
end

Public Instance Methods

[](k) click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 13
def [](k)           @pages[k];               end
attach() click to toggle source

obsolete

# File vendor/qwik/lib/qwik/site-files.rb, line 29
def attach
  @attach = SiteAttach.new(@path.to_s) unless defined? @attach
  return @attach
end
backupdb() click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 10
def backupdb();     @pages.backupdb;    end
close() click to toggle source

def path(f) @pages.path(f); end

# File vendor/qwik/lib/qwik/site-pages.rb, line 25
def close();        @pages.close;          end
create(k) click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 18
def create(k)       @pages.create(k);     end
create_new() click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 19
def create_new();   @pages.create_new;        end
date_list() click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 23
def date_list();    @pages.date_list;  end
db() click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 9
def db();           @pages.db;               end
delete(k) click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 21
def delete(k)       @pages.delete(k);     end
each(*a, &b) click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 15
def each(*a, &b)    @pages.each(*a, &b);       end
each_all(*a, &b) click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 16
def each_all(*a, &b) @pages.each_all(*a, &b);       end
erase_all() click to toggle source
# File vendor/qwik/lib/qwik/test-module-path.rb, line 10
def erase_all
  @pages.erase_all
end
event() click to toggle source
# File vendor/qwik/lib/qwik/site-event.rb, line 11
def event
  @event = SiteEvent.new(@config, @memory, self) unless defined? @event
  @event
end
exist?(k) click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 14
def exist?(k)       @pages.exist?(k);     end
files(k = 'FrontPage') click to toggle source
# File vendor/qwik/lib/qwik/site-files.rb, line 11
def files(k = 'FrontPage')
  page = self[k]
  return nil if page.nil?
  page.files = PageFiles.new(@path.to_s, k) if page.files.nil?
  return page.files
end
files_total() click to toggle source
# File vendor/qwik/lib/qwik/site-files.rb, line 18
def files_total
  t = 0
  self.each {|page|
    # force to create page.files object for each page
    # to count files in unaccecced pages after server rebooted
    t+= files(page.key).total
  }
  return t
end
forward?() click to toggle source
# File vendor/qwik/lib/qwik/site-group.rb, line 13
def forward?
  return @group_config.forward?
end
generate_report_mail(user, rep) click to toggle source
# File vendor/qwik/lib/qwik/site-report.rb, line 117
def generate_report_mail(user, rep)
  domainurl = self.host_url
  siteurl = self.site_url
  f = self.siteconfig['reportfrom']
  from = self.ml_address
  from = f if f && ! f.empty?
  mail = {
    :from    => from,
    :to      => user,
    :subject => "#{siteurl} Report",
    :content => "Recent changes on #{siteurl}\n\n#{rep}",
    :precedence => "bulk",
  }

  lang = get_lang
  if lang == 'ja'
    mail[:subject] = "#{siteurl} レポート"
    mail[:content] = "#{siteurl} における、本日の編集記録です。\n\n#{rep}"
  end

  return mail
end
get_by_title(t) click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 26
def get_by_title(t) @pages.get_by_title(t); end
get_lang() click to toggle source
# File vendor/qwik/lib/qwik/site-report.rb, line 140
def get_lang
  lang = 'en'
  page = self['_GroupCharset']
  return lang if page.nil?
  content = page.load
  charset = self.class.parse_charset(content)
  return 'ja' if charset == 'iso-2022-jp'
  return lang
end
get_new_id() click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 20
def get_new_id();   @pages.get_new_id;        end
get_page_title(pagename) click to toggle source
# File vendor/qwik/lib/qwik/site-url.rb, line 54
def get_page_title(pagename)
  page = self[pagename]
  return '' if page.nil?
  page_title = page.get_title

  sitetitle = self.title
  if ! sitetitle.empty?
    if self.siteconfig['page_title_first'] == 'true'
      return "#{page_title} - #{sitetitle}"
    else
      return "#{sitetitle} - #{page_title}"
    end
  end

  return page_title
end
get_pages() click to toggle source

Only for test.

# File vendor/qwik/lib/qwik/page-get.rb, line 141
def get_pages
  return @pages
end
get_pages_with_date() click to toggle source
# File vendor/qwik/lib/qwik/site-plan.rb, line 13
    def get_pages_with_date
      pages = []
      self.each {|page|
        if PLAN_RE =~ page.key
          datestr = $1
          date = Time.parse(datestr).to_i
          pages << [page.key, date.to_i]
          next
        end

=begin
        tags = page.get_tags
        if tags
          tags.each {|tag|
            date = Time.date_parse(tag)
            if date
              pages << [page.key, date.to_i]
            end
          }
        end
=end
      }
      return pages
    end
get_superpage(k) click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 28
def get_superpage(k)
  page = self[k]
  return page if page
  page = self["_#{k}"]
  return page if page
  return nil
end
host_url() click to toggle source
# File vendor/qwik/lib/qwik/site-url.rb, line 11
def host_url
  host_url =  self.siteconfig['siteurl']
  if ! host_url.nil? && host_url.empty?
    host_url = @config.public_url
  end
  uri = URI(host_url)
  uri.path = ""
  return uri.to_s
end
inactive?(now = Time.now) click to toggle source
# File vendor/qwik/lib/qwik/site-group.rb, line 21
def inactive?(now = Time.now)
  return false if @group_config.forward? || @group_config.permanent?

  log = @memory[:bury_log]

  last_article_time = @pages.last_article_time
  if last_article_time.nil?         # No file here.
    unless $test
      log.info("site #{@sitename}: last_article_time is nil") if log
    end
    return true
  end

  ml_life_time = self.siteconfig['ml_life_time'].to_i
  ml_life_time += ML_LIFE_TIME_ALLOWANCE

  result = last_article_time.to_i + ml_life_time.to_i <= now.to_i
  if result
    ymdhms = last_article_time.strftime("%Y-%m-%d %H:%M:%S") 
    unless $test
      log.info("site #{@sitename}: last_article_time is #{ymdhms}") if log
    end
  end
  return result
end
index() click to toggle source
# File vendor/qwik/lib/qwik/site-index.rb, line 9
def index
  return @pages.index
end
inspect() click to toggle source
# File vendor/qwik/lib/qwik/site.rb, line 49
def inspect
  return "#<Site:#{@sitename}>"
end
interwiki() click to toggle source
# File vendor/qwik/lib/qwik/act-interwiki.rb, line 57
def interwiki
  @interwiki = InterWiki.new(@config, self) unless defined? @interwiki
  @interwiki
end
is_blessed?() click to toggle source
# File vendor/qwik/lib/qwik/site-config.rb, line 19
def is_blessed?
  file = @path + ",blessed"
  return file.exist?
end
is_open?() click to toggle source
# File vendor/qwik/lib/qwik/site-config.rb, line 15
def is_open?
  return (siteconfig['open'] == 'true')
end
isearch(query) click to toggle source
# File vendor/qwik/lib/qwik/site-index.rb, line 13
def isearch(query)
  index = self.index
  return if index.nil?
  return index.search(query)
end
isearch_parse_query(query) click to toggle source
# File vendor/qwik/lib/qwik/site-index.rb, line 19
def isearch_parse_query(query)
  return query.strip.split
end
last_modified() click to toggle source
# File vendor/qwik/lib/qwik/site-timeline.rb, line 9
def last_modified
  return self.map {|page|
    page.mtime
  }.max
end
last_page_time() click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 12
def last_page_time; @pages.last_page_time;  end
lastmod_of_all() click to toggle source
# File vendor/qwik/lib/qwik/act-sitebackup.rb, line 10
def lastmod_of_all
  ar = []
  self.path.find do |p|
    Find.prune if p.basename.to_s == '.cache' or p.basename.to_s == '.svn'
    ar << p.mtime
  end
  ar.max
end
log(time, user, cmd, pagename) click to toggle source
# File vendor/qwik/lib/qwik/site-log.rb, line 14
def log(time, user, cmd, pagename)
  sitelog.add(time, user, cmd, pagename)
end
make_report() click to toggle source

private

# File vendor/qwik/lib/qwik/site-report.rb, line 99
def make_report
  page = self['_SiteChanged']
  return nil if page.nil?

  report = ''
  page.wikidb.array.each {|k, v|
    user, cmd, pagename = v
    user = 'anonymous' if user.nil? || user.empty?
    user = MailAddress.obfuscate(user) if ! user.empty?
    time = Time.at(k.to_i)
    time_str = time.strftime('%H:%M')
    url = self.page_url(pagename)
    line = "#{time_str} #{user} #{cmd} #{url}\n"
    report += line
  }
  return report
end
member() click to toggle source
# File vendor/qwik/lib/qwik/site-member.rb, line 9
def member
  @member = SiteMember.new(@config, self) if ! defined?(@member)
  return @member
end
metadata() click to toggle source
# File vendor/qwik/lib/qwik/act-metadata.rb, line 57
def metadata
  return SiteMetaData.new(@config, self)
end
ml_address() click to toggle source
# File vendor/qwik/lib/qwik/site-url.rb, line 38
def ml_address
  siteml = self.siteconfig['siteml']
  return siteml if ! siteml.nil? && ! siteml.empty?
  return "#{@sitename}@#{@config.ml_domain}"
end
page_url(k) click to toggle source
# File vendor/qwik/lib/qwik/site-url.rb, line 27
def page_url(k)
  return "#{self.site_url}#{k}.html"
end
permanent?() click to toggle source
# File vendor/qwik/lib/qwik/site-group.rb, line 17
def permanent?
  return @group_config.permanent?
end
resolve_all_ref(wabisabi) click to toggle source

Make index before call this method. Use parent.

# File vendor/qwik/lib/qwik/site-resolve.rb, line 16
def resolve_all_ref(wabisabi)
  wabisabi.index_each_tag(:a) {|e|
    resolve_ref(e)
  }
  return wabisabi
end
resolve_ref(w) click to toggle source
# File vendor/qwik/lib/qwik/site-resolve.rb, line 23
def resolve_ref(w)
  attr = w.attr
  return w if attr.nil?

  href = attr[:href]
  return w if href.nil? || href.empty?

  # External link.
  if /^(?:http|https|ftp|file):\/\// =~ href
    w.set_attr(:class=>'external')

    # Make it redirect link.
    if self.siteconfig['redirect'] == 'true'
      w.set_attr(:href=>".redirect?url=#{href}")
    end
    
    return w
  end

  # Error check.
  return w if href.include?('?')    # ignore command link
  return w if href[0] == ?/ # already resolved
  return w if /\.html\z/ !~ href    # ignore not html file

  linkbase = href.sub(/\.html\z/, '')
  text = w[2]

  t = linkbase
  page = self.get_by_title(t)
  if page && page.key != t
    w.set_attr(:href=>page.key+'.html')
    return w
  end

  # Create a new page link.
  if ! self.exist?(linkbase)
    newlinkbase = linkbase.escape
    edithref = ".new?t=#{newlinkbase}"

    return [:span, {:class=>'new'}, text,
      [:a, {:href=>edithref},
        [:img, {:src=>'.theme/i/new.png', :alt=>'create'}]]]

  end

  # Rewrite inside to the page title.
  if linkbase == text
    t = self[linkbase].get_title
    return w if t == linkbase
    w[2] = t
    return w
  end

  return w
end
rrefs(k = 'FronPage') click to toggle source
# File vendor/qwik/lib/qwik/site-rrefs.rb, line 11
def rrefs(k = 'FronPage')
  page = self[k]
  return nil if page.nil?
  page.rrefs = PageRRefs.new(@path.to_s, k) if page.rrefs.nil?
  return page.rrefs
end
search_parse_query(query) click to toggle source
# File vendor/qwik/lib/qwik/site-search.rb, line 66
def search_parse_query(query)
  return query.strip.split.map{|e| e.downcase }.uniq
end
send_report() click to toggle source
# File vendor/qwik/lib/qwik/site-report.rb, line 80
def send_report
  rep = self.make_report
  return nil if rep.nil?
  list = self.member.list(false)    # Without obfuscation.

  list.each {|user|
    mail = generate_report_mail(user, rep)
    sm = Sendmail.new(@config.smtp_host, @config.smtp_port, @config.test)
    begin
      sm.send(mail)
    rescue => e
      p 'error '+e
    end
  }
  self.delete('_SiteChanged')               # Destructive.
end
site_url() click to toggle source
# File vendor/qwik/lib/qwik/site-url.rb, line 21
def site_url
  siteurl = self.siteconfig['siteurl']
  return siteurl if ! siteurl.nil? && ! siteurl.empty?
  return "#{@config.public_url}#{self.url_path}"
end
siteconfig() click to toggle source
# File vendor/qwik/lib/qwik/site-config.rb, line 9
def siteconfig
  # @siteconfig = SiteConfig.new(@config, self) unless defined? @siteconfig
  #return @siteconfig
  return SiteConfig.new(@config, self)
end
sitedb() click to toggle source
# File vendor/qwik/lib/qwik/site-db.rb, line 9
def sitedb
  @sitedb = SiteDB.new(@config, self) unless defined? @sitedb
  return @sitedb
end
sitelog() click to toggle source
# File vendor/qwik/lib/qwik/site-log.rb, line 9
def sitelog
  @sitelog = SiteLog.new(@config, self) unless defined? @sitelog
  @sitelog
end
sitemonitor() click to toggle source
# File vendor/qwik/lib/qwik/site-monitor.rb, line 11
def sitemonitor
  @sitemonitor = SiteMonitor.new(@config, self) unless defined? @sitemonitor
  return @sitemonitor
end
timeline() click to toggle source

called from act-chronology

# File vendor/qwik/lib/qwik/site-timeline.rb, line 16
def timeline
  @timeline = SiteTimeLine.new(self) unless defined? @timeline
  return @timeline
end
title() click to toggle source
# File vendor/qwik/lib/qwik/site-url.rb, line 44
def title
  sitetitle = self.siteconfig['sitename']
  if ! sitetitle.nil? && sitetitle.empty?
    return '' if @config.test
    sitetitle = self.site_url.sub(%r|\Ahttp://|, "").sub(%r|/\z|, "")
    #sitetitle = sitetitle.sub(%r|\Awww\.|, "")
  end
  return sitetitle
end
title_list() click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 22
def title_list();   @pages.title_list;        end
to_a(*a) click to toggle source
# File vendor/qwik/lib/qwik/site-pages.rb, line 17
def to_a(*a)        @pages.to_a(*a);       end
top_site?() click to toggle source
# File vendor/qwik/lib/qwik/site-url.rb, line 71
def top_site?
  return (@sitename == @config.default_sitename)
end
unconfirmed?() click to toggle source
# File vendor/qwik/lib/qwik/site-group.rb, line 47
def unconfirmed?
  member.list.empty? &&
    @pages.exist?('_GroupWaitingMembers') &&
    @pages.exist?('_GroupWaitingMessage')
end
url_path() click to toggle source
# File vendor/qwik/lib/qwik/site-url.rb, line 31
def url_path
  siteurl = self.siteconfig['siteurl']
  return '' if siteurl.nil?
  return '' if ! siteurl.empty? || self.top_site?
  return "#{@sitename}/"
end

Private Instance Methods

create_snippet(mds) click to toggle source
# File vendor/qwik/lib/qwik/site-search.rb, line 78
def create_snippet(mds)
  #sort as first hit keyword goes first
  mds = mds.sort {|i, j| i.begin(0) <=> j.begin(0) }
  max_width = 400

  # merge snippets of each search key
  #
  #        snip[s,      e]
  #|============|1st key|=============|
  snip = [mds[0].begin(0), mds[0].end(0)]

  mds[1..-1].each {|md|
    #|=====|1st key|==...==|last key|========|a key|===..===|
    # snip[s,                      e]        ^
    #                                        |md.begin(0)
    #       <-------------------------.......----->
    #                     max_width
    #            this is the length of bytes, not characters
    if md.begin(0) < snip[0] + max_width
      # extends snip end
      # snip[s,                                     e]
      #|====|1st key|==...==|last key|========|a key|===..===|
      snip[1] = md.end(0) 
    end
  }

  #all md(MatchData) has same input string
  all_string = mds[0].string

  snippet = all_string[snip[0]...snip[1]]
  len = snippet.mb_length # character length
  rest = (max_width - len) / 2
  if 0 < rest
    # we have shot snippet, adding additional strings
    pre = all_string[0...snip[0]]
    post = all_string[snip[1]..-1]

    if rest < pre.size
      pre = pre.mb_substring(-rest, pre.length)
    end

    if rest < post.size
      post = post.mb_substring(0, rest)
    end
    snippet = pre + snippet + post
  end
  
  return snippet
end
generate_plan(pages, now) click to toggle source
# File vendor/qwik/lib/qwik/site-plan.rb, line 48
def generate_plan(pages, now)
  return '' if pages.empty?

  # Select near futer.  From yesterday to 1 month in the future.
  pages = plan_select_future(pages, now)
  pages = plan_select_near_future(pages, now)
  return '' if pages.empty?

  # Sort by date.
  pages = pages.sort_by {|pagekey, datei|
    datei
  }

  str = "* Plan\n"
  pages.each {|pagekey, datei|
    date = Time.at(datei)
    date_abbr = Time.date_abbr(now, date)

    page = self[pagekey]
    title = page.get_title

    url = self.page_url(pagekey)

    str << "- [#{date_abbr}] #{title}\n"
    str << url+"\n"
  }

  return str
end
init_group_config() click to toggle source
# File vendor/qwik/lib/qwik/site-group.rb, line 55
def init_group_config
  # in group-db.rb
  db = QuickML::GroupDB.new(@config.sites_dir.to_s, @sitename)
  db.set_site(self)
  # in group-config.rb
  @group_config = QuickML::GroupConfig.new(db)
end
plan_select_future(pages, now) click to toggle source
# File vendor/qwik/lib/qwik/site-plan.rb, line 78
def plan_select_future(pages, now)
  day = 60*60*24            # 1 day
  nowi = now.to_i
  return pages.select {|pagekey, datei|
    diff = datei - nowi
    -day < diff
  }
end
plan_select_near_future(pages, now) click to toggle source
# File vendor/qwik/lib/qwik/site-plan.rb, line 87
def plan_select_near_future(pages, now)
  month = 60*60*24*30       # 1 month
  nowi = now.to_i
  return pages.select {|pagekey, datei|
    diff = datei - nowi
    diff < month
  }
end
wiki_to_string(wiki) click to toggle source
# File vendor/qwik/lib/qwik/site-search.rb, line 72
def wiki_to_string(wiki)
  tokens = Qwik::TextTokenizer.tokenize(wiki, true)
  wabisabi = Qwik::TextParser.make_tree(tokens)
  return wabisabi.flatten.select{|a| a.class == String}.join(" ")
end