kinbote 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,10 +6,17 @@ Install the gem:
6
6
 
7
7
  sudo gem install kinbote
8
8
 
9
- Create a new kinbote project and start the local server:
9
+ Create a new kinbote project:
10
10
 
11
11
  kinbote mysite
12
+
13
+ Edit your site configuration:
14
+
12
15
  cd mysite
16
+ [edit config.yml]
17
+
18
+ Start the local server:
19
+
13
20
  ./kinbote-server
14
21
 
15
22
  Open the local site in your browser at http://localhost:4567
data/TODO ADDED
@@ -0,0 +1,3 @@
1
+ max file size for rack
2
+ draft/published?
3
+ no more @globals?
@@ -11,4 +11,5 @@ if File.exists?(name)
11
11
  end
12
12
 
13
13
  FileUtils.copy_entry("#{File.dirname(__FILE__)}/../site", name)
14
+ FileUtils.mv("#{name}/config.yml.sample", "#{name}/config.yml")
14
15
  FileUtils.mkdir_p("#{name}/public/css")
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
3
3
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
4
4
 
5
5
  s.name = 'kinbote'
6
- s.version = '0.0.2'
7
- s.date = '2010-07-11'
6
+ s.version = '0.0.3'
7
+ s.date = '2010-08-03'
8
8
 
9
9
  s.description = "Kinbote"
10
10
  s.summary = "Kinbote"
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
18
18
  LICENSE
19
19
  README.rdoc
20
20
  Rakefile
21
+ TODO
21
22
  bin/kinbote
22
23
  kinbote.gemspec
23
24
  lib/kinbote.rb
@@ -31,6 +32,10 @@ Gem::Specification.new do |s|
31
32
  lib/kinbote/value.rb
32
33
  lib/sinatra/kinbote.rb
33
34
  lib/sinatra/kinbote_helpers.rb
35
+ site/.kinbote/js/core.js
36
+ site/.kinbote/js/jquery.js
37
+ site/.kinbote/sass/core.sass
38
+ site/.kinbote/sass/reset.sass
34
39
  site/.kinbote/views/attributes.haml
35
40
  site/.kinbote/views/examples/header.haml
36
41
  site/.kinbote/views/examples/home.haml
@@ -45,7 +50,7 @@ Gem::Specification.new do |s|
45
50
  site/.kinbote/views/page.haml
46
51
  site/.kinbote/views/pages.haml
47
52
  site/.kinbote/views/site.haml
48
- site/config/site.yml
53
+ site/config.yml.sample
49
54
  site/kinbote-server
50
55
  site/public/favicon.ico
51
56
  site/public/js/core.js
@@ -2,13 +2,13 @@ module Kinbote
2
2
  class Attribute
3
3
  include Util
4
4
  include Kinfile
5
- attr_reader :name
5
+
6
+ attr_reader :name, :pages
6
7
 
7
- def initialize(name, page, values, global=nil)
8
+ def initialize(name, page, values)
8
9
  @name = name.to_s
9
10
  @pages = []
10
11
  @values = []
11
- @global = global || self
12
12
  add_page(page, values)
13
13
  end
14
14
 
@@ -16,27 +16,37 @@ module Kinbote
16
16
  @pages.delete_if{|p| p.slug == page.slug}
17
17
  @pages << page
18
18
  values.each do |v|
19
- g_val = $site.find_value(v, @global, true)
20
- g_val ? g_val.add_page(page) : g_val = Value.new(v, page, @global); $site.add_value(g_val)
21
- l_val = $site.find_value(v, self)
22
- l_val ? l_val.add_page(page) : @values << Value.new(v, page, @global, g_val)
19
+ val = $site.find_value(v, self)
20
+ val ? val.add_page(page) : @values << Value.new(v, page, self)
23
21
  end
24
22
  end
25
23
 
26
- def remove_page(page)
27
- @values.map{|value| value.remove_page(page)}
28
- @global.pages.delete_if{|p| p.slug == page.slug}
24
+ def rem_page(page)
25
+ values_for(page).map{|value| value.rem_page(page)}
26
+ values_for(page).delete_if{|v| v.pages.size == 0}
29
27
  @pages.delete_if{|p| p.slug == page.slug}
