Added feed aggregation module.
Redesigned the CMS_BLOCK system,
- added condition attribute. It can be set via configuration file
with
[blocks]
{blockid}.region={region_name}
{blockid}.conditions[]=is_front
{blockid}.conditions[]=path:location-path/foo/bar
- For backward compatibility, the CMS will check only conditions for block name prefixed by "?".
Improved the configuration library to support list and table properties.
Updated theme for now, to include the feed examples.
Added "cache" classes, to ease caching of html output for instance. (TODO: improve by providing a cache manager).
This commit is contained in:
@@ -33,11 +33,53 @@ feature -- Query
|
||||
end
|
||||
end
|
||||
|
||||
resolved_text_list_item (k: READABLE_STRING_GENERAL): detachable LIST [READABLE_STRING_32]
|
||||
-- List of String item associated with key `k',
|
||||
-- and expanded values to resolved variables ${varname}.
|
||||
do
|
||||
if attached text_list_item (k) as lst then
|
||||
from
|
||||
lst.start
|
||||
until
|
||||
lst.after
|
||||
loop
|
||||
lst.replace (resolved_expression (lst.item))
|
||||
lst.forth
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
resolved_text_table_item (k: READABLE_STRING_GENERAL): detachable STRING_TABLE [READABLE_STRING_32]
|
||||
-- Table of String item associated with key `k',
|
||||
-- and expanded values to resolved variables ${varname}.
|
||||
do
|
||||
if attached text_table_item (k) as tb then
|
||||
from
|
||||
tb.start
|
||||
until
|
||||
tb.after
|
||||
loop
|
||||
tb.replace (resolved_expression (tb.item_for_iteration), tb.key_for_iteration)
|
||||
tb.forth
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
text_item (k: READABLE_STRING_GENERAL): detachable READABLE_STRING_32
|
||||
-- String item associated with key `k'.
|
||||
deferred
|
||||
end
|
||||
|
||||
text_list_item (k: READABLE_STRING_GENERAL): detachable LIST [READABLE_STRING_32]
|
||||
-- List of String item associated with key `k'.
|
||||
deferred
|
||||
end
|
||||
|
||||
text_table_item (k: READABLE_STRING_GENERAL): detachable STRING_TABLE [READABLE_STRING_32]
|
||||
-- Table of String item associated with key `k'.
|
||||
deferred
|
||||
end
|
||||
|
||||
integer_item (k: READABLE_STRING_GENERAL): INTEGER
|
||||
-- Integer item associated with key `k'.
|
||||
deferred
|
||||
@@ -109,7 +151,7 @@ feature -- Duplication
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2014, Jocelyn Fiat, Eiffel Software and others"
|
||||
copyright: "2011-2015, Jocelyn Fiat, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
|
||||
@@ -119,14 +119,47 @@ feature -- Access: Config Reader
|
||||
|
||||
text_item (k: READABLE_STRING_GENERAL): detachable READABLE_STRING_32
|
||||
-- String item associated with key `k'.
|
||||
local
|
||||
obj: like item
|
||||
do
|
||||
obj := item (k)
|
||||
if attached {READABLE_STRING_32} obj as s32 then
|
||||
Result := s32
|
||||
elseif attached {READABLE_STRING_8} obj as s then
|
||||
Result := utf.utf_8_string_8_to_escaped_string_32 (s)
|
||||
Result := value_to_string_32 (item (k))
|
||||
end
|
||||
|
||||
text_list_item (k: READABLE_STRING_GENERAL): detachable LIST [READABLE_STRING_32]
|
||||
-- List of String item associated with key `k'.
|
||||
do
|
||||
if attached {LIST [READABLE_STRING_8]} item (k) as l_list then
|
||||
create {ARRAYED_LIST [READABLE_STRING_32]} Result.make (l_list.count)
|
||||
Result.compare_objects
|
||||
across
|
||||
l_list as ic
|
||||
until
|
||||
Result = Void
|
||||
loop
|
||||
if attached value_to_string_32 (ic.item) as s32 then
|
||||
Result.force (s32)
|
||||
else
|
||||
Result := Void
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
text_table_item (k: READABLE_STRING_GENERAL): detachable STRING_TABLE [READABLE_STRING_32]
|
||||
-- Table of String item associated with key `k'.
|
||||
do
|
||||
if attached {STRING_TABLE [READABLE_STRING_8]} item (k) as l_list then
|
||||
create {STRING_TABLE [READABLE_STRING_32]} Result.make (l_list.count)
|
||||
Result.compare_objects
|
||||
across
|
||||
l_list as ic
|
||||
until
|
||||
Result = Void
|
||||
loop
|
||||
if attached value_to_string_32 (ic.item) as s32 then
|
||||
Result.force (s32, ic.key)
|
||||
else
|
||||
Result := Void
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -226,6 +259,15 @@ feature -- Access
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
value_to_string_32 (obj: detachable ANY): detachable STRING_32
|
||||
do
|
||||
if attached {READABLE_STRING_32} obj as s32 then
|
||||
Result := s32
|
||||
elseif attached {READABLE_STRING_8} obj as s then
|
||||
Result := utf.utf_8_string_8_to_escaped_string_32 (s)
|
||||
end
|
||||
end
|
||||
|
||||
item_from_values (a_values: STRING_TABLE [ANY]; k: READABLE_STRING_GENERAL): detachable ANY
|
||||
local
|
||||
i,j: INTEGER
|
||||
@@ -460,7 +502,7 @@ feature {NONE} -- Implementation
|
||||
invariant
|
||||
|
||||
note
|
||||
copyright: "2011-2014, Jocelyn Fiat, Eiffel Software and others"
|
||||
copyright: "2011-2015, Jocelyn Fiat, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
|
||||
@@ -63,10 +63,46 @@ feature -- Access: Config Reader
|
||||
text_item (k: READABLE_STRING_GENERAL): detachable READABLE_STRING_32
|
||||
-- String item associated with query `k'.
|
||||
do
|
||||
if attached {JSON_STRING} item (k) as l_string then
|
||||
Result := l_string.unescaped_string_32
|
||||
elseif attached {JSON_NUMBER} item (k) as l_number then
|
||||
Result := l_number.item
|
||||
Result := value_to_string_32 (item (k))
|
||||
end
|
||||
|
||||
text_list_item (k: READABLE_STRING_GENERAL): detachable LIST [READABLE_STRING_32]
|
||||
-- List of String item associated with key `k'.
|
||||
do
|
||||
if attached {JSON_ARRAY} item (k) as l_array then
|
||||
create {ARRAYED_LIST [READABLE_STRING_32]} Result.make (l_array.count)
|
||||
Result.compare_objects
|
||||
across
|
||||
l_array as ic
|
||||
until
|
||||
Result = Void
|
||||
loop
|
||||
if attached value_to_string_32 (ic.item) as s32 then
|
||||
Result.force (s32)
|
||||
else
|
||||
Result := Void
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
text_table_item (k: READABLE_STRING_GENERAL): detachable STRING_TABLE [READABLE_STRING_32]
|
||||
-- Table of String item associated with key `k'.
|
||||
do
|
||||
if attached {JSON_OBJECT} item (k) as obj then
|
||||
create {STRING_TABLE [READABLE_STRING_32]} Result.make (obj.count)
|
||||
Result.compare_objects
|
||||
across
|
||||
obj as ic
|
||||
until
|
||||
Result = Void
|
||||
loop
|
||||
if attached value_to_string_32 (ic.item) as s32 then
|
||||
Result.force (s32, ic.key.item)
|
||||
else
|
||||
Result := Void
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -105,6 +141,15 @@ feature -- Access
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
value_to_string_32 (v: detachable ANY): detachable STRING_32
|
||||
do
|
||||
if attached {JSON_STRING} v as l_string then
|
||||
Result := l_string.unescaped_string_32
|
||||
elseif attached {JSON_NUMBER} v as l_number then
|
||||
Result := l_number.item
|
||||
end
|
||||
end
|
||||
|
||||
object_json_value (a_object: JSON_OBJECT; a_query: READABLE_STRING_32): detachable JSON_VALUE
|
||||
-- Item associated with query `a_query' from object `a_object' if any.
|
||||
local
|
||||
@@ -163,7 +208,7 @@ feature {NONE} -- JSON
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2014, Jocelyn Fiat, Eiffel Software and others"
|
||||
copyright: "2011-2015, Jocelyn Fiat, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
|
||||
@@ -21,6 +21,18 @@ feature -- Test
|
||||
create {INI_CONFIG} cfg.make_from_string ("[
|
||||
foo = bar
|
||||
|
||||
collection[] = a
|
||||
collection[] = b
|
||||
collection[] = c
|
||||
collection[] = 1
|
||||
collection[] = 2
|
||||
collection[] = 3
|
||||
|
||||
table[a] = 1
|
||||
table[b] = 2
|
||||
table[c] = 3
|
||||
table[d] = test
|
||||
|
||||
[first]
|
||||
abc = 1
|
||||
def = and so on
|
||||
@@ -58,6 +70,21 @@ feature -- Test
|
||||
assert ("has_item (second.is)", cfg.has_item ("second.is"))
|
||||
assert ("item (second.is)", attached cfg.text_item ("second.is") as v and then v.same_string_general ("2"))
|
||||
|
||||
assert ("has_item (collection)", cfg.has_item ("collection"))
|
||||
assert ("item (collection)", attached cfg.text_list_item ("collection") as lst and then (
|
||||
lst.has ("a") and lst.has ("b") and lst.has ("c") and lst.has ("1") and lst.has ("2") and lst.has ("3")
|
||||
)
|
||||
)
|
||||
|
||||
assert ("has_item (table)", cfg.has_item ("table"))
|
||||
assert ("item (table)", attached cfg.text_table_item ("table") as tb and then (
|
||||
tb.item ("a") ~ {STRING_32} "1" and
|
||||
tb.item ("b") ~ {STRING_32} "2" and
|
||||
tb.item ("c") ~ {STRING_32} "3" and
|
||||
tb.item ("d") ~ {STRING_32} "test"
|
||||
)
|
||||
)
|
||||
|
||||
if attached cfg.sub_config ("second") as cfg_second then
|
||||
assert ("has_item (is)", cfg_second.has_item ("is"))
|
||||
assert ("item (is)", attached cfg_second.text_item ("is") as v and then v.same_string_general ("2"))
|
||||
@@ -141,7 +168,9 @@ feature -- Test
|
||||
"is": 2,
|
||||
"the": 3,
|
||||
"end": 4
|
||||
}
|
||||
},
|
||||
"collection": ["a", "b", "c", 1, 2, 3],
|
||||
"table": { "a": 1, "b": 2, "c": 3, "d" : "test" }
|
||||
}
|
||||
]")
|
||||
|
||||
@@ -164,6 +193,21 @@ feature -- Test
|
||||
assert ("item (second.the)", attached cfg.text_item ("second.the") as v and then v.same_string_general ("3"))
|
||||
assert ("item (second.end)", attached cfg.text_item ("second.end") as v and then v.same_string_general ("4"))
|
||||
|
||||
assert ("has_item (collection)", cfg.has_item ("collection"))
|
||||
assert ("item (collection)", attached cfg.text_list_item ("collection") as lst and then (
|
||||
lst.has ("a") and lst.has ("b") and lst.has ("c") and lst.has ("1") and lst.has ("2") and lst.has ("3")
|
||||
)
|
||||
)
|
||||
|
||||
assert ("has_item (table)", cfg.has_item ("table"))
|
||||
assert ("item (table)", attached cfg.text_table_item ("table") as tb and then (
|
||||
tb.item ("a") ~ {STRING_32} "1" and
|
||||
tb.item ("b") ~ {STRING_32} "2" and
|
||||
tb.item ("c") ~ {STRING_32} "3" and
|
||||
tb.item ("d") ~ {STRING_32} "test"
|
||||
)
|
||||
)
|
||||
|
||||
if attached cfg.sub_config ("second") as cfg_second then
|
||||
assert ("has_item (is)", cfg_second.has_item ("is"))
|
||||
assert ("item (is)", attached cfg_second.text_item ("is") as v and then v.same_string_general ("2"))
|
||||
|
||||
Reference in New Issue
Block a user