Added support for user, user_roles, page, blog export and import.

Added basic support for comments, for now mainly viewing comments from database (no submission forms yet).
Added first simple wikitext filter (render wikitext content as xhtml).
Ensure response content type is text/html with utf-8 charset.
This commit is contained in:
2017-01-27 11:57:52 +01:00
parent 2d698f604b
commit 7c398a9f33
45 changed files with 2284 additions and 271 deletions

View File

@@ -0,0 +1,401 @@
note
description: "Summary description for {DATE_TIME_AGO_CONVERTER}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
DATE_TIME_AGO_CONVERTER
create
make
feature {NONE} -- Initialization
make
local
dt_now, dt_now_utc: DATE_TIME
l_duration: DATE_TIME_DURATION --like {DATE_TIME}.relative_duration
do
create dt_now.make_now
create dt_now_utc.make_now_utc
l_duration := dt_now_utc.relative_duration (dt_now)
utc_offset := l_duration.hour
smart_date_kind := smart_date_duration_kind
end
feature -- Access
append_date_to (a_text: READABLE_STRING_GENERAL; a_utc_date_time: detachable DATE_TIME; a_output: STRING_GENERAL)
require
valid_smart_date_kind: smart_date_kind > 0 implies valid_smart_date_kind (smart_date_kind)
do
if a_utc_date_time /= Void then
inspect smart_date_kind
when Smart_date_duration_kind then
a_output.append (smart_date_duration (a_utc_date_time))
when Smart_date_short_kind then
a_output.append (short_date (a_utc_date_time))
else
if attached date_time_format as l_format then
a_output.append (formatted_date_time (timezoned_date_time (a_utc_date_time), l_format))
else
a_output.append (a_text)
end
end
else
a_output.append (a_text)
end
end
date_time_format: detachable STRING
utc_offset: INTEGER
utc_offset_minute: INTEGER
smart_date_kind: INTEGER
feature -- Constants
smart_date_none_kind: INTEGER = 0
smart_date_duration_kind: INTEGER = 1
smart_date_short_kind: INTEGER = 2
-- smart_date_none_kind_string: STRING = "none"
-- smart_date_duration_kind_string: STRING = "duration"
-- smart_date_short_kind_string: STRING = "short date"
valid_smart_date_kind (k: INTEGER): BOOLEAN
do
inspect
k
when
smart_date_none_kind,
smart_date_duration_kind,
smart_date_short_kind
then
Result := True
else
end
end
feature -- Output
formatted_date_time (a_date_time: DATE_TIME; a_date_time_format: STRING): STRING_8
local
y,m,d,h,mn,sec: INTEGER
s32: STRING_32
s: STRING
c: CHARACTER_32
i: INTEGER
do
create s32.make (a_date_time_format.count)
from
i := 1
m := a_date_time.month
y := a_date_time.year
d := a_date_time.day
h := a_date_time.hour
mn := a_date_time.minute
sec := a_date_time.second
until
i > a_date_time_format.count
loop
c := a_date_time_format[i]
inspect c
when 'Y' then s32.append_integer (y)
when 'y' then
s := y.out
s.keep_tail (2)
s32.append_string (s)
when 'm' then
if m < 10 then
s32.append_integer (0)
end
s32.append_integer (m)
when 'n' then s32.append_integer (m)
when 'M' then
s := a_date_time.months_text [m].string
s.to_lower; s.put (s.item (1).as_upper, 1); s32.append_string (s)
when 'F' then
s := a_date_time.long_months_text [m].string
s.to_lower; s.put (s.item (1).as_upper, 1); s32.append_string (s)
when 'D' then
s := a_date_time.days_text [a_date_time.date.day_of_the_week].string
s.to_lower; s.put (s.item (1).as_upper, 1); s32.append_string (s)
when 'l' then
s := a_date_time.long_days_text [a_date_time.date.day_of_the_week].string
s.to_lower; s.put (s.item (1).as_upper, 1); s32.append_string (s)
when 'd' then
if d < 10 then
s32.append_integer (0)
end
s32.append_integer (d)
when 'j' then
s32.append_integer (d)
-- when 'z' then s32.append_integer (a_date_time.date.*year)
when 'a' then
if h >= 12 then
s32.append_character ('p'); s32.append_character ('m')
else
s32.append_character ('a'); s32.append_character ('m')
end
when 'A' then
if h >= 12 then
s32.append_character ('P'); s32.append_character ('M')
else
s32.append_character ('A'); s32.append_character ('M')
end
when 'g','h' then
if h >= 12 then
if c = 'h' and h - 12 < 10 then
s32.append_integer (0)
end
s32.append_integer (h - 12)
else
if c = 'h' and h < 10 then
s32.append_integer (0)
end
s32.append_integer (h)
end
when 'G', 'H' then
if c = 'H' and h < 10 then
s32.append_integer (0)
end
s32.append_integer (h)
when 'i' then
if mn < 10 then
s32.append_integer (0)
end
s32.append_integer (mn)
when 's' then
if sec < 10 then
s32.append_integer (0)
end
s32.append_integer (sec)
when 'u' then
s32.append_double (a_date_time.fine_second) -- CHECK result ...
when 'w' then s32.append_integer (a_date_time.date.day_of_the_week - 1)
when 'W' then s32.append_integer (a_date_time.date.week_of_year)
when 'L' then
if a_date_time.is_leap_year (y) then
s32.append_integer (1)
else
s32.append_integer (0)
end
when '\' then
if i < a_date_time_format.count then
i := i + 1
s32.append_character (a_date_time_format[i])
else
s32.append_character ('\')
end
else
s32.append_character (c)
end
i := i + 1
end
Result := s32
end
timezoned_date_time (a_utc_date_time: DATE_TIME): DATE_TIME
do
if utc_offset /= 0 or utc_offset_minute /= 0 then
Result := a_utc_date_time.deep_twin
Result.hour_add (utc_offset)
Result.minute_add (utc_offset_minute)
else
Result := a_utc_date_time
end
end
short_date (a_utc_date_time: DATE_TIME): STRING_8
local
l_date_time: DATE_TIME
l_now: DATE
cy,cm,cd,y,m,d,h,i: INTEGER
s: STRING
l_duration: DATE_TIME_DURATION --like {DATE_TIME}.relative_duration
do
create l_date_time.make_now_utc
l_duration := l_date_time.relative_duration (a_utc_date_time)
create l_now.make_now
cy := l_now.year
cm := l_now.month
cd := l_now.day
l_date_time := timezoned_date_time (a_utc_date_time)
y := l_date_time.date.year
m := l_date_time.date.month
d := l_date_time.date.day
if cy /= y then
if attached date_time_format as l_format then
Result := formatted_date_time (l_date_time, l_format)
else
Result := d.out + "/" + m.out + "/" + y.out
end
elseif cm /= m then
s := l_date_time.months_text [m].string
s.to_lower; s.put (s.item (1).as_upper, 1)
Result := s
Result.append (" ")
Result.append (d.out)
elseif cd /= d then
s := l_date_time.months_text [m].string
s.to_lower; s.put (s.item (1).as_upper, 1)
Result := s
Result.append (" ")
Result.append (d.out)
if l_duration.day < 7 then
s := l_date_time.days_text [l_date_time.date.day_of_the_week].string
s.to_lower; s.put (s.item (1).as_upper, 1)
Result.append (" - " + s)
end
else
check cd = d and cy = y and cm = m end
h := l_date_time.time.hour
i := l_date_time.time.minute
if h < 10 then
Result := "0" + h.out
else
Result := h.out
end
Result.append (":")
if i < 10 then
Result.append ("0")
end
Result.append (i.out)
end
end
smart_date_duration (a_utc_date_time: DATE_TIME): STRING_8
local
l_date_time: DATE_TIME
l_now: DATE_TIME
l_duration: DATE_TIME_DURATION --like {DATE_TIME}.relative_duration
l_duration_time: TIME_DURATION --like {DATE_TIME_DURATION}.time
y,m,w,d,h,i: INTEGER
w_now,w_utc: INTEGER
l_s_code: NATURAL_32
l_space_ago_string: STRING
do
l_s_code := ('s').natural_32_code
l_space_ago_string := " ago"
create l_now.make_now_utc
l_duration := l_now.relative_duration (a_utc_date_time)
y := l_duration.date.year
m := l_duration.date.month
d := l_duration.date.day
w_now := l_now.date.week_of_year
w_utc := a_utc_date_time.date.week_of_year
if y > 0 then
if y = 1 then
Result := "last year"
else
Result := y.out + " years"
-- if m > 0 then
-- Result.append (" and " + m.out + " month")
-- if m > 1 then
-- Result.append_code (l_s_code)
-- end
-- end
Result.append (l_space_ago_string)
end
elseif m > 0 then
if m = 1 then
Result := "last month"
else
Result := m.out + " months"
-- if d > 0 then
-- Result.append (" and " + d.out + " day")
-- if d > 1 then
-- Result.append_code (l_s_code)
-- end
-- end
Result.append (l_space_ago_string)
end
elseif d >= 7 then
w := d // 7
if w = 1 and then w_now = w_utc + 1 then
Result := "last week"
else
Result := (w+1).out + " weeks"
-- if d > 7 then
-- Result.append (" and " + (d - 7).out + " day")
-- if d - 7 > 1 then
-- Result.append_code (l_s_code)
-- end
-- end
Result.append (l_space_ago_string)
end
elseif d > 0 then
if w_now /= w_utc then
Result := "last week"
else
l_duration_time := l_duration.time
if d = 1 then
Result := "yesturday"
else
Result := d.out + " days"
-- if d = 1 then
-- h := l_duration_time.hour
-- if h > 0 then
-- Result.append (" and " + h.out + " hour")
-- if h > 1 then
-- Result.append_code (l_s_code)
-- end
-- end
-- end
Result.append (l_space_ago_string)
end
end
elseif d = 0 then
l_duration_time := l_duration.time
h := l_duration_time.hour
if h > 0 then
if h = 1 then
Result := "last hour"
else
Result := h.out + " hours"
Result.append (l_space_ago_string)
end
else
i := l_duration_time.minute
if i = 0 then
Result := l_duration_time.second.out + " second"
if l_duration_time.second > 1 then
Result.append_code (l_s_code)
end
else
Result := i.out + " minute"
if i > 1 then
Result.append_code (l_s_code)
end
end
Result.append (l_space_ago_string)
end
else
l_date_time := timezoned_date_time (a_utc_date_time)
if attached date_time_format as l_format then
Result := formatted_date_time (l_date_time, l_format)
else
Result := l_date_time.out
end
end
end
note
copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end