30
- @global.values.delete_if{|v| v.pages.size == 0}
31
- @values.delete_if{|v| v.pages.size == 0}
32
28
  end
33
29
 
34
30
  def values
35
- @values.sort{|x, y| x.value <=> y.value }
31
+ @values.sort!{|x, y| x.value <=> y.value}
32
+ @values
33
+ end
34
+
35
+ def values_for(page=nil)
36
+ return @values if !page
37
+ slug = (page.is_a?(String) ? page : page.slug)
38
+ vals = []
39
+ @values.each do |v|
40
+ vals << v if v.has_page?(slug)
41
+ end
42
+ vals.sort{|x, y| x.value <=> y.value}
36
43
  end
37
44
 
45
+ def has_value?(v, page=nil)
46
+ values_for(page).map{|vv| vv.value}.include?(v)
47
+ end
48
+
38
49
  def varname; varify(@name); end
39
- def pages; @global == self ? @pages : @global.pages; end
40
50
  def to_s; @name; end
41
51
 
42
52
  end
@@ -16,5 +16,5 @@ require 'kinbote/value'
16
16
  require 'kinbote/page_match'
17
17
 
18
18
  module Kinbote
19
- VERSION = '0.0.2'
19
+ VERSION = '0.0.3'
20
20
  end
@@ -51,19 +51,20 @@ module Kinbote
51
51
 
52
52
  private
53
53
 
54
- def file_path(type, dir = nil)
54
+ def file_path(type, dir=nil)
55
55
  if type == :css
56
56
  if self.is_a?(Attribute)
57
57
  return "#{$site.kinbote_path}/views/sass/attributes/#{@name}/#{!dir ? "_all.sass" : ""}"
58
58
  elsif self.is_a?(Value)
59
59
  return "#{$site.kinbote_path}/views/sass/attributes/#{@attribute}/#{!dir ? "#{@value}.sass" : ""}"
60
60
  elsif self.is_a?(Page)
61
- return "#{@directory}#{!dir ? "#{@slug}.sass" : ""}"
61
+ #return "#{@directory}#{!dir ? "#{@slug}.sass" : ""}"
62
+ return "#{$site.kinbote_path}/views/sass/pages/#{Time.now.strftime("%Y/%m/%d")}/#{!dir ? "/#{@slug}.sass" : ""}"
62
63
  end
63
64
  elsif type == :html
64
65
  return @file if @file && !dir
65
66
  return @directory if @directory && dir
66
- return "#{$site.kinbote_path}/views/pages/#{Time.now.strftime("%Y/%m")}/#{!dir ? "/#{slugify(@title)}.haml" : ""}"
67
+ return "#{$site.kinbote_path}/views/pages/#{Time.now.strftime("%Y/%m/%d")}#{!dir ? "/#{slugify(@title)}.haml" : ""}"
67
68
  end
68
69
  end
69
70
 
@@ -13,7 +13,7 @@ module Kinbote
13
13
  @file = file || file_path(:html)
14
14
  @slug = slug_from_file(@file)
15
15
  @attributes = []
16
- add_attributes(attributes || {"Date" => Time.now.strftime("%B %d, %Y")})
16
+ add_attributes(attributes || new_page_attributes)
17
17
  create_file(:html)
18
18
  Page.add_metadata(self) if !file
19
19
  set_ivars
@@ -21,11 +21,11 @@ module Kinbote
21
21
 
22
22
  def set_attributes(attributes, values=nil)
23
23
  attributes = kv_to_attributes(attributes, values) if values
24
- new_title = remove_title(attributes)
24
+ new_title = rem_title(attributes)
25
25
  return if same_attributes(attributes, new_title)
26
26
  @title = new_title if new_title && new_title.size > 0
27
- $site.remove_page_attributes(self)
28
- @attributes.map{|att| att.remove_page(self)}
27
+ $site.rem_page_attributes(self)
28
+ @attributes.map{|att| att.rem_page(self)}
29
29
  @attributes.delete_if{|att| att.pages.size == 0}
30
30
  @attributes = []
31
31
  add_attributes(attributes)
@@ -33,7 +33,43 @@ module Kinbote
33
33
  set_ivars
34
34
  end
35
35
 
36
- def loosely_related_pages(attribute_names = nil)
36
+ def add_attributes(attributes)
37
+ attributes.each do |name, values|
38
+ add_attribute(name, values)
39
+ end
40
+ end
41
+
42
+ def add_attribute(name, values)
43
+ if BAD_ATTRIBUTE_VARNAMES.include?(varify(name))
44
+ $site.add_message("#{name} is an invalid attribute name")
45
+ next
46
+ end
47
+ att = $site.find_attribute(name) || Attribute.new(name, self, values)
48
+ att.add_page(self, values)
49
+ $site.add_attribute(att)
50
+ @attributes << att if !@attributes.map{|a| a.name}.include?(name)
51
+ end
52
+
53
+ def rem_attribute(att_name)
54
+ @attributes.map{|att| att.rem_page(self) if att.name == att_name}
55
+ @attributes.delete_if{|att| att.name == att_name}
56
+ $site.attributes.delete_if{|att| att.pages.size == 0}
57
+ end
58
+
59
+ def rem_value(att_name, val)
60
+ att = $site.find_attribute(att_name, self)
61
+ return if !att
62
+ v = $site.find_value(val, att)
63
+ return if !v || !v.has_page?(@slug)
64
+ v.rem_page(self)
65
+ att.rem_page(self) if att.values_for(self).size == 0
66
+ att.values_for(self).delete_if{|vv| vv.pages.size == 0}
67
+ @attributes.delete_if{|aa| aa.pages.size == 0 || aa.values_for(self).size == 0}
68
+ att.values.delete_if{|vv| vv.pages.size == 0}
69
+ $site.attributes.delete_if{|aa| aa.pages.size == 0 || aa.values.size == 0}
70
+ end
71
+
72
+ def loosely_related_pages(attribute_names=nil)
37
73
  page_matches = []
38
74
  if !attribute_names
39
75
  page_matches += loosely_related_pages(@attributes.map{|a| a.name})
@@ -45,7 +81,7 @@ module Kinbote
45
81
  page_matches.uniq
46
82
  end
47
83
 
48
- def strongly_related_pages(attribute_names = nil, values = nil)
84
+ def strongly_related_pages(attribute_names=nil, values=nil)
49
85
  page_matches = []
50
86
  if !attribute_names
51
87
  page_matches += strongly_related_pages(@attributes.map{|a| a.name})
@@ -63,9 +99,16 @@ module Kinbote
63
99
 
64
100
  def values
65
101
  vals = []
66
- attributes.each{ |a| a.values.each{ |v| vals << v } }
102
+ attributes.each{ |a| a.values_for(self).each{ |v| vals << v } }
67
103
  vals
68
104
  end
105
+
106
+ def filtered_by?(attribute=nil, value=nil)
107
+ return false if (!attribute || attribute.strip.size == 0) && (!value || value.strip.size == 0)
108
+ a = $site.find_attribute(attribute, self)
109
+ return true if !a
110
+ (!value || value.strip.size == 0 || ($site.find_value(value, a) && $site.find_value(value, a).has_page?(@slug))) ? false : true
111
+ end
69
112
 
70
113
  def path
71
114
  path = []
@@ -90,13 +133,15 @@ module Kinbote
90
133
  if page
91
134
  kinbote_haml(f_new, "page_attributes_title")
92
135
  kinbote_haml(f_new, "page_attributes", ["Title: #{page.title}"] + page.values.map{|v| "#{v.attribute.name}: #{v.value}"})
