#
# 00default.rb: default plugins
#
# Copyright (C) 2010, TADA Tadashi
# You can redistribute it and/or modify it under GPL2 or any later version.
#
#
# setting @date
#
unless @date
if @diary then
@date = @diary.date
else
@date = case @mode
when 'day'
Time::local( *@cgi.params['date'][0].scan( /^(\d{4})(\d\d)(\d\d)/ ).flatten )
when 'month'
Time::local( *@cgi.params['date'][0].scan( /^(\d{4})(\d\d)/ ).flatten )
when 'edit'
Time::local( @cgi.params['year'][0].to_i, @cgi.params['month'][0].to_i, @cgi.params['day'][0].to_i )
else
nil
end
end
end
#
# make navigation buttons
#
def navi
result = %Q[
\n]
result << navi_user
result << navi_admin
result << %Q[
]
end
def navi_item( link, label, rel = nil )
result = %Q[#{label}\n]
end
def navi_user
result = navi_user_default
case @mode
when 'latest'
result << navi_user_latest
when 'day'
result << navi_user_day
when 'month'
result << navi_user_month
when 'nyear'
result << navi_user_nyear
when 'edit'
result << navi_user_edit
else
result << navi_user_else
end
result
end
def navi_user_default
result = ''
result << navi_item( h(@conf.index_page), h(navi_index) ) unless @conf.index_page.empty?
result
end
def navi_user_latest
result = ''
result << navi_item( "#{h @conf.index}#{anchor( @conf['ndays.prev'] + '-' + @conf.latest_limit.to_s )}", "«#{navi_prev_ndays}", "next" ) if @conf['ndays.prev'] and not bot?
result << navi_item( h(@conf.index), h(navi_latest) ) if @cgi.params['date'][0]
result << navi_item( "#{h @conf.index}#{anchor( @conf['ndays.next'] + '-' + @conf.latest_limit.to_s )}", "#{navi_next_ndays}»", "prev") if @conf['ndays.next'] and not bot?
result
end
def navi_user_day
result = ''
if @navi_user_days then
result << navi_item( "#{h @conf.index}#{anchor @navi_user_days[0]}", "«#{h navi_prev_diary(navi_user_format(@navi_user_days[0]))}" ) if @navi_user_days[0]
result << navi_item( h(@conf.index), h(navi_latest) )
result << navi_item( "#{h @conf.index}#{anchor @navi_user_days[2]}", "#{h navi_next_diary(navi_user_format(@navi_user_days[2]))}»" ) if @navi_user_days[2]
end
result
end
def navi_user_month
ym = []
@years.keys.each do |y|
ym += @years[y].collect {|m| y + m}
end
ym.sort!
now = @date.strftime( '%Y%m' )
return '' unless ym.index( now )
prev_month = ym.index( now ) == 0 ? nil : ym[ym.index( now )-1]
next_month = ym[ym.index( now )+1]
result = ''
result << navi_item( "#{h @conf.index}#{anchor( prev_month )}", "«#{h navi_prev_month}" ) if prev_month and not bot?
result << navi_item( h(@conf.index), h(navi_latest) )
result << navi_item( "#{h @conf.index}#{anchor( next_month )}", "#{h navi_next_month}»" ) if next_month and not bot?
result
end
def navi_user_nyear
result = ''
result << navi_item( "#{h @conf.index}#{anchor @prev_day[4,4]}", "«#{h navi_prev_nyear(Time::local(*@prev_day.scan(/^(\d{4})(\d\d)(\d\d)$/)[0]))}" ) if @prev_day
result << navi_item( h(@conf.index), h(navi_latest) ) unless @mode == 'latest'
result << navi_item( "#{h @conf.index}#{anchor @next_day[4,4]}", "#{h navi_next_nyear(Time::local(*@next_day.scan(/^(\d{4})(\d\d)(\d\d)$/)[0]))}»" ) if @next_day
result
end
def navi_user_edit
result = ''
if @prev_day then
a = @prev_day.scan( /^(\d{4})(\d\d)(\d\d)$/ ).flatten
result << navi_item( "#{h @conf.update}?edit=true;year=#{a[0]};month=#{a[1]};day=#{a[2]}", "«#{h navi_prev_diary(Time::local(*@prev_day.scan(/^(\d{4})(\d\d)(\d\d)$/)[0]))}" )
end
result << navi_item( h(@conf.index), h(navi_latest) )
if @next_day then
a = @next_day.scan( /^(\d{4})(\d\d)(\d\d)$/ ).flatten
result << navi_item( "#{h @conf.update}?edit=true;year=#{a[0]};month=#{a[1]};day=#{a[2]}", "#{h navi_next_diary(Time::local(*@next_day.scan(/^(\d{4})(\d\d)(\d\d)$/)[0]))}»" )
end
result
end
def navi_user_else
navi_item( h(@conf.index), h(navi_latest) )
end
def navi_user_format( day )
Time::local( *day.scan( /^(\d{4})(\d\d)(\d\d)$/ )[0] )
end
def navi_admin
if @mode == 'day' then
result = navi_item( "#{h @conf.update}?edit=true;year=#{@date.year};month=#{@date.month};day=#{@date.day}", h(navi_edit), "nofollow" )
else
result = navi_item( h(@conf.update), h(navi_update), "nofollow")
end
result << navi_item( "#{h @conf.update}?conf=default", h(navi_preference) ) if /^(latest|month|day|comment|conf|nyear|category.*)$/ !~ @mode
result
end
def mobile_navi
result = []
if @navi_user_days and @navi_user_days[0]
result << %Q[[*]#{mobile_navi_prev_diary}]
end
if @mode != 'latest'
result << %Q[[0]#{mobile_navi_latest}]
end
if @navi_user_days and @navi_user_days[2]
result << %Q[[#]#{mobile_navi_next_diary}]
end
if @mode == 'day' then
result << %Q[[5]#{mobile_navi_edit}]
else
result << %Q[[5]#{mobile_navi_update}]
end
result << %Q[[8]#{mobile_navi_preference}] unless /^(latest|month|day|conf|nyear)$/ === @mode
result.join('|')
end
#
# make calendar
#
def calendar
result = %Q[
\n]
@years.keys.sort.each do |year|
result << %Q[
#{year}|]
@years[year.to_s].sort.each do |month|
m = "#{year}#{month}"
result << %Q[#{month}|]
end
result << "
\n"
end
result << "
"
end
#
# insert file
#
def insert( file )
begin
File::readlines( file ).join
rescue
%Q[
#$! (#{h $!.class}) cannot read #{h file}.
]
end
end
#
# define DOCTYPE
#
def doctype
%Q||
end
#
# default HTML header
#
add_header_proc do
calc_links
<<-HEADER
#{author_name_tag}
#{author_mail_tag}
#{index_page_tag}
#{icon_tag}
#{ogp_tag}
#{description_tag}
#{css_tag.chomp}
#{jquery_tag.chomp}
#{script_tag.chomp}
#{title_tag.chomp}
#{robot_control.chomp}
HEADER
end
def calc_links
if /day|edit/ =~ @mode then
today = @date.strftime('%Y%m%d')
days = []
yms = []
this_month = today[0,6]
@years.keys.each do |y|
yms += @years[y].collect {|m| y + m}
end
yms |= [this_month]
yms.sort!
yms.unshift(nil).push(nil)
yms[yms.index(this_month) - 1, 3].each do |ym|
next unless ym
now = @cgi.params['date'] # backup
cgi = @cgi.clone
cgi.params['date'] = [ym]
m = TDiaryMonthWithoutFilter.new(cgi, '', @conf)
@cgi.params['date'] = now # restore
m.diaries.delete_if {|date,diary| !diary.visible?}
days += m.diaries.keys.sort
end
days |= [today]
days.sort!
days.unshift(nil).push(nil)
@navi_user_days = days[days.index(today) - 1, 3]
@prev_day = @navi_user_days[0]
@next_day = @navi_user_days[2]
elsif @mode == 'nyear'
y = 2000 # specify leam year
m, d = @cgi.params['date'][0].scan(/^(\d\d)(\d\d)$/)[0]
@prev_day = (Time.local(y, m, d) - 24*60*60).strftime( '%Y%m%d' )
@next_day = (Time.local(y, m, d) + 24*60*60).strftime( '%Y%m%d' )
end
end
def charset
@conf.encoding
end
def last_modified_header
''
end
def content_script_type
''
end
def author_name_tag
if @conf.author_name and not(@conf.author_name.empty?) then
%Q[]
else
''
end
end
def author_mail_tag
if @conf.author_mail and not(@conf.author_mail.empty?) then
%Q[]
else
''
end
end
def index_page_tag
result = ''
if @conf.index_page and @conf.index_page.size > 0 then
result << %Q[\n\t]
end
if @prev_day then
case @mode
when 'day'
result << %Q[\n\t]
when 'nyear'
result << %Q[\n\t]
end
end
if @next_day then
case @mode
when 'day'
result << %Q[\n\t]
when 'nyear'
result << %Q[\n\t]
end
end
result << %Q[\n\t]
result.chop.chop
end
def icon_tag
if @conf.icon and not(@conf.icon.empty?) then
if /\.ico$/ =~ @conf.icon then
%Q[]
elsif /\.svg$/ =~ @conf.icon then
%Q[]
else
%Q[]
end
else
''
end
end
def ogp_tag
ogp = {
'og:title' => title_tag.gsub(/<[^>]*>/, ""),
}
if @conf.banner && !@conf.banner.empty?
ogp['og:image'] = @conf.banner
end
uri = @conf.index.dup
uri[0, 0] = base_url if %r|^https?://|i !~ @conf.index
uri.gsub!( %r|/\./|, '/' )
if @mode == 'day' then
ogp['og:type'] = 'article'
ogp['article:author'] = @conf.author_name
ogp['og:site_name'] = @conf.html_title
ogp['og:url'] = uri + anchor( @date.strftime( '%Y%m%d' ) )
else
ogp['og:type'] = 'website'
ogp['og:description'] = @conf.description
ogp['og:url'] = uri
end
ogp.map { |k, v|
%Q||
}.join("\n")
end
def description_tag
if @conf.description and not(@conf.description.empty?) then
%Q[]
else
''
end
end
def jquery_tag
%Q[]
end
enable_js( '00default.js', async: false )
add_js_setting( '$tDiary.style', "'#{@conf.style.downcase.sub( /\Ablog/, '' )}'" )
if /^form|edit|preview|showcomment/ =~ @mode
enable_js( '02edit.js', async: true )
end
def script_tag_query_string
"?#{TDIARY_VERSION}#{Time::now.strftime('%Y%m%d')}"
end
def js_url
@cgi.is_a?(RackCGI) ? 'assets' : 'js'
end
def script_tag
require 'uri'
query = script_tag_query_string
html = @javascripts.keys.sort.map {|script|
async = @javascripts[script][:async] ? "async" : ""
if URI(script).scheme or script =~ %r|\A//|
%Q||
else
%Q||
end
}.join( "\n\t" )
html << "\n" << <<-HEAD
HEAD
end
def theme_url
@cgi.is_a?(RackCGI) ? 'assets' : 'theme'
end
def css_tag
location, name = (@conf.theme || '').split(%r[/], 2)
if @mode =~ /conf$/ then
css = "#{h theme_url}/conf.css"
elsif name && name.length > 0
css = __send__("theme_url_#{location}", name)
css = theme_url_local('default') unless css # the location is not defined
else
css = @conf.css
end
title = File::basename( css, '.css' )
<<-CSS
CSS
end
def robot_control
if /^form|edit|preview|showcomment$/ =~ @mode then
''
else
''
end
end
#
# title of day
#
add_title_proc do |date, title|
title_of_day( date, title )
end
def title_of_day( date, title )
r = <<-HTML
#{date.strftime @conf.date_format}#{title}
HTML
return r.gsub( /^\t+/, '' ).chomp
end
add_title_proc do |date, title|
nyear_link( date, title )
end
def nyear_link( date, title )
if @conf.show_nyear and @mode != 'nyear' then
m = date.strftime( '%m' )
d = date.strftime( '%d' )
years = @years.find_all {|year, months| months.include? m}
if years.length >= 2 then
%Q|#{title} [#{nyear_diary_label}]|
else
title
end
else
title
end
end
#
# make anchor string
#
def anchor( s )
if /^([\-\d]+)#?([pct]\d*)?$/ =~ s then
if $2 then
"?date=#$1##$2"
else
"?date=#$1"
end
else
""
end
end
#
# subtitle
#
add_subtitle_proc do |date, index, subtitle|
subtitle_link( date, index, subtitle )
end
def make_category_link( subtitle )
r = ''
if subtitle
if respond_to?( :category_anchor ) then
r << subtitle.sub( /^(\[([^\[]+?)\])+/ ) do
$&.gsub( /\[(.*?)\]/ ) do
$1.split( /,/ ).collect do |c|
category_anchor( "#{CGI::unescapeHTML c}" )
end.join
end
end
else
r << subtitle
end
end
r
end
def subtitle_link( date, index, subtitle )
r = ''
if date then
r << "#{@conf.section_anchor} ]
end
r << %Q[(#{h @author}) ] if @multi_user and @author and subtitle
r << make_category_link( subtitle )
end
#
# make anchor tag in my diary
#
def my( a, str, title = nil )
date, _, frag = a.scan( /^(\d{4}|\d{6}|\d{8}|\d{8}-\d+)([^\d]*)?#?([pct]\d+)?$/ )[0]
anc = frag ? "#{date}#{frag}" : date
index = /^https?:/ =~ @conf.index ? '' : base_url
index += @conf.index.sub(%r|^\./|, '')
if title then
%Q[#{str}]
else
%Q[#{str}]
end
end
#
# other resources
#
def submit_command
if @mode == 'form' or @cgi.valid?( 'appendpreview' ) then
'append'
else
'replace'
end
end
def preview_command
if @mode == 'form' or @cgi.valid?( 'appendpreview' ) then
'appendpreview'
else
'replacepreview'
end
end
#
# make comment form
#
def comment_description
begin
if @conf.options['comment_description'].length > 0 then
return @conf.options['comment_description']
end
rescue
end
comment_description_default
end
def comment_form_text
unless @diary then
@diary = @diaries[@date.strftime( '%Y%m%d' )]
return '' unless @diary
end
r = ''
unless @conf.hide_comment_form then
r = <<-FORM
FORM
if @diary.count_comments( true ) >= @conf.comment_limit_per_day then
r << <<-FORM
|
else
''
end
end
def old_ruby_alert_message
"お使いのRuby #{RUBY_VERSION}は次のリリースからサポート対象外になります。"
end
add_conf_proc( 'old_ruby_alert', nil) do
if @mode == 'saveconf'
@conf['old_ruby_alert.hide'] = true
end
%Q|
OLD RUBY ALERT
| # dummy
end
# Local Variables:
# mode: ruby
# indent-tabs-mode: t
# tab-width: 3
# ruby-indent-level: 3
# End: