sphonglepress 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/sphonglepress.rb +90 -19
- data/lib/sphonglepress/config.rb +2 -1
- data/lib/sphonglepress/export.rb +12 -6
- data/lib/sphonglepress/importer.rb +11 -7
- data/lib/sphonglepress/middleman.rb +15 -4
- data/lib/sphonglepress/models/attachment.rb +31 -18
- data/lib/sphonglepress/models/page.rb +10 -0
- data/lib/sphonglepress/version.rb +1 -1
- data/lib/sphonglepress/visitors/attachment_visitor.rb +18 -0
- data/lib/sphonglepress/visitors/document_importer.rb +103 -0
- data/lib/sphonglepress/visitors/visitor.rb +13 -0
- data/lib/sphonglepress/watcher.rb +61 -0
- data/sphonglepress.gemspec +6 -0
- data/templates/config/database.yml +2 -7
- data/templates/config/settings.yml +4 -3
- data/templates/config/sitemap.yml +1 -0
- data/templates/splash/middleman/home.html.haml +8 -0
- data/templates/splash/middleman/index.html.haml +8 -0
- data/templates/{middleman → splash/middleman}/layout.haml +0 -0
- data/templates/splash/visitors/splash.rb +11 -0
- data/vendor/html_cleaner.rb +47 -0
- metadata +66 -16
- data/lib/sphonglepress/visitor.rb +0 -13
- data/templates/middleman/default.html.haml +0 -0
data/lib/sphonglepress.rb
CHANGED
@@ -5,29 +5,41 @@ require 'active_record'
|
|
5
5
|
require 'pathname'
|
6
6
|
require 'logger'
|
7
7
|
require "thor"
|
8
|
+
require 'fileutils'
|
9
|
+
|
10
|
+
require "sphonglepress/config.rb"
|
8
11
|
|
9
12
|
begin
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
13
|
+
if File.exist? 'config/database.yml'
|
14
|
+
ActiveRecord::Base.logger = Logger.new('sql.log')
|
15
|
+
ActiveRecord::Base.configurations = YAML::load(IO.read('config/database.yml'))
|
16
|
+
ActiveRecord::Base.establish_connection("development")
|
17
|
+
end
|
18
|
+
rescue Exception => e
|
19
|
+
puts "Error configuring active record:"
|
20
|
+
puts e.to_s
|
14
21
|
end
|
15
22
|
|
16
23
|
require "sphonglepress/extensions.rb"
|
17
24
|
require "sphonglepress/git.rb"
|
18
25
|
require "sphonglepress/middleman.rb"
|
19
|
-
require "sphonglepress/config.rb"
|
20
26
|
require "sphonglepress/export.rb"
|
21
27
|
require "sphonglepress/database.rb"
|
28
|
+
require "sphonglepress/watcher.rb"
|
22
29
|
|
23
30
|
|
24
31
|
begin
|
25
32
|
require "sphonglepress/importer.rb"
|
26
|
-
require "sphonglepress/visitor.rb"
|
27
|
-
|
33
|
+
require "sphonglepress/visitors/visitor.rb"
|
34
|
+
require "sphonglepress/visitors/attachment_visitor.rb"
|
35
|
+
require "sphonglepress/visitors/document_importer.rb"
|
36
|
+
|
37
|
+
|
28
38
|
require "sphonglepress/models/base_post"
|
29
39
|
require "sphonglepress/models/attachment"
|
30
|
-
rescue
|
40
|
+
rescue Exception => e
|
41
|
+
puts "Error requiring importer, visitor & activemodel classes (this can probably be ignored):"
|
42
|
+
puts e.to_s
|
31
43
|
end
|
32
44
|
|
33
45
|
module Sphonglepress
|
@@ -40,8 +52,12 @@ module Sphonglepress
|
|
40
52
|
opts = DEFAULT_OPTIONS.merge options
|
41
53
|
Git.clone(opts)
|
42
54
|
Git.checkout(opts)
|
43
|
-
Middleman.init(opts
|
55
|
+
Middleman.init(opts)
|
44
56
|
Config.create_config(opts)
|
57
|
+
|
58
|
+
#FIXME: move this somewhere better
|
59
|
+
visitors_dir = TEMPLATE_DIR.join(opts['template'], "visitors")
|
60
|
+
`cp -r #{visitors_dir} config/`
|
45
61
|
end
|
46
62
|
|
47
63
|
desc "headers_footers", "export headers and footers to wordpress directory"
|
@@ -52,8 +68,8 @@ module Sphonglepress
|
|
52
68
|
|
53
69
|
desc "clean_wp", "clean up the wordpress directory of the external files from middleman"
|
54
70
|
def clean_wp
|
55
|
-
dirs = Dir[LAYOUT_DIR.join("
|
56
|
-
full_dirs = dirs.map {|d|
|
71
|
+
dirs = Dir[LAYOUT_DIR.join("source").to_s << "/*/"]
|
72
|
+
full_dirs = dirs.map {|d| ::Sphonglepress::Config.wp_theme_dir.join(Pathname.new(d).basename)}.join(" ")
|
57
73
|
cmd = "rm -rf #{full_dirs}"
|
58
74
|
puts cmd
|
59
75
|
`#{cmd}`
|
@@ -64,23 +80,34 @@ module Sphonglepress
|
|
64
80
|
desc "import_site", "Import the site from sitemap and static files"
|
65
81
|
method_options :visitor => :string
|
66
82
|
def import_site
|
67
|
-
pages = Importer.import sitemap_hash
|
83
|
+
pages = ::Sphonglepress::Importer.import sitemap_hash
|
68
84
|
pages.each { |page| Importer.persist page }
|
69
|
-
visitors = Dir[CONFIG_DIR.join("visitors").to_s << "/*.rb"].map{|v| "config/visitors/" << Pathname.new(v).basename}
|
85
|
+
visitors = Dir[CONFIG_DIR.join("visitors").to_s << "/*.rb"].map{|v| "config/visitors/" << Pathname.new(v).basename.to_s}
|
70
86
|
visitors.each do |v|
|
71
87
|
puts "requiring #{v}"
|
72
|
-
require v
|
88
|
+
require Dir.pwd.to_s << "/" << v
|
73
89
|
end
|
90
|
+
::Sphonglepress::Visitors::Visitor.subclasses.each {|s| s.instance.once}
|
91
|
+
|
74
92
|
pages.each { |page| Importer.visit page }
|
75
|
-
Visitor.subclasses.each {|s| s.once}
|
76
93
|
end
|
77
94
|
|
95
|
+
desc "create_db", "create the wordpress database"
|
96
|
+
def create_db
|
97
|
+
Database.create(CONFIG)
|
98
|
+
end
|
99
|
+
|
100
|
+
desc "drop_db", "drop the wordpress database"
|
101
|
+
def drop_db
|
102
|
+
Database.drop(CONFIG)
|
103
|
+
end
|
104
|
+
|
78
105
|
desc "load_db", "load the most recent 'clean' database dump"
|
79
106
|
def load_db
|
80
107
|
Database.drop(CONFIG)
|
81
108
|
Database.create(CONFIG)
|
82
109
|
db_opts = Database.db_opts(CONFIG)
|
83
|
-
latest_dump = Dir["#{::Sphonglepress::DB_DUMP_DIR}/*.sql"].sort_by{ |f| File.
|
110
|
+
latest_dump = Dir["#{::Sphonglepress::DB_DUMP_DIR}/*.sql"].sort_by{ |f| File.mtime(f) }.last
|
84
111
|
puts "mysql #{db_opts} < #{latest_dump}"
|
85
112
|
`mysql #{db_opts} < #{latest_dump}`
|
86
113
|
end
|
@@ -91,6 +118,18 @@ module Sphonglepress
|
|
91
118
|
dump_file = "#{::Sphonglepress::DB_DUMP_DIR.join("#{CONFIG['db']['development']['database']}")}-#{random}.sql"
|
92
119
|
puts "file: #{dump_file}"
|
93
120
|
db_opts = Database.db_opts(CONFIG)
|
121
|
+
FileUtils.mkdir_p ::Sphonglepress::DB_DUMP_DIR
|
122
|
+
|
123
|
+
`mysqldump #{db_opts} > #{dump_file}`
|
124
|
+
end
|
125
|
+
|
126
|
+
desc "dump_db_live", "dump the current database as database to go live with"
|
127
|
+
def dump_db_live
|
128
|
+
random = rand(36**8).to_s(36)
|
129
|
+
dump_file = "#{::Sphonglepress::DB_DUMP_DIR_LIVE.join("#{CONFIG['db']['development']['database']}")}-#{random}.sql"
|
130
|
+
puts "file: #{dump_file}"
|
131
|
+
db_opts = Database.db_opts(CONFIG)
|
132
|
+
FileUtils.mkdir_p ::Sphonglepress::DB_DUMP_DIR_LIVE
|
94
133
|
|
95
134
|
`mysqldump #{db_opts} > #{dump_file}`
|
96
135
|
end
|
@@ -104,7 +143,9 @@ module Sphonglepress
|
|
104
143
|
|
105
144
|
filenames = Importer.filenames_for_site pages
|
106
145
|
|
107
|
-
full_files = filenames.
|
146
|
+
full_files = filenames.
|
147
|
+
map {|file| STATIC_DIR.join("#{file}.html.haml").to_s }.
|
148
|
+
reject {|file| File.exist? file }
|
108
149
|
|
109
150
|
FileUtils.touch(full_files)
|
110
151
|
end
|
@@ -115,14 +156,43 @@ module Sphonglepress
|
|
115
156
|
Export.files
|
116
157
|
end
|
117
158
|
|
159
|
+
desc "export", "copy static files to wordpress"
|
160
|
+
def export
|
161
|
+
Middleman.build
|
162
|
+
Export.files
|
163
|
+
Export.headers_footers
|
164
|
+
end
|
165
|
+
|
118
166
|
desc "full_refresh", "do a full refresh of the whole shebang (layouts, headers, database, import content)"
|
119
167
|
def full_refresh
|
120
168
|
clean_wp
|
121
|
-
|
122
|
-
|
169
|
+
Middleman.clean
|
170
|
+
export
|
123
171
|
load_db
|
124
172
|
import_site
|
125
173
|
end
|
174
|
+
|
175
|
+
desc "watch", "monitor directory & reload on change"
|
176
|
+
def watch
|
177
|
+
Signal.trap("INT") { exit! }
|
178
|
+
Signal.trap("QUIT") { full_refresh }
|
179
|
+
|
180
|
+
puts "Watching"
|
181
|
+
Watcher.new(self).watch
|
182
|
+
end
|
183
|
+
|
184
|
+
require 'ruby-debug'
|
185
|
+
desc "import_static_from_doc", "Try and import site structure from site.odt file in the static/document directory"
|
186
|
+
def import_static_from_doc
|
187
|
+
pages = ::Sphonglepress::Importer.import sitemap_hash
|
188
|
+
document_importer_klass = ::Sphonglepress::Visitors::DocumentImporter
|
189
|
+
document_importer_klass.instance.once
|
190
|
+
pages.each { |page| Importer.visit page, [document_importer_klass]}
|
191
|
+
end
|
192
|
+
|
193
|
+
|
194
|
+
|
195
|
+
#desc "populate_static_from_doc"
|
126
196
|
|
127
197
|
private
|
128
198
|
|
@@ -143,6 +213,7 @@ module Sphonglepress
|
|
143
213
|
|
144
214
|
DB_DIR = PROJECT_DIR.join("db")
|
145
215
|
DB_DUMP_DIR = PROJECT_DIR.join("db/dumps")
|
216
|
+
DB_DUMP_DIR_LIVE = PROJECT_DIR.join("db/live_dumps")
|
146
217
|
STATIC_DIR = PROJECT_DIR.join(CONFIG["static_dir"]) rescue nil
|
147
218
|
WP_DIR = PROJECT_DIR.join(CONFIG["wp_clone_dir"]) rescue nil
|
148
219
|
WP_UPLOAD_DIR = WP_DIR.join("wp-content/uploads") rescue nil
|
data/lib/sphonglepress/config.rb
CHANGED
@@ -12,12 +12,13 @@ module Sphonglepress
|
|
12
12
|
def write_config(config)
|
13
13
|
FileUtils.cp(config["sitemap_file"] || "#{::Sphonglepress::App::TEMPLATE_DIR}/config/sitemap.yml", "config/sitemap.yml")
|
14
14
|
File.open("config/settings.yml", 'w') {|f| f.write(config.to_yaml.to_s)}
|
15
|
+
FileUtils.cp("#{::Sphonglepress::App::TEMPLATE_DIR}/config/database.yml", "config/database.yml")
|
15
16
|
end
|
16
17
|
|
17
18
|
def config
|
18
19
|
begin
|
19
20
|
c = YAML::load(IO.read(::Sphonglepress::CONFIG_DIR.join("settings.yml")))
|
20
|
-
c["db"] = YAML::load(IO.read(::Sphonglepress::CONFIG_DIR.join("database.yml")))
|
21
|
+
c["db"] = YAML::load(IO.read(::Sphonglepress::CONFIG_DIR.join("database.yml"))) rescue nil
|
21
22
|
c["middleman_dir"] = Pathname.new(c["middleman_dir"])
|
22
23
|
c["wp_clone_dir"] = Pathname.new(c["wp_clone_dir"])
|
23
24
|
return c
|
data/lib/sphonglepress/export.rb
CHANGED
@@ -1,24 +1,27 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
1
3
|
module Sphonglepress
|
2
4
|
class Export
|
3
5
|
class << self
|
4
6
|
def headers_footers
|
5
7
|
build_dir = ::Sphonglepress::Config.config["middleman_dir"].join("build")
|
6
|
-
|
7
|
-
|
8
|
-
default_file = build_dir.join("default.html")
|
8
|
+
default_file = build_dir.join("index.html")
|
9
9
|
default_parts = split_file(IO.read(default_file))
|
10
10
|
|
11
11
|
other_files = Dir["#{build_dir}/*.html"]. #without default.html
|
12
|
-
reject {|file| Pathname.new(file).basename.to_s == "
|
12
|
+
reject {|file| Pathname.new(file).basename.to_s == "index.html"}
|
13
13
|
|
14
14
|
others = {}
|
15
15
|
other_files.each do |file|
|
16
16
|
others[File.basename(file, '.*')] = split_file(IO.read(file))
|
17
17
|
end
|
18
18
|
|
19
|
+
FileUtils.mkdir_p ::Sphonglepress::Config.wp_theme_dir unless Dir.exist? ::Sphonglepress::Config.wp_theme_dir
|
20
|
+
|
19
21
|
File.open(::Sphonglepress::Config.wp_theme_dir.join("header.php"), 'w') {|file| file.write(default_parts[:header])}
|
20
22
|
File.open(::Sphonglepress::Config.wp_theme_dir.join("footer.php"), 'w') {|file| file.write(default_parts[:footer])}
|
21
|
-
|
23
|
+
File.open(::Sphonglepress::Config.wp_theme_dir.join("index.php"), 'w') {|file| file.write(default_parts[:content])}
|
24
|
+
|
22
25
|
others.each do |name, parts|
|
23
26
|
File.open(::Sphonglepress::Config.wp_theme_dir.join("header-#{name}.php"), 'w') {|file| file.write(parts[:header])}
|
24
27
|
File.open(::Sphonglepress::Config.wp_theme_dir.join("footer-#{name}.php"), 'w') {|file| file.write(parts[:footer])}
|
@@ -27,7 +30,10 @@ module Sphonglepress
|
|
27
30
|
end
|
28
31
|
|
29
32
|
def files
|
30
|
-
cmd = "cp -r #{CONFIG["middleman_dir"]}/build/*/ #{::Sphonglepress::
|
33
|
+
cmd = "cp -r #{CONFIG["middleman_dir"]}/build/*/ #{::Sphonglepress::Config.config["wp_clone_dir"]}"
|
34
|
+
`#{cmd}`
|
35
|
+
cmd = "cp -r #{CONFIG["middleman_dir"]}/build/stylesheets/*.css #{::Sphonglepress::Config.wp_theme_dir}/"
|
36
|
+
puts cmd
|
31
37
|
`#{cmd}`
|
32
38
|
end
|
33
39
|
|
@@ -12,11 +12,11 @@ module Sphonglepress
|
|
12
12
|
|
13
13
|
def structure(hash, parent=nil)
|
14
14
|
i=0
|
15
|
-
sorted = hash.keys.sort {|a,b| a
|
15
|
+
sorted = hash.keys.sort {|a,b| a.split("_").first.to_i <=> b.split("_").first.to_i }
|
16
16
|
pages = []
|
17
17
|
page = nil
|
18
18
|
sorted.each do |key|
|
19
|
-
title = key[2..key.length].gsub("_", " ")
|
19
|
+
title = key[2..key.length].gsub("_", " ")
|
20
20
|
if parent
|
21
21
|
page = Models::Page.new(:post_title => title, :post_type => "page", :menu_order => i, :parent => parent)
|
22
22
|
parent.posts << page
|
@@ -34,7 +34,7 @@ module Sphonglepress
|
|
34
34
|
begin
|
35
35
|
if File.exist?(page_content_file)
|
36
36
|
#puts "found #{page_content_file}"
|
37
|
-
page.post_content = Tilt.new(page_content_file).render
|
37
|
+
page.post_content = Tilt.new(page_content_file, :ugly => true).render
|
38
38
|
else
|
39
39
|
puts "Couldnt find #{page_content_file} in the static directory"
|
40
40
|
end
|
@@ -58,11 +58,12 @@ module Sphonglepress
|
|
58
58
|
page.posts.each {|p| persist(p)}
|
59
59
|
end
|
60
60
|
|
61
|
-
def visit(page)
|
62
|
-
|
63
|
-
v.
|
61
|
+
def visit(page, visitors = Visitors::Visitor.subclasses)
|
62
|
+
visitors.each do |v|
|
63
|
+
visitor = v.instance
|
64
|
+
visitor.visit(page)
|
64
65
|
page.posts.each do |p|
|
65
|
-
visit(p)
|
66
|
+
visitor.visit(p)
|
66
67
|
end
|
67
68
|
end
|
68
69
|
end
|
@@ -99,6 +100,9 @@ module Sphonglepress
|
|
99
100
|
filenames
|
100
101
|
end
|
101
102
|
|
103
|
+
def images_for_page(page)
|
104
|
+
|
105
|
+
end
|
102
106
|
|
103
107
|
end
|
104
108
|
end
|
@@ -3,12 +3,16 @@ module Sphonglepress
|
|
3
3
|
|
4
4
|
|
5
5
|
class << self
|
6
|
-
def init(
|
6
|
+
def init(options)
|
7
|
+
site = options['middleman_dir']
|
7
8
|
puts "Creating Middleman static site"
|
8
9
|
`mm-init #{site}`
|
9
|
-
|
10
|
-
`
|
11
|
-
|
10
|
+
|
11
|
+
`rm #{site}/source/*.erb`
|
12
|
+
to_copy = Dir["#{Sphonglepress::App::TEMPLATE_DIR}/#{options['template']}/middleman/*.haml"]
|
13
|
+
to_copy.each do |c|
|
14
|
+
`cp #{c} #{site}/source`
|
15
|
+
end
|
12
16
|
|
13
17
|
end
|
14
18
|
|
@@ -18,6 +22,13 @@ module Sphonglepress
|
|
18
22
|
puts `mm-build`
|
19
23
|
Dir.chdir cwd
|
20
24
|
end
|
25
|
+
|
26
|
+
def clean
|
27
|
+
cwd = Dir.pwd
|
28
|
+
Dir.chdir ::Sphonglepress::Config.config["middleman_dir"]
|
29
|
+
puts `rm -rf build`
|
30
|
+
Dir.chdir cwd
|
31
|
+
end
|
21
32
|
end
|
22
33
|
|
23
34
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'mime/types'
|
2
|
+
|
1
3
|
module Sphonglepress::Models
|
2
4
|
class Attachment < BasePost
|
3
5
|
attr_accessor :file
|
@@ -8,25 +10,36 @@ module Sphonglepress::Models
|
|
8
10
|
|
9
11
|
private
|
10
12
|
|
11
|
-
def
|
12
|
-
return if !@file
|
13
|
-
self.post_type = "attachment"
|
14
|
-
now = DateTime.now
|
15
|
-
year = now.year
|
16
|
-
month = now.month
|
13
|
+
def randomize_filename(file)
|
17
14
|
random = rand(36**8).to_s(36)
|
18
|
-
ext = File.extname(
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
ext = File.extname(file)
|
16
|
+
basename = File.basename(file, ext)
|
17
|
+
bare_file_name = "#{basename}-#{random}#{ext}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def do_stuff
|
21
|
+
return unless @file
|
22
|
+
|
23
|
+
self.post_type = "attachment"
|
24
|
+
now = DateTime.now
|
25
|
+
year = now.year
|
26
|
+
month = now.month
|
27
|
+
monthed_dir = now.strftime("%Y/%m")
|
28
|
+
upload_dir = ::Sphonglepress::WP_UPLOAD_DIR.join(monthed_dir)
|
29
|
+
bare_file_name = File.basename(@file)
|
30
|
+
file_name = upload_dir.join(bare_file_name)
|
31
|
+
|
32
|
+
file_name = upload_dir.join(bare_filename = randomize_filename(@file)) if File.exist? file_name
|
33
|
+
|
34
|
+
FileUtils.mkdir_p upload_dir unless Dir.exist? upload_dir
|
35
|
+
FileUtils.cp(@file, file_name)
|
36
|
+
ext = File.extname(file)
|
37
|
+
|
38
|
+
self.post_title = self.post_name = bare_file_name
|
39
|
+
self.post_status = "inherit"
|
40
|
+
self.guid = url = "/wp-content/uploads/#{monthed_dir}/#{bare_file_name}"
|
41
|
+
self.post_mime_type = ::MIME::Types.type_for(bare_file_name).first.to_s
|
22
42
|
|
23
|
-
self.post_title = self.post_name = bare_file_name
|
24
|
-
self.post_status = "inherit"
|
25
|
-
self.guid = url = "/wp-content/uploads/#{monthed_dir}/#{bare_file_name}"
|
26
|
-
self.post_mime_type = "image/jpeg"
|
27
|
-
file_name = upload_dir.join(bare_file_name)
|
28
|
-
FileUtils.mkdir_p upload_dir
|
29
|
-
FileUtils.cp(@file, file_name)
|
30
|
-
end
|
31
43
|
end
|
44
|
+
end
|
32
45
|
end
|
@@ -12,6 +12,16 @@ module Sphonglepress::Models
|
|
12
12
|
|
13
13
|
after_initialize :set_dates
|
14
14
|
|
15
|
+
def url
|
16
|
+
current = self
|
17
|
+
urls = []
|
18
|
+
while (current)
|
19
|
+
urls << current.post_title.gsub(/[^ a-zA-Z-]/, "").gsub(" ", "-").downcase
|
20
|
+
current = current.parent
|
21
|
+
end
|
22
|
+
urls.reverse.join("/")
|
23
|
+
end
|
24
|
+
|
15
25
|
private
|
16
26
|
def set_dates
|
17
27
|
self.post_date = DateTime.now
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#This visitor checks for a directory in static/attachments with the same location as the relative url for the page, and attaches any files it finds
|
2
|
+
module Sphonglepress::Visitors
|
3
|
+
class AttachmentVisitor < Visitor
|
4
|
+
def visit(page)
|
5
|
+
attachments_dir = ::Sphonglepress::STATIC_DIR.join("attachments", page.url)
|
6
|
+
Dir["#{attachments_dir}/*"].each do |file|
|
7
|
+
attachment = Sphonglepress::Models::Attachment.new
|
8
|
+
attachment.file = file
|
9
|
+
attachment.post_parent = page.id
|
10
|
+
attachment.save
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
#run this once per import
|
15
|
+
def once
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'haml/html'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
#This visitor checks for a site.odt & the config file ("import_from_site_document")
|
6
|
+
# and attempts to import thi into the site, based on position of h1s
|
7
|
+
module Sphonglepress::Visitors
|
8
|
+
class DocumentImporter #< Visitor
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
#override this to visit each page
|
12
|
+
def visit(page)
|
13
|
+
debugger
|
14
|
+
found = @segments[page.post_title]
|
15
|
+
return unless found
|
16
|
+
#page.post_content = found
|
17
|
+
file = ::Sphonglepress::STATIC_DIR.join("from_document", full_path_for_page(page) << ".html.haml")
|
18
|
+
FileUtils.mkdir_p(file.dirname) unless Dir.exist? file.dirname
|
19
|
+
File.open(file, 'w') do |f|
|
20
|
+
f.write Haml::HTML.new(found, :xhtml => true).render
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
#run this once per import
|
26
|
+
def once
|
27
|
+
convert
|
28
|
+
source_doc = Sphonglepress::STATIC_DIR.join("document", "site.html")
|
29
|
+
cleaned = clean(source_doc)
|
30
|
+
@segments = segment cleaned
|
31
|
+
end
|
32
|
+
|
33
|
+
def clean(doc)
|
34
|
+
|
35
|
+
require ::Sphonglepress::App::APP_DIR.join("vendor", "html_cleaner")
|
36
|
+
opts = {
|
37
|
+
:remove_attrs => %w(style width height cellpadding cellspacing valign halign),
|
38
|
+
:remove_tags => %w(font style meta b),
|
39
|
+
:remove_nested_empty_tags => [%w(p br)]
|
40
|
+
}
|
41
|
+
|
42
|
+
cleaner = HTMLCleaner.new(IO.read(doc), opts)
|
43
|
+
File.open(Sphonglepress::STATIC_DIR.join("document", "site.cleaned.html"), 'w') do |f|
|
44
|
+
f.write(cleaner.render)
|
45
|
+
end
|
46
|
+
cleaner.render
|
47
|
+
end
|
48
|
+
|
49
|
+
def segment(doc)
|
50
|
+
segments = {}
|
51
|
+
doc = Nokogiri::HTML(doc)
|
52
|
+
headers = doc.css('h1')
|
53
|
+
headers.each_with_index do |h, index|
|
54
|
+
heading = clean_header(h)
|
55
|
+
content = content_until(h, headers[index+1])
|
56
|
+
segments[heading] = content.chomp.chomp("\n")
|
57
|
+
end
|
58
|
+
segments
|
59
|
+
end
|
60
|
+
|
61
|
+
def content_until(from, to)
|
62
|
+
siblings = [from.next_sibling]
|
63
|
+
while((siblings.last.next_sibling != to) rescue false)
|
64
|
+
siblings << siblings.last.next_sibling
|
65
|
+
end
|
66
|
+
siblings.inject("") {|m, s| m << s.to_s}
|
67
|
+
end
|
68
|
+
|
69
|
+
def clean_header(tag)
|
70
|
+
tag.inner_html.chomp.gsub("\n", " ").gsub(/ +/, " ").chomp(":").gsub(/^[0-9]*\./, "").strip rescue ""
|
71
|
+
end
|
72
|
+
|
73
|
+
def convert
|
74
|
+
source_dir = Sphonglepress::STATIC_DIR.join("document")
|
75
|
+
source_doc = source_dir.join("site.odt")
|
76
|
+
puts "SOURCE DOC: #{source_doc}" if File.exist? source_doc
|
77
|
+
cmd = "libreoffice -headless -convert-to html -outdir #{source_dir} #{source_doc}"
|
78
|
+
`#{cmd}`
|
79
|
+
end
|
80
|
+
|
81
|
+
# http://stackoverflow.com/questions/1939333/how-to-make-a-ruby-string-safe-for-a-filesystem
|
82
|
+
def sanitize_filename(filename)
|
83
|
+
filename.strip.gsub(/^.*(\\|\/)/, '').gsub(/[^0-9A-Za-z.\-]/, '-')
|
84
|
+
end
|
85
|
+
|
86
|
+
def full_path_for_page(page)
|
87
|
+
return "" unless page
|
88
|
+
path = full_path_for_page(page.parent)
|
89
|
+
join = path.length > 0 ? "_" : ""
|
90
|
+
return "#{path << join}" << "#{sanitize_filename(page.post_title)}"
|
91
|
+
end
|
92
|
+
|
93
|
+
def filenames_for_page(page)
|
94
|
+
filenames = []
|
95
|
+
|
96
|
+
filenames << full_path_for_page(page)
|
97
|
+
page.posts.each do |child|
|
98
|
+
filenames.concat filenames_for_page(child)
|
99
|
+
end
|
100
|
+
filenames
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'fssm'
|
2
|
+
|
3
|
+
module Sphonglepress
|
4
|
+
class Watcher
|
5
|
+
def initialize(app)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def watch
|
10
|
+
myself = self
|
11
|
+
while true do
|
12
|
+
begin
|
13
|
+
FSSM.monitor do
|
14
|
+
path ::Sphonglepress::STATIC_DIR do
|
15
|
+
|
16
|
+
update {|base, relative| myself.static }
|
17
|
+
delete {|base, relative| myself.static }
|
18
|
+
create {|base, relative| mysqlf.static }
|
19
|
+
end
|
20
|
+
|
21
|
+
path ::Sphonglepress::LAYOUT_DIR.join("source") do
|
22
|
+
update {|base, relative| myself.middleman }
|
23
|
+
delete {|base, relative| myself.middleman }
|
24
|
+
create {|base, relative| myself.middleman }
|
25
|
+
end
|
26
|
+
|
27
|
+
path ::Sphonglepress::CONFIG_DIR do
|
28
|
+
update {|base, relative| myself.config_sitemap }
|
29
|
+
delete {|base, relative| myself.config_sitemap }
|
30
|
+
create {|base, relative| myself.config_sitemap }
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
rescue Exception => e
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def static
|
42
|
+
puts "Static dir changed, reloading site content"
|
43
|
+
@app.load_db
|
44
|
+
@app.import_site
|
45
|
+
puts "DONE"
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
def middleman
|
50
|
+
puts "Middleman directory changed, reloading static assets"
|
51
|
+
@app.export
|
52
|
+
puts "DONE"
|
53
|
+
end
|
54
|
+
|
55
|
+
def config_sitemap
|
56
|
+
puts "Config dir changed, Creating any static files not created"
|
57
|
+
@app.create_static_files
|
58
|
+
puts "DONE"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/sphonglepress.gemspec
CHANGED
@@ -27,5 +27,11 @@ Gem::Specification.new do |s|
|
|
27
27
|
s.add_dependency('activerecord')
|
28
28
|
s.add_dependency('tilt')
|
29
29
|
s.add_dependency('haml')
|
30
|
+
s.add_dependency('mysql')
|
31
|
+
s.add_dependency('fssm')
|
32
|
+
#FIXME: move html-cleaner into gem & remove this
|
33
|
+
s.add_dependency('hpricot')
|
34
|
+
s.add_dependency('mime-types')
|
35
|
+
|
30
36
|
|
31
37
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
---
|
2
|
-
wp_git_tag: v3.1
|
2
|
+
wp_git_tag: v3.2.1
|
3
3
|
wp_clone_dir: wordpress
|
4
|
-
wp_git_url: https://github.com/
|
5
|
-
wp_theme_dir:
|
4
|
+
wp_git_url: https://github.com/nhemsley/wordpress
|
5
|
+
wp_theme_dir: default
|
6
6
|
middleman_dir: middleman
|
7
7
|
static_dir: static
|
8
|
+
template: splash
|
@@ -0,0 +1 @@
|
|
1
|
+
0_HOME: 0
|
File without changes
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'hpricot'
|
2
|
+
require 'ruby-debug'
|
3
|
+
|
4
|
+
class HTMLCleaner
|
5
|
+
def initialize(html, options = nil)
|
6
|
+
@html = html
|
7
|
+
@doc = Hpricot(@html)
|
8
|
+
@options = options
|
9
|
+
end
|
10
|
+
|
11
|
+
def remove_attr(attr)
|
12
|
+
@doc.search("[@#{attr}]").each do |e|
|
13
|
+
e.remove_attribute(attr)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def remove_tag(tag)
|
18
|
+
els = @doc.search(tag)
|
19
|
+
els.collect!{|node| node if node.children == nil}.compact.remove
|
20
|
+
|
21
|
+
@doc.search(tag).each do |e|
|
22
|
+
inner = e.children
|
23
|
+
parent = e.parent
|
24
|
+
if inner
|
25
|
+
parent.replace_child(e, inner)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def remove_nested_empty_tags(first, second)
|
31
|
+
els = @doc.search(first)
|
32
|
+
remove = els.select do |el|
|
33
|
+
ret = true
|
34
|
+
ret = false unless el.children.detect {|ch| ch.name == second && ch.inner_html.chomp == ""}
|
35
|
+
ret
|
36
|
+
end
|
37
|
+
remove.each {|r| r.parent.children.delete(r) }
|
38
|
+
end
|
39
|
+
|
40
|
+
def render
|
41
|
+
@options[:remove_attrs].each { |a| remove_attr a } if @options[:remove_attrs]
|
42
|
+
@options[:remove_tags].each { |a| remove_tag a } if @options[:remove_tags]
|
43
|
+
@options[:remove_nested_empty_tags].each { |a| remove_nested_empty_tags(a[0], a[1]) } if @options[:remove_nested_empty_tags]
|
44
|
+
|
45
|
+
@doc.to_s
|
46
|
+
end
|
47
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sphonglepress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-10-19 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
16
|
-
requirement: &
|
16
|
+
requirement: &16288120 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *16288120
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: middleman
|
27
|
-
requirement: &
|
27
|
+
requirement: &16287700 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *16287700
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: activerecord
|
38
|
-
requirement: &
|
38
|
+
requirement: &16287280 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *16287280
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: tilt
|
49
|
-
requirement: &
|
49
|
+
requirement: &16286860 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *16286860
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: haml
|
60
|
-
requirement: &
|
60
|
+
requirement: &16286440 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,51 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *16286440
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: mysql
|
71
|
+
requirement: &16286020 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *16286020
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: fssm
|
82
|
+
requirement: &16285600 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :runtime
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *16285600
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: hpricot
|
93
|
+
requirement: &16285180 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ! '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
type: :runtime
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: *16285180
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: mime-types
|
104
|
+
requirement: &16284760 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :runtime
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: *16284760
|
69
113
|
description: Sphonglepress is a command line utility for interacting with & making
|
70
114
|
the task of importing content into a wordpress site
|
71
115
|
email:
|
@@ -98,7 +142,10 @@ files:
|
|
98
142
|
- lib/sphonglepress/models/page.rb
|
99
143
|
- lib/sphonglepress/models/post.rb
|
100
144
|
- lib/sphonglepress/version.rb
|
101
|
-
- lib/sphonglepress/
|
145
|
+
- lib/sphonglepress/visitors/attachment_visitor.rb
|
146
|
+
- lib/sphonglepress/visitors/document_importer.rb
|
147
|
+
- lib/sphonglepress/visitors/visitor.rb
|
148
|
+
- lib/sphonglepress/watcher.rb
|
102
149
|
- script/console
|
103
150
|
- script/destroy
|
104
151
|
- script/generate
|
@@ -106,10 +153,13 @@ files:
|
|
106
153
|
- templates/config/database.yml
|
107
154
|
- templates/config/settings.yml
|
108
155
|
- templates/config/sitemap.yml
|
109
|
-
- templates/middleman/
|
110
|
-
- templates/middleman/
|
156
|
+
- templates/splash/middleman/home.html.haml
|
157
|
+
- templates/splash/middleman/index.html.haml
|
158
|
+
- templates/splash/middleman/layout.haml
|
159
|
+
- templates/splash/visitors/splash.rb
|
111
160
|
- test/test_helper.rb
|
112
161
|
- test/test_sphonglepress.rb
|
162
|
+
- vendor/html_cleaner.rb
|
113
163
|
homepage: ''
|
114
164
|
licenses: []
|
115
165
|
post_install_message:
|
@@ -130,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
180
|
version: '0'
|
131
181
|
requirements: []
|
132
182
|
rubyforge_project: sphonglepress
|
133
|
-
rubygems_version: 1.8.
|
183
|
+
rubygems_version: 1.8.10
|
134
184
|
signing_key:
|
135
185
|
specification_version: 3
|
136
186
|
summary: Gem for populating wordpress
|
File without changes
|