93
- kinbote_haml(f_new, "header")
94
- kinbote_haml(f_new, "specific", page.attributes.map{|a| a.varname})
95
- kinbote_haml(f_new, "related", page.attributes.map{|a| a.name.downcase == "date" ? nil : a.name}.compact)
96
- kinbote_haml(f_new, "related2", page.attributes.map{|a| "#{a.name}\", \"#{a.values.first.value}"})
97
- kinbote_haml(f_new, "related_any")
136
+ if $site.print_sample_code?
137
+ kinbote_haml(f_new, "header")
138
+ kinbote_haml(f_new, "specific", page.attributes.map{|a| a.varname})
139
+ kinbote_haml(f_new, "related", page.attributes.map{|a| a.name.downcase == "date" ? nil : a.name}.compact)
140
+ kinbote_haml(f_new, "related2", page.attributes.map{|a| "#{a.name}\", \"#{a.values_for(page).first.value}"})
141
+ kinbote_haml(f_new, "related_any")
142
+ end
98
143
  else
99
- kinbote_haml(f_new, "home", $site.attributes.map{|a| a.varname})
144
+ kinbote_haml(f_new, "home", $site.attributes.map{|a| a.varname}) if $site.print_sample_code?
100
145
  end
101
146
  f_new.close
102
147
  FileUtils.mv("#{fname}.haml.new", "#{fname}.haml")
@@ -109,28 +154,43 @@ module Kinbote
109
154
  File.read("#{$site.kinbote_path}/.kinbote/views/examples/#{example_name}.haml").to_a.each do |line|
110
155
  if replacements && line.include?("$ALL_VALS$")
111
156
  replacements.each do |r|
112
- f.puts(line.gsub("$ALL_VALS$", r))
157
+ kinwrite(f, line.gsub("$ALL_VALS$", r))
113
158
  end
114
159
  elsif replacements && line.include?("$ALL_VALS_COMMENTED$")
115
160
  replacements.each_with_index do |r, i|
116
161
  if i == replacements.size - 1
117
- f.puts(line.gsub("$ALL_VALS_COMMENTED$", r))
162
+ kinwrite(f, line.gsub("$ALL_VALS_COMMENTED$", r))
118
163
  else
119
- f.puts(line.gsub("- ", "-# ").gsub("$ALL_VALS_COMMENTED$", r))
164
+ kinwrite(f, line.gsub("- ", "-# ").gsub("$ALL_VALS_COMMENTED$", r))
120
165
  end
121
166
  end
122
167
  elsif replacements && line.include?("$FIRST_VAL$")
123
- f.puts(line.gsub("$FIRST_VAL$", replacements.first))
168
+ kinwrite(f, line.gsub("$FIRST_VAL$", replacements.first))
124
169
  elsif replacements && line.include?("$LAST_VAL$")
125
- f.puts(line.gsub("$LAST_VAL$", replacements.last))
170
+ kinwrite(f, line.gsub("$LAST_VAL$", replacements.last))
126
171
  else
127
- f.puts(line)
172
+ kinwrite(f, line)
128
173
  end
129
174
  end
130
175
  f.puts ""
131
176
  end
177
+
178
+ def self.kinwrite(f, line)
179
+ line.gsub!(/\t/, $site.config["haml_indentation"]) if ($site.config.has_key?("haml_indentation") && $site.config["haml_indentation"] != '\t')
180
+ f.puts(line)
181
+ end
182
+
183
+ def has_attribute?(att_name)
184
+ @attributes.map{|a| a.name}.include?(att_name)
185
+ end
132
186
 
133
187
  private
188
+
189
+ def new_page_attributes
190
+ atts = $site.config["new_page_attributes"] || {}
191
+ atts.merge!({"Date" => Time.now.strftime("%B %d, %Y")}) if atts.has_key?("Date")
192
+ atts
193
+ end
134
194
 
135
195
  def kv_to_attributes(keys, values)
136
196
  attributes = {}
@@ -142,7 +202,7 @@ module Kinbote
142
202
  attributes
143
203
  end
144
204
 
145
- def remove_title(attributes)
205
+ def rem_title(attributes)
146
206
  new_title = nil
147
207
  title_keys = []
148
208
  attributes.each do |key, value|
@@ -164,39 +224,24 @@ module Kinbote
164
224
 
165
225
  def same_attributes(attributes, new_title)
166
226
  return false if !new_title || new_title.size == 0 || new_title != @title
