staticweb 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'staticweb'
4
+
5
+ working_directory = `pwd`
6
+ Amy.new(working_directory.to_s.chomp + "/src").build_html
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'staticweb-seed'
4
+
5
+ working_directory = `pwd`
6
+ static = Staticwebseed.new(working_directory.to_s.chomp)
7
+
8
+ static.make_src_directory
9
+ static.make_index_web
10
+ static.make_index_template
11
+ static.make_index_keyword
12
+ static.make_index_config
13
+ static.make_index_dynamic
14
+ static.make_css
15
+ static.make_project_mapping
@@ -0,0 +1,237 @@
1
+ class Staticwebseed
2
+
3
+ def initialize(working_directory)
4
+ @working_directory = working_directory
5
+ end
6
+
7
+ def make_src_directory
8
+ Dir.mkdir(@working_directory + "/src")
9
+ end
10
+
11
+ def make_index_web
12
+ f = File.open("src/index.web", "w")
13
+ f. puts "<p>Welcome to StaticWeb - This is the default index page</p>"
14
+ f.close
15
+ end
16
+
17
+ def make_index_template
18
+ data = <<-EOF
19
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
20
+ <html>
21
+ <head>
22
+ <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
23
+ <title>[BROWSERTITLE]</title>
24
+ <link type="text/css" href="default.css" rel="stylesheet">
25
+ </head>
26
+ <body>
27
+ <div id="pagecontainer">
28
+ <div id="banner">[SITEBANNER]</div>
29
+ <div id="underbannerstrip"></div>
30
+ <div id="leftcontent">
31
+ <div id="menu">
32
+ [MENUCONTENT]
33
+ </div>
34
+ </div>
35
+ <div id="rightcontent">[CONTENT]</div>
36
+ </div>
37
+ <div id="pagefooter">
38
+ <div id="pagefootercontent">
39
+ [COPYRIGHT] [PUBLISHED]
40
+ </div>
41
+ </div>
42
+ </body>
43
+ </html>
44
+ EOF
45
+ f = File.open("src/index.template","w")
46
+ f.puts data
47
+ f.close
48
+ end
49
+
50
+ def make_index_keyword
51
+ data = <<-EOF
52
+ CONTENT:index.web
53
+ EOF
54
+ f = File.open("src/index.keyword","w")
55
+ f.puts data
56
+ f.close
57
+ end
58
+
59
+ def make_index_config
60
+ data = <<-EOF
61
+ SITEBANNER:StaticWeb
62
+ BROWSERTITLE:StaticWeb
63
+ COPYRIGHT:Copyright © 2004 Kingsley Hendrickse. All rights reserved.
64
+ EOF
65
+ f = File.open("src/index.config","w")
66
+ f.puts data
67
+ f.close
68
+ end
69
+
70
+ def make_index_dynamic
71
+ data = <<-EOF
72
+ def menu_MENUCONTENT
73
+ list = []
74
+ home = []
75
+ ordered_list = []
76
+ Dir.entries(@working_directory).each do |file|
77
+ if file.match("index.web") then home << '<a href="' + file.split(".")[0].to_s + '.html">' + "Home" + '</a><br>'
78
+ elsif file.match(".web") then list << '<a href="' + file.split(".")[0].to_s + '.html">' + file.split(".")[0].to_s.gsub("_"," ") + '</a><br>'
79
+ end
80
+ end
81
+ ordered_list << home.to_s
82
+ ordered_list << list.to_s
83
+ return ordered_list.to_s
84
+ end
85
+
86
+ def published_PUBLISHED
87
+ return "-last published #\{Time.now\}"
88
+ end
89
+ EOF
90
+ f = File.open("src/index.dynamic.rb","w")
91
+ f.puts data
92
+ f.close
93
+ end
94
+
95
+
96
+ def make_css
97
+ data = <<-EOF
98
+ body {
99
+ margin:0px 5px 5px 5px;
100
+ background-color:lightgrey;
101
+ }
102
+
103
+ a:link {
104
+ font-weight: bold;
105
+ text-decoration: none;
106
+ color: black;
107
+ }
108
+ a:visited {
109
+ font-weight: bold;
110
+ text-decoration: none;
111
+ color: black;
112
+ }
113
+ a:hover, a:active {
114
+ text-decoration: underline;
115
+ color: darkblue;
116
+ }
117
+ li {
118
+ padding-left:25px;
119
+ border-left:2px solid #e4f3d3;
120
+ }
121
+
122
+ #pagecontainer {
123
+ margin-left:10%;
124
+ margin-right:10%;
125
+ margin-top:1%;
126
+ border-left:2px solid #c6c8c3;
127
+ border-right:2px solid #c6c8c3;
128
+ border-bottom:2px solid #c6c8c3;
129
+ border-top:2px solid #c6c8c3;
130
+ height:500px;
131
+ background:#ffffff;
132
+
133
+ }
134
+
135
+ #banner {
136
+ font-size:50px;
137
+ font-family:arial,helvetica;
138
+ font-weight:bold;
139
+ font-style:italic;
140
+ background-color:#e4f3d3;
141
+ color:white;
142
+ padding: 2% 2% 2% 25%;
143
+ border-bottom:2px solid #ffffff;
144
+ }
145
+
146
+ #underbannerstrip {
147
+ background:#d7dff3;
148
+ height:10px;
149
+
150
+ }
151
+
152
+ #menu{
153
+ font-size:14px;
154
+ font-family:arial,helvetica;
155
+ color:#000000;
156
+ padding-top:3px;
157
+ padding-bottom:3px;
158
+ padding-left:5px;
159
+ }
160
+
161
+ #leftcontent {
162
+ float:left;
163
+ width:20%;
164
+ background:#d7dff3;
165
+ margin-right:15px;
166
+ margin-left:10px;
167
+ margin-bottom:15px;
168
+ padding-bottom:20px;
169
+ padding-left:5px;
170
+ color:#ffffff;
171
+ }
172
+
173
+ #rightcontent {
174
+ float:right;
175
+ width:75%;
176
+ padding-right:5px;
177
+ background:white;
178
+ }
179
+
180
+ #pagefooter {
181
+ font-size:12px;
182
+ font-family:arial,helvetica;
183
+ margin-left:10%;
184
+ margin-top:3px;
185
+ margin-right:10%;
186
+ padding-top:2px;
187
+ padding-bottom:5px;
188
+ padding-left:10px;
189
+ background:#e4f3d3;
190
+ height:10px;
191
+ border-left:2px solid #c6c8c3;
192
+ border-right:2px solid #c6c8c3;
193
+ border-bottom:2px solid #c6c8c3;
194
+ border-top:2px solid #c6c8c3;
195
+ color:#000000;
196
+ }
197
+
198
+ #pagefootercontent {
199
+ margin-left:20%;
200
+ margin-right:20%;
201
+ }
202
+
203
+ #normaltext {
204
+ font-size:14px;
205
+ font-family:arial,helvetica;
206
+ }
207
+
208
+ #heading1 {
209
+ font-size:28px;
210
+ font-weight:bold;
211
+ font-family:arial,helvetica;
212
+ }
213
+
214
+ #heading2 {
215
+ font-size:16px;
216
+ font-weight:bold;
217
+ font-family:arial,helvetica;
218
+
219
+ }
220
+ EOF
221
+ f = File.open("src/default.css","w")
222
+ f.puts data
223
+ f.close
224
+ end
225
+
226
+ def make_project_mapping
227
+ data = <<-EOF
228
+ [content_file]\t\t[template_file]\t\t[config_file]\t\t[keyword_file]
229
+ index.web\t\tindex.template\t\tindex.config\t\tindex.keyword
230
+ EOF
231
+ f = File.open("src/project.mapping","w")
232
+ f.puts data
233
+ f.close
234
+ end
235
+ end
236
+
237
+
@@ -0,0 +1,342 @@
1
+ require 'fileutils'
2
+
3
+ class MissingWorkingDirectory < ArgumentError ; end
4
+ class MissingFileType < RuntimeError ; end
5
+
6
+ # Jeremy's role in life is to read the .web files
7
+ class Jeremy
8
+
9
+ WebFileInitial = Struct.new("WebFileInitial", :file_name, :file_path)
10
+ WebFile = Struct.new("WebFile", :file_name, :file_path, :file_content)
11
+
12
+ def initialize(working_directory)
13
+ if !File.exists?(working_directory) then raise MissingWorkingDirectory, "Folder containing required files doesn't seem to exist"
14
+ else @working_directory = working_directory end
15
+ end
16
+
17
+
18
+ def list_of_web_files
19
+ list = []
20
+ Dir.entries(@working_directory).each do |file|
21
+ if file.match(".web") then list << WebFileInitial.new(file, @working_directory + "/" + file) end
22
+ end
23
+ if list.size != 0 then return list else raise MissingFileType, "The Directory contains no files with extension .web" end
24
+ end
25
+
26
+
27
+ def webfile
28
+ list = []
29
+ list_of_web_files.each do |web|
30
+ list << WebFile.new(web.file_name, web.file_path, File.readlines(web.file_path))
31
+ end
32
+ return list
33
+ end
34
+
35
+ end
36
+
37
+ # Issac's role in life is to read the config files
38
+ class Isaac < Jeremy
39
+
40
+ ConfigFileInitial = Struct.new("ConfigFileInitial", :file_name, :file_path)
41
+ ConfigFile = Struct.new("ConfigFile", :file_name, :file_path, :config_setting_name, :config_setting_value)
42
+
43
+ def list_of_config_files
44
+ list = []
45
+ Dir.entries(@working_directory).each do |file|
46
+ if file.match(".config") then list << ConfigFileInitial.new(file, @working_directory + "/" + file) end
47
+ end
48
+ if list.size != 0 then return list else raise MissingFileType, "The Directory contains no files with extension .config" end
49
+ end
50
+
51
+
52
+ def configfile
53
+ list = []
54
+ list_of_config_files.each do |config|
55
+ File.readlines(config.file_path).each do |line|
56
+ list << ConfigFile.new(config.file_name, config.file_path, line.split(":")[0], line.split(":")[1].chomp)
57
+ end
58
+ end
59
+ return list
60
+ end
61
+
62
+ end
63
+
64
+ # Montgomery's role in life is to read the template files
65
+ class Montgomery < Jeremy
66
+
67
+ TemplateFileInitial = Struct.new("TemplateFileInitial", :file_name, :file_path)
68
+ TemplateFile = Struct.new("TemplateFile", :file_name, :file_path, :file_content)
69
+
70
+ def list_of_template_files
71
+ list = []
72
+ Dir.entries(@working_directory).each do |file|
73
+ if file.match(".template") then list << TemplateFileInitial.new(file, @working_directory + "/" + file) end
74
+ end
75
+ if list.size != 0 then return list else raise MissingFileType, "The Directory contains no files with extension .template" end
76
+ end
77
+
78
+
79
+ def templatefile
80
+ list = []
81
+ list_of_template_files.each do |template|
82
+ list << TemplateFile.new(template.file_name, template.file_path, File.readlines(template.file_path))
83
+ end
84
+ return list
85
+ end
86
+
87
+ end
88
+
89
+
90
+ # Jenny's role in life is to find the dynamic files
91
+ class Jenny < Jeremy
92
+
93
+ DynamicFileInitial = Struct.new("DynamicFileInitial", :file_name, :file_path)
94
+ DynamicFile = Struct.new("DynamicFile", :file_name, :file_path, :method_name, :keyword_name)
95
+
96
+ def list_of_dynamic_files
97
+ list = []
98
+ Dir.entries(@working_directory).each do |file|
99
+ if file.match(".dynamic.rb") then list << DynamicFileInitial.new(file, @working_directory + "/" + file) end
100
+ end
101
+ if list.size != 0 then return list else raise MissingFileType, "The Directory contains no files with extension .dynamic" end
102
+ end
103
+
104
+ def dynamicfile
105
+ list = []
106
+ list_of_dynamic_files.each do |dynamic|
107
+ File.readlines(dynamic.file_path).each do |line|
108
+ if line.match(/def.+_/) then list << DynamicFile.new(dynamic.file_name, dynamic.file_path, line.split[1], line.split[1].split("_")[1]) end
109
+ end
110
+ end
111
+ return list
112
+ end
113
+
114
+ end
115
+
116
+ # Egbert's role in life is to read the keywords files
117
+ class Egbert < Jeremy
118
+
119
+ KeywordFileInitial = Struct.new("KeywordFileInitial", :file_name, :file_path)
120
+ KeywordFile = Struct.new("KeywordFile", :file_name, :file_path, :keyword_name, :keyword_value, :keyword_file_content)
121
+
122
+ def list_of_keyword_files
123
+ list = []
124
+ Dir.entries(@working_directory).each do |file|
125
+ if file.match(".keyword") then list << KeywordFileInitial.new(file, @working_directory + "/" + file) end
126
+ end
127
+ if list.size != 0 then return list else raise MissingFileType, "The Directory contains no files with extension .keyword" end
128
+ end
129
+
130
+
131
+ def keywordfile
132
+ list = []
133
+ list_of_keyword_files.each do |keyword|
134
+ File.readlines(keyword.file_path).each do |line|
135
+ content_file = line.split(":")[1].chomp
136
+ removal_file = keyword.file_path.split("/")[-1]
137
+ content_path = keyword.file_path.gsub(removal_file, content_file)
138
+ list << KeywordFile.new(keyword.file_name, keyword.file_path, line.split(":")[0], line.split(":")[1].chomp, File.readlines(content_path))
139
+ end
140
+ end
141
+ return list
142
+ end
143
+
144
+ end
145
+
146
+ # Samantha's role in life is to read the mapping file
147
+ class Samantha < Jeremy
148
+
149
+ MappingFileInitial = Struct.new("MappingFileInitial", :file_name, :file_path)
150
+ MappingFile = Struct.new("MappingFile", :file_name, :file_path, :mapping_web, :mapping_template,
151
+ :mapping_config, :mapping_keyword)
152
+
153
+ def list_of_mapping_files
154
+ list = []
155
+ Dir.entries(@working_directory).each do |file|
156
+ if file.match(".mapping") then list << MappingFileInitial.new(file, @working_directory + "/" + file) end
157
+ end
158
+ if list.size != 0 then return list else raise MissingFileType, "The Directory contains no files with extension .mapping" end
159
+ end
160
+
161
+
162
+ def mappingfile
163
+ list = []
164
+ list_of_mapping_files.each do |mapping|
165
+
166
+ File.readlines(mapping.file_path).each do |line|
167
+ unless line.match(/\[/)
168
+ if line.match(/d+/) then list << MappingFile.new(mapping.file_name, mapping.file_path, line.split[0],line.split[1],
169
+ line.split[2],line.split[3]) end
170
+ end
171
+ end
172
+ end
173
+ return list
174
+ end
175
+
176
+ end
177
+
178
+ # Amy's role in life is to map and build html pages
179
+ class Amy < Jeremy
180
+
181
+ PageBuilder = Struct.new("PageBuilder", :file_name, :file_path, :html)
182
+
183
+ def initialize(working_directory)
184
+ if !File.exists?(working_directory) then raise MissingWorkingDirectory, "Folder containing required files doesn't seem to exist"
185
+ else @working_directory = working_directory end
186
+
187
+ @jeremy = Jeremy.new(@working_directory)
188
+ @isaac = Isaac.new(@working_directory)
189
+ @montgomery = Montgomery.new(@working_directory)
190
+ @jenny = Jenny.new(@working_directory)
191
+ @egbert = Egbert.new(@working_directory)
192
+ @samantha = Samantha.new(@working_directory)
193
+ end
194
+
195
+ def find_web_files_that_match_mapping
196
+ list = []
197
+ @samantha.mappingfile.each do |mapping|
198
+ @jeremy.webfile.each{|web| if web.file_name == mapping.mapping_web then list << web end}
199
+ end
200
+ return list
201
+ end
202
+
203
+ def find_config_files_that_match_mapping
204
+ list = []
205
+ @samantha.mappingfile.each do |mapping|
206
+ sub_list = []
207
+ @isaac.configfile.each{|config| if mapping.mapping_config == config.file_name then sub_list << config end}
208
+ list << sub_list
209
+ end
210
+ return list
211
+ end
212
+
213
+ def find_template_files_that_match_mapping
214
+ list = []
215
+ @samantha.mappingfile.each do |mapping|
216
+
217
+ @montgomery.templatefile.each{|template| if mapping.mapping_template == template.file_name then list << template end}
218
+
219
+ end
220
+ return list
221
+ end
222
+
223
+ def make_keyword_file_if_web_exists_but_keyword_doesnt
224
+ web_array = []
225
+ keyword_array = []
226
+ @jeremy.webfile.each{|web| web_array << web.file_name }
227
+ @egbert.keywordfile.each{|keyword| keyword_array << keyword.file_name}
228
+ keyword_array.uniq!
229
+
230
+ test_array = []
231
+ web_array.each{|web| test_array << web.split(".")[0].to_s + ".keyword"}
232
+
233
+ missing_keywords = test_array - keyword_array
234
+ unless missing_keywords.empty?
235
+ missing_keywords.each{|missing_keyword|
236
+ if !missing_keyword.empty?
237
+ puts "missing: #{missing_keyword}"
238
+ puts "Auto-creating #{missing_keyword}"
239
+ web_word = missing_keyword.to_s.split(".")[0].to_s + ".web"
240
+ data = <<-EOF
241
+ CONTENT:#{web_word}
242
+ EOF
243
+ f = File.open("src/#{missing_keyword}","w")
244
+ f.puts data
245
+ f.close
246
+ project_file = @samantha.mappingfile[0].file_name.to_s
247
+ puts "Adding entry to #{project_file}"
248
+ f = File.open("src/#{project_file}", "a")
249
+ f.puts "#{web_word}\t\tindex.template\t\tindex.config\t\t#{missing_keyword}"
250
+ f.close
251
+ end
252
+ }
253
+ end
254
+
255
+ end
256
+
257
+ def find_keyword_files_that_match_mapping
258
+ list = []
259
+ @samantha.mappingfile.each do |mapping|
260
+ sub_list = []
261
+ @egbert.keywordfile.each{|keyword| if mapping.mapping_keyword == keyword.file_name then sub_list << keyword end}
262
+ list << sub_list
263
+ end
264
+ return list
265
+ end
266
+
267
+ #~ def apply_keywords_to_template
268
+ #~ make_keyword_file_if_web_exists_but_keyword_doesnt
269
+ #~ list = []
270
+ #~ find_template_files_that_match_mapping.each_with_index do |template,i|
271
+ #~ txt = template.file_content.to_s.clone
272
+
273
+ #~ find_keyword_files_that_match_mapping[i].each do |keyword|
274
+ #~ if find_web_files_that_match_mapping[i].file_name == keyword.keyword_value then
275
+ #~ txt.gsub!(/\[#{keyword.keyword_name}\]/, find_web_files_that_match_mapping[i].file_content.to_s) end
276
+ #~ end
277
+ #~ list << PageBuilder.new(find_web_files_that_match_mapping[i].file_name, find_web_files_that_match_mapping[i].file_path, txt)
278
+ #~ end
279
+ #~ return list
280
+ #~ end
281
+
282
+ def apply_keywords_to_template
283
+ make_keyword_file_if_web_exists_but_keyword_doesnt
284
+ list = []
285
+ find_template_files_that_match_mapping.each_with_index do |template,i|
286
+ txt = template.file_content.to_s.clone
287
+
288
+ find_keyword_files_that_match_mapping[i].each do |keyword|
289
+
290
+ txt.gsub!(/\[#{keyword.keyword_name}\]/, keyword.keyword_file_content.to_s)
291
+
292
+ end
293
+ list << PageBuilder.new(find_web_files_that_match_mapping[i].file_name, find_web_files_that_match_mapping[i].file_path, txt)
294
+ end
295
+ return list
296
+ end
297
+
298
+
299
+ def apply_config_to_template
300
+ list = []
301
+ apply_keywords_to_template.each_with_index do |template,i|
302
+ txt = template.html.clone
303
+ find_config_files_that_match_mapping[i].each do |config|
304
+ txt.gsub!(/\[#{config.config_setting_name}\]/, config.config_setting_value)
305
+ end
306
+ list << PageBuilder.new(template.file_name, template.file_path, txt)
307
+ end
308
+ return list
309
+ end
310
+
311
+
312
+
313
+ def apply_dynamic_to_template
314
+ list = []
315
+ apply_config_to_template.each_with_index do |template,i|
316
+ txt = template.html.clone
317
+ @jenny.dynamicfile.each do |dynamic|
318
+ require dynamic.file_path
319
+ txt.gsub!(/\[#{dynamic.keyword_name}\]/, eval(dynamic.method_name))
320
+ end
321
+ list << PageBuilder.new(template.file_name, template.file_path, txt)
322
+ end
323
+ return list
324
+ end
325
+
326
+ def build_html
327
+ if File.exists?("output") then @target_dir = "output"
328
+ else Dir.mkdir("output") ; @target_dir = "output" end
329
+
330
+ Dir.entries(@working_directory).each{|file| if file.match(".css") then
331
+ FileUtils.cp_r(@working_directory + "/" + file, @target_dir) end}
332
+
333
+
334
+ apply_dynamic_to_template.each_with_index do |file,i|
335
+ f = File.open(@target_dir + "/" + file.file_name.split(".")[0].to_s + ".html", "w")
336
+ f.puts file.html
337
+ f.close
338
+ end
339
+ end
340
+
341
+
342
+ end
metadata ADDED
@@ -0,0 +1,40 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.1
3
+ specification_version: 1
4
+ name: staticweb
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.2.0
7
+ date: 2005-05-21
8
+ summary: Staticweb is a command line static webpage generation tool
9
+ require_paths:
10
+ - lib
11
+ author: Kingsley Hendrickse
12
+ email: kingsley@icecode.org
13
+ homepage: http://staticweb.rubyforge.org
14
+ rubyforge_project: staticweb
15
+ description:
16
+ autorequire: staticweb
17
+ default_executable:
18
+ bindir: bin
19
+ has_rdoc: false
20
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
21
+ requirements:
22
+ -
23
+ - ">"
24
+ - !ruby/object:Gem::Version
25
+ version: 0.0.0
26
+ version:
27
+ platform: ruby
28
+ files:
29
+ - lib/staticweb.rb
30
+ - lib/staticweb-seed.rb
31
+ test_files: []
32
+ rdoc_options: []
33
+ extra_rdoc_files: []
34
+ executables:
35
+ - staticweb
36
+ - staticweb-seed
37
+ extensions: []
38
+ requirements:
39
+ - none
40
+ dependencies: []