kinbote 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/kinbote +2 -1
- data/kinbote.gemspec +4 -2
- data/lib/kinbote/attribute.rb +19 -47
- data/lib/kinbote/base.rb +2 -1
- data/lib/kinbote/kinfile.rb +71 -0
- data/lib/kinbote/page.rb +85 -71
- data/lib/kinbote/page_match.rb +2 -2
- data/lib/kinbote/site.rb +79 -112
- data/lib/kinbote/util.rb +17 -5
- data/lib/kinbote/value.rb +10 -28
- data/lib/sinatra/kinbote.rb +12 -14
- data/lib/sinatra/kinbote_helpers.rb +2 -12
- data/site/.kinbote/views/attributes.haml +2 -2
- data/site/.kinbote/views/examples/header.haml +3 -9
- data/site/.kinbote/views/examples/home.haml +10 -16
- data/site/.kinbote/views/examples/page_attributes_title.haml +0 -1
- data/site/.kinbote/views/examples/related.haml +9 -9
- data/site/.kinbote/views/examples/related2.haml +5 -5
- data/site/.kinbote/views/examples/related_any.haml +4 -3
- data/site/.kinbote/views/examples/specific.haml +1 -1
- data/site/.kinbote/views/layout.haml +2 -0
- data/site/.kinbote/views/messages.haml +5 -0
- data/site/.kinbote/views/pages.haml +1 -1
- data/site/.kinbote/views/site.haml +1 -1
- data/site/kinbote-server +1 -6
- data/site/views/index.haml +7 -0
- data/site/views/layout.haml +1 -2
- data/site/views/snippets/sample.haml +1 -1
- metadata +46 -17
data/lib/kinbote/site.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module Kinbote
|
2
2
|
class Site
|
3
3
|
include Util
|
4
|
-
|
5
|
-
|
4
|
+
attr_reader :kinbote_path, :config
|
5
|
+
|
6
|
+
BAD_PAGE_SLUGS = ["kinbote"]
|
6
7
|
|
7
8
|
def initialize
|
8
9
|
@pages = []
|
@@ -10,31 +11,87 @@ module Kinbote
|
|
10
11
|
@values = []
|
11
12
|
@kinbote_path = nil
|
12
13
|
@config = {}
|
14
|
+
@messages = []
|
13
15
|
end
|
14
16
|
|
15
|
-
def
|
16
|
-
|
17
|
-
@kinbote_path = path
|
17
|
+
def load
|
18
|
+
load_pages
|
18
19
|
end
|
19
20
|
|
20
|
-
def
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
def reload
|
22
|
+
read_config
|
23
|
+
reload_pages
|
24
|
+
end
|
25
|
+
|
26
|
+
def find_page(slug)
|
27
|
+
@pages.each do |page|
|
28
|
+
return page if page.slug == slug
|
25
29
|
end
|
26
|
-
|
27
|
-
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
33
|
+
def find_attribute(name, page = nil)
|
34
|
+
(page ? page.attributes : @attributes).each do |attribute|
|
35
|
+
return attribute if (attribute.name == name || attribute.varname == varify(name))
|
36
|
+
end
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
|
40
|
+
def find_value(val, attribute, global = false)
|
41
|
+
(global ? @values : attribute.values).each do |value|
|
42
|
+
return value if (value.value == val && (attribute.name == value.attribute.name || attribute.varname == varify(value.attribute.name)))
|
43
|
+
end
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
|
47
|
+
def create_page(title, file=nil, attributes=nil)
|
48
|
+
if BAD_PAGE_SLUGS.include?(slugify(title))
|
49
|
+
add_message("#{title} #{file ? "(#{file})" : ""} is an invalid page title")
|
50
|
+
return false
|
28
51
|
end
|
52
|
+
@pages << Page.new(title, file, attributes)
|
29
53
|
end
|
30
54
|
|
55
|
+
def delete_page(slug)
|
56
|
+
page = find_page(slug)
|
57
|
+
@attributes.map{|att| att.remove_page(page)}
|
58
|
+
@attributes.delete_if{|att| att.pages.size == 0}
|
59
|
+
page.delete_files([:html, :css])
|
60
|
+
@pages.delete_if{|p| p.slug == page.slug}
|
61
|
+
Page.add_metadata
|
62
|
+
end
|
63
|
+
|
64
|
+
def remove_page_attributes(page)
|
65
|
+
@attributes.map{|att| att.remove_page(page)}
|
66
|
+
@attributes.delete_if{|att| att.pages.size == 0}
|
67
|
+
end
|
68
|
+
|
69
|
+
def pages
|
70
|
+
@pages.sort{|x, y| x.title <=> y.title }
|
71
|
+
end
|
72
|
+
|
73
|
+
def attributes
|
74
|
+
sorted_attributes(@attributes)
|
75
|
+
end
|
76
|
+
|
77
|
+
def kinbote_path= (path); @kinbote_path = path; end
|
78
|
+
|
79
|
+
def add_attribute(attribute); @attributes << attribute; end
|
80
|
+
def add_value(value); @values << value; end
|
81
|
+
|
82
|
+
def add_message(message); @messages << message if !@messages.include?(message); end
|
83
|
+
def has_messages?; @messages.size > 0; end
|
84
|
+
def render_messages; m = Array.new(@messages); @messages = []; m; end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
31
88
|
def load_pages
|
32
89
|
Dir.glob("#{@kinbote_path}/views/pages/**/*.{haml}").each do |file|
|
33
90
|
title, attributes = file_attributes(file)
|
34
|
-
|
91
|
+
create_page(title, file, attributes)
|
35
92
|
end
|
36
93
|
end
|
37
|
-
|
94
|
+
|
38
95
|
def reload_pages
|
39
96
|
files = Dir.glob("#{@kinbote_path}/views/pages/**/*.{haml}")
|
40
97
|
files.each do |file|
|
@@ -42,17 +99,17 @@ module Kinbote
|
|
42
99
|
title, attributes = file_attributes(file)
|
43
100
|
page = find_page(slug)
|
44
101
|
if page
|
45
|
-
next if File.size(file) == page.
|
102
|
+
next if File.size(file) == page.file_size(:html)
|
46
103
|
page.set_attributes(attributes.merge({"title" => [title]}))
|
47
|
-
page.
|
104
|
+
page.reset_file_size(:html)
|
48
105
|
else
|
49
|
-
|
106
|
+
create_page(title, file, attributes)
|
50
107
|
end
|
51
108
|
end
|
52
109
|
slugs = files.map{|file| slug_from_file(file)}
|
53
110
|
@pages.map{|page| delete_page(page.slug) if !slugs.include?(page.slug)}
|
54
111
|
end
|
55
|
-
|
112
|
+
|
56
113
|
def file_attributes(file)
|
57
114
|
title = slug_from_file(file)
|
58
115
|
attributes = {}
|
@@ -73,102 +130,12 @@ module Kinbote
|
|
73
130
|
end
|
74
131
|
[title, attributes]
|
75
132
|
end
|
76
|
-
|
77
|
-
def find_page(slug)
|
78
|
-
@pages.each do |page|
|
79
|
-
return page if page.slug == slug
|
80
|
-
end
|
81
|
-
nil
|
82
|
-
end
|
83
|
-
|
84
|
-
def find_attribute(name, page = nil)
|
85
|
-
(page ? page.attributes : @attributes).each do |attribute|
|
86
|
-
return attribute if (attribute.name == name || attribute._varname == name)
|
87
|
-
end
|
88
|
-
nil
|
89
|
-
end
|
90
|
-
|
91
|
-
def find_value(val, attribute, global = false)
|
92
|
-
(global ? @values : attribute.values).each do |value|
|
93
|
-
return value if (value.value == val && attribute.name == value.attribute.name)
|
94
|
-
end
|
95
|
-
nil
|
96
|
-
end
|
97
|
-
|
98
|
-
def create_page(title)
|
99
|
-
@pages << Page.new(title)
|
100
|
-
end
|
101
|
-
|
102
|
-
def add_attribute(attribute)
|
103
|
-
@attributes << attribute
|
104
|
-
end
|
105
|
-
|
106
|
-
def add_value(value)
|
107
|
-
@values << value
|
108
|
-
end
|
109
133
|
|
110
|
-
def
|
111
|
-
@
|
112
|
-
@
|
113
|
-
|
114
|
-
|
115
|
-
def delete_page(slug)
|
116
|
-
page = find_page(slug)
|
117
|
-
@attributes.map{|att| att.remove_page(page)}
|
118
|
-
@attributes.delete_if{|att| att.pages.size == 0}
|
119
|
-
page.delete_files
|
120
|
-
@pages.delete_if{|p| p.slug == page.slug}
|
121
|
-
add_kinbote_haml
|
122
|
-
end
|
123
|
-
|
124
|
-
def add_kinbote_haml(page = nil)
|
125
|
-
fname = "#{@kinbote_path}/views/#{page ? page.path : "index"}"
|
126
|
-
f_new = File.open("#{fname}.haml.new", "w")
|
127
|
-
File.read("#{fname}.haml").to_a.each do |line|
|
128
|
-
break if line.include?("-# Kinbote")
|
129
|
-
f_new.puts line
|
130
|
-
end
|
131
|
-
if page
|
132
|
-
kinbote_haml(f_new, "page_attributes_title")
|
133
|
-
kinbote_haml(f_new, "page_attributes", ["Title: #{page.title}"] + page.values.map{|v| "#{v.attribute.name}: #{v.value}"})
|
134
|
-
kinbote_haml(f_new, "header")
|
135
|
-
kinbote_haml(f_new, "specific", page.attributes.map{|a| a._varname})
|
136
|
-
kinbote_haml(f_new, "related", page.attributes.map{|a| a.name.downcase == "date" ? nil : a.name}.compact)
|
137
|
-
kinbote_haml(f_new, "related2", page.attributes.map{|a| "#{a.name}\", \"#{a.values.first.value}"})
|
138
|
-
kinbote_haml(f_new, "related_any")
|
139
|
-
else
|
140
|
-
kinbote_haml(f_new, "home", @attributes.map{|a| a._varname})
|
141
|
-
end
|
142
|
-
f_new.close
|
143
|
-
FileUtils.mv("#{fname}.haml.new", "#{fname}.haml")
|
144
|
-
page.set_filesize if page
|
145
|
-
add_kinbote_haml if page
|
146
|
-
end
|
147
|
-
|
148
|
-
def kinbote_haml(f, example_name, replacements=nil)
|
149
|
-
return if replacements && replacements.size == 0 && example_name != "page_attributes"
|
150
|
-
File.read("#{@kinbote_path}/.kinbote/views/examples/#{example_name}.haml").to_a.each do |line|
|
151
|
-
if replacements && line.include?("$ALL_VALS$")
|
152
|
-
replacements.each do |r|
|
153
|
-
f.puts(line.gsub("$ALL_VALS$", r))
|
154
|
-
end
|
155
|
-
elsif replacements && line.include?("$ALL_VALS_COMMENTED$")
|
156
|
-
replacements.each_with_index do |r, i|
|
157
|
-
if i == replacements.size - 1
|
158
|
-
f.puts(line.gsub("$ALL_VALS_COMMENTED$", r))
|
159
|
-
else
|
160
|
-
f.puts(line.gsub("- ", "-# ").gsub("$ALL_VALS_COMMENTED$", r))
|
161
|
-
end
|
162
|
-
end
|
163
|
-
elsif replacements && line.include?("$FIRST_VAL$")
|
164
|
-
f.puts(line.gsub("$FIRST_VAL$", replacements.first))
|
165
|
-
elsif replacements && line.include?("$LAST_VAL$")
|
166
|
-
f.puts(line.gsub("$LAST_VAL$", replacements.last))
|
167
|
-
else
|
168
|
-
f.puts(line)
|
169
|
-
end
|
134
|
+
def read_config
|
135
|
+
@config = (File.exist?("#{@kinbote_path}/config/site.yml") ? YAML::load_file("#{@kinbote_path}/config/site.yml") : {"title" => "Kinbote Site"})
|
136
|
+
@config.each do |key, value|
|
137
|
+
Site.send(:define_method, varify(key).to_sym, Proc.new{ @config[key] }) if !Site.respond_to?(varify(key).to_sym)
|
170
138
|
end
|
171
|
-
f.puts ""
|
172
139
|
end
|
173
140
|
|
174
141
|
end
|
data/lib/kinbote/util.rb
CHANGED
@@ -6,11 +6,15 @@ module Kinbote
|
|
6
6
|
slug = slug[0, slug.size - 1] if slug[-1, 1] == '-'
|
7
7
|
slug
|
8
8
|
end
|
9
|
+
|
10
|
+
def varify(str)
|
11
|
+
slugify(str).gsub('-', '_')
|
12
|
+
end
|
9
13
|
|
10
14
|
def dir_from_file(file)
|
11
15
|
file.split("/")[0...-1].join("/") + "/"
|
12
16
|
end
|
13
|
-
|
17
|
+
|
14
18
|
def file_without_extension(file)
|
15
19
|
file.split(".")[0...-1].join(".")
|
16
20
|
end
|
@@ -18,11 +22,11 @@ module Kinbote
|
|
18
22
|
def slug_from_file(file)
|
19
23
|
file.split("/").last.split(".").first
|
20
24
|
end
|
21
|
-
|
25
|
+
|
22
26
|
def type_from_file(file)
|
23
27
|
file.split(".").last
|
24
28
|
end
|
25
|
-
|
29
|
+
|
26
30
|
def output_path(file)
|
27
31
|
if type_from_file(file) == "haml"
|
28
32
|
"#{$site.kinbote_path}/www/#{view_path(file)}".gsub(".haml", ".html")
|
@@ -30,11 +34,11 @@ module Kinbote
|
|
30
34
|
"#{$site.kinbote_path}/www/#{view_path(file)}".gsub("/sass/", "/css/").gsub(".sass", ".css")
|
31
35
|
end
|
32
36
|
end
|
33
|
-
|
37
|
+
|
34
38
|
def view_path(file)
|
35
39
|
file[$site.kinbote_path.size + 7, file.size]
|
36
40
|
end
|
37
|
-
|
41
|
+
|
38
42
|
def print_state
|
39
43
|
@attributes.each do |a|
|
40
44
|
puts "#{a.name} : #{a.pages.map{|p| p.slug}.join(',')}"
|
@@ -44,5 +48,13 @@ module Kinbote
|
|
44
48
|
end
|
45
49
|
end
|
46
50
|
|
51
|
+
def sorted_attributes(attributes)
|
52
|
+
attributes.sort!{|x, y| x.name <=> y.name }
|
53
|
+
attributes.each_with_index do |attribute, i|
|
54
|
+
attributes.insert(0, attributes.delete_at(i)) if attribute.varname == "date"
|
55
|
+
end
|
56
|
+
attributes
|
57
|
+
end
|
58
|
+
|
47
59
|
end
|
48
60
|
end
|
data/lib/kinbote/value.rb
CHANGED
@@ -1,45 +1,27 @@
|
|
1
1
|
module Kinbote
|
2
2
|
class Value
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
include Kinfile
|
4
|
+
attr_reader :value, :attribute
|
5
|
+
|
6
|
+
def initialize(value, page, attribute, global=nil)
|
6
7
|
@value = value.to_s
|
7
8
|
@attribute = attribute
|
8
|
-
@
|
9
|
+
@global = global || self
|
9
10
|
@pages = [page]
|
10
|
-
@css = File.exist?(file_name(:css))
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def add_page(page)
|
14
14
|
remove_page(page)
|
15
15
|
@pages << page
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def remove_page(page)
|
19
|
-
@
|
19
|
+
@global.pages.delete_if{|p| p.slug == page.slug}
|
20
20
|
@pages.delete_if{|p| p.slug == page.slug}
|
21
21
|
end
|
22
|
-
|
23
|
-
def create_css
|
24
|
-
FileUtils.mkdir_p(file_name(:css, true)) if !File.exist?(file_name(:css, true))
|
25
|
-
File.open(file_name(:css), "w") if !File.exist?(file_name(:css))
|
26
|
-
@global_value.css!
|
27
|
-
end
|
28
|
-
|
29
|
-
def file_name(type, dir = nil)
|
30
|
-
if type == :css
|
31
|
-
return "#{$site.kinbote_path}/views/sass/attributes/#{@attribute}/#{!dir ? "#{@value}.sass" : ""}"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def css_files
|
36
|
-
@global_value.css? ? ["/css/attributes/#{@attribute}/#{@value}"] : []
|
37
|
-
end
|
38
22
|
|
39
|
-
def pages; @
|
23
|
+
def pages; @global == self ? @pages : @global.pages; end
|
40
24
|
def to_s; @value; end
|
41
|
-
|
42
|
-
def css?; @global_value == self ? @css : @global_value.css?; end
|
43
|
-
|
25
|
+
|
44
26
|
end
|
45
27
|
end
|
data/lib/sinatra/kinbote.rb
CHANGED
@@ -11,22 +11,21 @@ module Kinbote
|
|
11
11
|
|
12
12
|
configure do
|
13
13
|
$site = Site.new
|
14
|
-
$site.
|
14
|
+
$site.load
|
15
15
|
end
|
16
16
|
|
17
17
|
before do
|
18
|
-
$site.
|
19
|
-
$site.
|
20
|
-
$site.reload_pages
|
18
|
+
$site.kinbote_path = options.kinbote_path
|
19
|
+
$site.reload
|
21
20
|
end
|
22
21
|
|
23
22
|
not_found do
|
24
|
-
|
23
|
+
set_user_variables
|
25
24
|
haml :'404'
|
26
25
|
end
|
27
26
|
|
28
27
|
error do
|
29
|
-
|
28
|
+
set_user_variables
|
30
29
|
haml :'500'
|
31
30
|
end
|
32
31
|
|
@@ -51,17 +50,17 @@ module Kinbote
|
|
51
50
|
end
|
52
51
|
|
53
52
|
post '/kinbote/pages/*/css' do
|
54
|
-
$site.find_page(params[:splat].first).
|
53
|
+
$site.find_page(params[:splat].first).create_file(:css)
|
55
54
|
redirect '/kinbote/pages'
|
56
55
|
end
|
57
56
|
|
58
57
|
post '/kinbote/attributes/css' do
|
59
|
-
$site.find_attribute(params["attribute"]).
|
58
|
+
$site.find_attribute(params["attribute"]).create_file(:css)
|
60
59
|
redirect '/kinbote/attributes'
|
61
60
|
end
|
62
61
|
|
63
62
|
post '/kinbote/values/css' do
|
64
|
-
$site.find_value(params["value"], $site.find_attribute(params["attribute"]), true).
|
63
|
+
$site.find_value(params["value"], $site.find_attribute(params["attribute"]), true).create_file(:css)
|
65
64
|
redirect '/kinbote/attributes'
|
66
65
|
end
|
67
66
|
|
@@ -71,9 +70,8 @@ module Kinbote
|
|
71
70
|
end
|
72
71
|
|
73
72
|
post '/kinbote/pages/*' do
|
74
|
-
p params
|
75
73
|
@p = $site.find_page(params[:splat].first)
|
76
|
-
@p.set_attributes(
|
74
|
+
@p.set_attributes(params["page"]["keys"], params["page"]["values"])
|
77
75
|
redirect "/kinbote/pages/#{@p.slug}"
|
78
76
|
end
|
79
77
|
|
@@ -82,7 +80,7 @@ module Kinbote
|
|
82
80
|
end
|
83
81
|
|
84
82
|
post '/kinbote/publish' do
|
85
|
-
|
83
|
+
set_user_variables
|
86
84
|
publish
|
87
85
|
redirect '/kinbote'
|
88
86
|
end
|
@@ -90,7 +88,7 @@ module Kinbote
|
|
90
88
|
# -----------------------------------------------------------------------------------------
|
91
89
|
|
92
90
|
get '/' do
|
93
|
-
|
91
|
+
set_user_variables
|
94
92
|
haml :index
|
95
93
|
end
|
96
94
|
|
@@ -106,7 +104,7 @@ module Kinbote
|
|
106
104
|
end
|
107
105
|
|
108
106
|
get '/*.html' do
|
109
|
-
|
107
|
+
set_user_variables
|
110
108
|
@page = $site.find_page(params[:splat].first)
|
111
109
|
haml :"#{@page ? "#{@page.path}" : "404"}"
|
112
110
|
end
|
@@ -6,21 +6,11 @@ module Sinatra
|
|
6
6
|
haml("snippets/#{path}".to_sym, :layout => false)
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
9
|
+
def set_user_variables
|
10
10
|
@site = $site
|
11
11
|
@pages = $site.pages
|
12
12
|
@attributes = $site.attributes
|
13
|
-
@attributes.each{|att| eval("@#{att.
|
14
|
-
end
|
15
|
-
|
16
|
-
def kv_to_attributes(keys, values)
|
17
|
-
attributes = {}
|
18
|
-
keys.each_with_index do |key, i|
|
19
|
-
next if key.size == 0
|
20
|
-
attributes[key] = [] if !attributes.has_key?(key)
|
21
|
-
attributes[key] << values[i] if !attributes[key].include?(values[i])
|
22
|
-
end
|
23
|
-
attributes
|
13
|
+
@attributes.each{|att| eval("@#{att.varname} = att if !@#{att.varname}")}
|
24
14
|
end
|
25
15
|
|
26
16
|
def publish
|