167
- @attributes.sort_by{|a| a.name}.map{|a| "#{a.name}#{a.values.sort_by{|v| v.value}.map{|v| v.value}.join}"}.join == attributes.to_a.sort_by{|a| a.first}.map{|a| "#{a.first}#{a.last.sort.join}"}.join
227
+ @attributes.sort_by{|a| a.name}.map{|a| "#{a.name}#{a.values_for(self).sort_by{|v| v.value}.map{|v| v.value}.join}"}.join == attributes.to_a.sort_by{|a| a.first}.map{|a| "#{a.first}#{a.last.sort.join}"}.join
168
228
  end
169
229
 
170
- def add_attributes(attributes)
171
- attributes.each do |name, values|
172
- if BAD_ATTRIBUTE_VARNAMES.include?(varify(name))
173
- $site.add_message("#{name} is an invalid attribute name")
174
- next
175
- end
176
- g_att = $site.find_attribute(name)
177
- g_att ? g_att.add_page(self, values) : g_att = Attribute.new(name, self, values); $site.add_attribute(g_att)
178
- l_att = $site.find_attribute(name, self)
179
- l_att ? l_att.add_page(self, values) : @attributes << Attribute.new(name, self, values, g_att)
180
- end
181
- end
182
-
183
230
  def srp(attribute_name, values)
184
231
  page_matches = []
185
- l_att = $site.find_attribute(attribute_name, self)
186
- g_att = $site.find_attribute(attribute_name)
187
- return page_matches if !l_att || !g_att
188
- l_att.values.each do |val|
232
+ att = $site.find_attribute(attribute_name, self)
233
+ return page_matches if !att
234
+ att.values_for(self).each do |val|
189
235
  next if values && values.size > 0 && !values.include?(val.value)
190
- g_val = $site.find_value(val.value, g_att, true)
191
- page_matches += (g_val.pages - [self]).map{|p| PageMatch.new(p, g_att, g_val)}
236
+ page_matches += (val.pages - [self]).map{|p| PageMatch.new(p, att, val)}
192
237
  end
193
238
  page_matches
194
239
  end
195
240
 
196
241
  def lrp(attribute_name)
197
- g_att = $site.find_attribute(attribute_name)
198
- return [] if !g_att || g_att.name.downcase == "date"
199
- (g_att.pages - [self]).map{|p| PageMatch.new(p, g_att)}
242
+ att = $site.find_attribute(attribute_name)
243
+ return [] if !att || att.name.downcase == "date"
244
+ (att.pages - [self]).map{|p| PageMatch.new(p, att)}
200
245
  end
201
246
 
202
247
  end
@@ -15,7 +15,6 @@ module Kinbote
15
15
  end
16
16
 
17
17
  def load
18
- load_pages
19
18
  end
20
19
 
21
20
  def reload
@@ -30,15 +29,15 @@ module Kinbote
30
29
  nil
31
30
  end
32
31
 
33
- def find_attribute(name, page = nil)
32
+ def find_attribute(name, page=nil)
34
33
  (page ? page.attributes : @attributes).each do |attribute|
35
34
  return attribute if (attribute.name == name || attribute.varname == varify(name))
36
35
  end
37
36
  nil
38
37
  end
39
38
 
40
- def find_value(val, attribute, global = false)
41
- (global ? @values : attribute.values).each do |value|
39
+ def find_value(val, attribute)
40
+ attribute.values.each do |value|
42
41
  return value if (value.value == val && (attribute.name == value.attribute.name || attribute.varname == varify(value.attribute.name)))
43
42
  end
44
43
  nil
@@ -54,30 +53,64 @@ module Kinbote
54
53
 
55
54
  def delete_page(slug)
56
55
  page = find_page(slug)
57
- @attributes.map{|att| att.remove_page(page)}
56
+ @attributes.map{|att| att.rem_page(page)}
58
57
  @attributes.delete_if{|att| att.pages.size == 0}
59
58
  page.delete_files([:html, :css])
60
59
  @pages.delete_if{|p| p.slug == page.slug}
61
60
  Page.add_metadata
62
61
  end
63
62
 
64
- def remove_page_attributes(page)
65
- @attributes.map{|att| att.remove_page(page)}
63
+ def rem_page_attributes(page)
64
+ @attributes.map{|att| att.rem_page(page)}
66
65
  @attributes.delete_if{|att| att.pages.size == 0}
67
66
  end
68
67
 
68
+ def rem_page_attribute(page, att_name)
69
+ @attributes.map{|att| att.rem_page(page) if att.name == att_name}
70
+ @attributes.delete_if{|att| att.pages.size == 0}
71
+ end
72
+
73
+ def bulk_update(slugs=[], action={})
74
+ return if !slugs || slugs.size == 0
75
+ slugs.each do |slug|
76
+ page = find_page(slug)
77
+ next if !page
78
+ if action["type"] == "add_attribute"
79
+ next if (!action.has_key?("attribute") || action["attribute"].strip.size == 0) || (!action.has_key?("value") || action["value"].strip.size == 0)
80
+ page.add_attribute(action["attribute"], [action["value"]])
81
+ elsif action["type"] == "rem_attribute"
82
+ next if !action.has_key?("attribute") || action["attribute"].strip.size == 0
83
+ if action.has_key?("value") && action["value"].strip.size > 0
84
+ page.rem_value(action["attribute"], action["value"])
85
+ else
86
+ page.rem_attribute(action["attribute"])
87
+ end
88
+ end
89
+ Page.add_metadata(page)
90
+ end
91
+ end
92
+
69
93
  def pages
70
- @pages.sort{|x, y| x.title <=> y.title }
94
+ @pages.sort{|x, y| x.title.downcase <=> y.title.downcase }
71
95
  end
72
96
 
73
97
  def attributes
74
98
  sorted_attributes(@attributes)
75
99
  end
76
-
100
+
101
+ def print_sample_code?
102
+ @config.has_key?("print_sample_code") && @config["print_sample_code"] != false
103
+ end
104
+
77
105
  def kinbote_path= (path); @kinbote_path = path; end
78
106
 
79
- def add_attribute(attribute); @attributes << attribute; end
80
- def add_value(value); @values << value; end
107
+ def add_attribute(attribute)
108
+ @attributes << attribute if !has_attribute?(attribute.name)
109
+ end
110
+
111
+ def has_attribute?(att_name)
112
+ @attributes.map{|a| a.name}.include?(att_name)
113
+ end
81
114
 
82
115
  def add_message(message); @messages << message if !@messages.include?(message); end
83
116
  def has_messages?; @messages.size > 0; end
@@ -85,13 +118,6 @@ module Kinbote
85
118
 
86
119
  private
87
120
 
88
- def load_pages
89
- Dir.glob("#{@kinbote_path}/views/pages/**/*.{haml}").each do |file|
90
- title, attributes = file_attributes(file)
91
- create_page(title, file, attributes)
92
- end
93
- end
94
-
95
121
  def reload_pages
96
122
  files = Dir.glob("#{@kinbote_path}/views/pages/**/*.{haml}")
97
123
  files.each do |file|
@@ -100,6 +126,7 @@ module Kinbote
100
126
  page = find_page(slug)
101
127
  if page
102
128
  next if File.size(file) == page.file_size(:html)
129
+ puts "Reload #{page.title}"
103
130
  page.set_attributes(attributes.merge({"title" => [title]}))
104
131
  page.reset_file_size(:html)
105
132
  else
@@ -132,7 +159,7 @@ module Kinbote
132
159
  end
133
160
 
134
161
  def read_config
135
- @config = (File.exist?("#{@kinbote_path}/config/site.yml") ? YAML::load_file("#{@kinbote_path}/config/site.yml") : {"title" => "Kinbote Site"})
162
+ @config = (File.exist?("#{@kinbote_path}/config.yml") ? YAML::load_file("#{@kinbote_path}/config.yml") : {"title" => "Kinbote Site"})
136
163
  @config.each do |key, value|
137
164
  Site.send(:define_method, varify(key).to_sym, Proc.new{ @config[key] }) if !Site.respond_to?(varify(key).to_sym)
138
165
  end