bluemark-smallcage 0.1.3
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/History.txt +48 -0
- data/License.txt +20 -0
- data/README.txt +1 -0
- data/Rakefile +140 -0
- data/bin/smc +16 -0
- data/lib/smallcage.rb +18 -0
- data/lib/smallcage/application.rb +164 -0
- data/lib/smallcage/commands/auto.rb +158 -0
- data/lib/smallcage/commands/base.rb +19 -0
- data/lib/smallcage/commands/clean.rb +32 -0
- data/lib/smallcage/commands/export.rb +41 -0
- data/lib/smallcage/commands/import.rb +217 -0
- data/lib/smallcage/commands/manifest.rb +39 -0
- data/lib/smallcage/commands/server.rb +15 -0
- data/lib/smallcage/commands/update.rb +121 -0
- data/lib/smallcage/document_path.rb +46 -0
- data/lib/smallcage/erb_base.rb +16 -0
- data/lib/smallcage/http_server.rb +66 -0
- data/lib/smallcage/loader.rb +278 -0
- data/lib/smallcage/misc.rb +13 -0
- data/lib/smallcage/renderer.rb +19 -0
- data/lib/smallcage/resources/Manifest.erb +19 -0
- data/lib/smallcage/resources/auto.html +119 -0
- data/lib/smallcage/runner.rb +51 -0
- data/lib/smallcage/version.rb +9 -0
- data/project/base/_smc/helpers/base_helper.rb +41 -0
- data/project/base/_smc/helpers/site_helper.rb +5 -0
- data/project/base/_smc/templates/default.rhtml +5 -0
- data/project/base/_smc/templates/footer.rhtml +0 -0
- data/project/base/_smc/templates/header.rhtml +0 -0
- data/project/bluecloth/_smc/helpers/blue_cloth_helper.rb +10 -0
- data/project/bluecloth/_smc/templates/markdown.rhtml +5 -0
- data/project/lang/_smc/helpers/lang_helper.rb +19 -0
- data/project/lang/_smc/templates/other_lang.rhtml +6 -0
- data/project/news/_smc/helpers/news_helper.rb +36 -0
- data/project/nkf/_smc/filters/filters.yml +3 -0
- data/project/nkf/_smc/filters/nkf_filter.rb +15 -0
- data/project/rake/_smc/Rakefile +68 -0
- data/project/redcloth/_smc/helpers/red_cloth_helper.rb +10 -0
- data/project/redcloth/_smc/templates/textile.rhtml +5 -0
- data/project/relpath/_smc/filters/filters.yml +2 -0
- data/project/relpath/_smc/filters/relpath_filter.rb +13 -0
- data/project/standard/_dir.smc +2 -0
- data/project/standard/_smc/helpers/base_helper.rb +34 -0
- data/project/standard/_smc/helpers/menu_helper.rb +23 -0
- data/project/standard/_smc/templates/default.rhtml +5 -0
- data/project/standard/_smc/templates/footer.rhtml +13 -0
- data/project/standard/_smc/templates/header.rhtml +37 -0
- data/project/standard/_smc/templates/menu.rhtml +6 -0
- data/project/standard/_smc/templates/redirect.rhtml +13 -0
- data/project/standard/_smc/templates/sidebar.rhtml +7 -0
- data/project/standard/_smc/templates/topic_path.rhtml +6 -0
- data/project/standard/common/css/default.css +145 -0
- data/project/standard/common/css/print.css +0 -0
- data/project/standard/index.html.smc +3 -0
- data/project/standard/sample/_dir.smc +1 -0
- data/project/standard/sample/index.html.smc +7 -0
- data/project/standard/sample/redirect.html.smc +2 -0
- data/project/standard/sample/sub/_dir.smc +1 -0
- data/project/standard/sample/sub/contents.html.smc +3 -0
- data/project/standard/sample/sub/index.html.smc +7 -0
- data/spec/data/htdocs1/_dir.smc +0 -0
- data/spec/data/htdocs1/a/b/c/index.html.smc +6 -0
- data/spec/data/htdocs2/_smc/templates/dummy.rhtml +0 -0
- data/spec/data/htdocs2/a/b/c/test.html +1 -0
- data/spec/data/htdocs2/a/b/test.html +1 -0
- data/spec/data/htdocs2/a/test.html.smc +2 -0
- data/spec/document_path_spec.rb +42 -0
- data/spec/export_spec.rb +45 -0
- data/spec/import_spec.rb +20 -0
- data/spec/loader_spec.rb +55 -0
- data/spec/manifest_spec.rb +39 -0
- data/spec/misc_spec.rb +25 -0
- data/spec/smallcage_spec.rb +40 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- data/test/test_helper.rb +2 -0
- data/test/test_smallcage.rb +11 -0
- metadata +193 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
<html>
|
|
2
|
+
<head>
|
|
3
|
+
<title>SmallCage Auto Update</title>
|
|
4
|
+
<script type="text/javascript">
|
|
5
|
+
<!--
|
|
6
|
+
|
|
7
|
+
function getTransport() {
|
|
8
|
+
var imprements = [
|
|
9
|
+
function() {return new XMLHttpRequest()},
|
|
10
|
+
function() {return new ActiveXObject('Msxml2.XMLHTTP')},
|
|
11
|
+
function() {return new ActiveXObject('Microsoft.XMLHTTP')}
|
|
12
|
+
];
|
|
13
|
+
var returnValue;
|
|
14
|
+
for (var i = 0; i < imprements.length; i++) {
|
|
15
|
+
var lambda = imprements[i];
|
|
16
|
+
try {
|
|
17
|
+
returnValue = lambda();
|
|
18
|
+
break;
|
|
19
|
+
} catch (e) { }
|
|
20
|
+
}
|
|
21
|
+
return returnValue;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function getSource(uri, loaded, failed) {
|
|
25
|
+
var transport = getTransport();
|
|
26
|
+
transport.open("GET", uri, true);
|
|
27
|
+
|
|
28
|
+
transport.onreadystatechange=function() {
|
|
29
|
+
if (transport.readyState == 4) {
|
|
30
|
+
if (transport.status == 200) {
|
|
31
|
+
loaded(transport.responseText);
|
|
32
|
+
} else {
|
|
33
|
+
if (failed) {
|
|
34
|
+
failed(transport);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
transport.send(null);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function initTimer(span) {
|
|
43
|
+
window.setInterval("checkUpdate()", span);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
var loading = false;
|
|
47
|
+
var currentSrc = "";
|
|
48
|
+
var currentUri = "";
|
|
49
|
+
|
|
50
|
+
function checkUpdate() {
|
|
51
|
+
if (loading) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (scrollWait) {
|
|
56
|
+
targetWindow.scrollBy(scrollWait.x, scrollWait.y);
|
|
57
|
+
scrollWait = null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
var success = function(src) {
|
|
61
|
+
loading = false;
|
|
62
|
+
if (currentSrc == src) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
currentSrc = src;
|
|
66
|
+
|
|
67
|
+
lines = src.split("\n")
|
|
68
|
+
var uri = lines[0];
|
|
69
|
+
showPage(uri);
|
|
70
|
+
document.getElementById("main").innerHTML =
|
|
71
|
+
"<p>Latest Updated Page: <a href=\"" + uri + "\" target=\"smcauto\">" + uri + "</a></p><p>" + lines[1] + "</p>";
|
|
72
|
+
};
|
|
73
|
+
var failed = function(src) {
|
|
74
|
+
document.getElementById("main").innerHTML = "<p>Load error</p>";
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
getSource("/_smc/update_uri", success, failed);
|
|
78
|
+
loading = true;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
var targetWindow = null;
|
|
82
|
+
var scrollWait = null;
|
|
83
|
+
function showPage(uri) {
|
|
84
|
+
if (targetWindow == null) {
|
|
85
|
+
if (uri == ":reload") {
|
|
86
|
+
uri = "/";
|
|
87
|
+
}
|
|
88
|
+
targetWindow = window.open(uri, "smcauto");
|
|
89
|
+
} else {
|
|
90
|
+
if (uri == ":reload") {
|
|
91
|
+
var realuri = targetWindow.location.href;
|
|
92
|
+
} else {
|
|
93
|
+
var realuri = uri;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
var x = targetWindow.scrollX;
|
|
97
|
+
var y = targetWindow.scrollY;
|
|
98
|
+
|
|
99
|
+
targetWindow.location = realuri;
|
|
100
|
+
if (currentUri == realuri) {
|
|
101
|
+
scrollWait = {"x": x, "y":y};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
currentUri = uri;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// -->
|
|
108
|
+
</script>
|
|
109
|
+
|
|
110
|
+
</head>
|
|
111
|
+
|
|
112
|
+
<body onLoad="initTimer(1000)">
|
|
113
|
+
|
|
114
|
+
<div id="main">
|
|
115
|
+
Latest Updated Page:
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
</body>
|
|
119
|
+
</html>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module SmallCage
|
|
2
|
+
class Runner
|
|
3
|
+
def self.run(opts)
|
|
4
|
+
Runner.new(opts).send(opts[:command])
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def initialize(opts)
|
|
8
|
+
@opts = opts
|
|
9
|
+
require_command "base"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def update
|
|
13
|
+
require_command "update"
|
|
14
|
+
SmallCage::Commands::Update.execute(@opts)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def clean
|
|
18
|
+
require_command "clean"
|
|
19
|
+
SmallCage::Commands::Clean.execute(@opts)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def server
|
|
23
|
+
require_command "server"
|
|
24
|
+
SmallCage::Commands::Server.execute(@opts)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def auto
|
|
28
|
+
require_command "auto"
|
|
29
|
+
SmallCage::Commands::Auto.execute(@opts)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def import
|
|
33
|
+
require_command "import"
|
|
34
|
+
SmallCage::Commands::Import.execute(@opts)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def manifest
|
|
38
|
+
require_command "manifest"
|
|
39
|
+
SmallCage::Commands::Manifest.execute(@opts)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def export
|
|
43
|
+
require_command "export"
|
|
44
|
+
SmallCage::Commands::Export.execute(@opts)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def require_command(name)
|
|
48
|
+
require "smallcage/commands/#{name}.rb"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module SmallCage
|
|
2
|
+
module BaseHelper
|
|
3
|
+
include ERB::Util
|
|
4
|
+
|
|
5
|
+
def _glob(path, rex)
|
|
6
|
+
base_dir = nil
|
|
7
|
+
if path.to_s[0] == ?/
|
|
8
|
+
base_dir = @obj["dirs"][0]["path"]
|
|
9
|
+
base_dir = base_dir.join(path[1..-1])
|
|
10
|
+
else
|
|
11
|
+
base_dir = @obj["dirs"].last["path"]
|
|
12
|
+
base_dir = base_dir.join(path)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
entries = Dir.glob("#{base_dir}/**/*")
|
|
16
|
+
|
|
17
|
+
result = []
|
|
18
|
+
entries.each do |path|
|
|
19
|
+
result << path if path.to_s =~ rex
|
|
20
|
+
end
|
|
21
|
+
return result.sort
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def _with(o)
|
|
25
|
+
tmpobj = @obj
|
|
26
|
+
@obj = o
|
|
27
|
+
yield
|
|
28
|
+
@obj = tmpobj
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def _load(path)
|
|
32
|
+
path = Pathname.new(path)
|
|
33
|
+
@loader.load(path)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def _erb(body)
|
|
37
|
+
@renderer.render_string(body, @obj)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
end
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module SmallCage
|
|
2
|
+
module LangHelper
|
|
3
|
+
|
|
4
|
+
def lang
|
|
5
|
+
return @obj["lang"] unless @obj["lang"].nil?
|
|
6
|
+
|
|
7
|
+
if @obj["uri"] =~ %r{^/(ja|en)/}
|
|
8
|
+
return $1
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
return nil
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def switch_lang(code)
|
|
15
|
+
@obj["uri"].gsub(%r{^/(en|ja)/}, "/#{code}/")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module SmallCage
|
|
2
|
+
|
|
3
|
+
# news entry file ... YYYYMMDDHHMM.html.smc
|
|
4
|
+
# archive file ... YYYY.html.smc or YYYYMM.html.smc or YYYYMMDD.html.smc
|
|
5
|
+
module NewsHelper
|
|
6
|
+
|
|
7
|
+
def each_latest_news(amount, &block)
|
|
8
|
+
i = 0
|
|
9
|
+
_glob(".", %r{/\d{12}\.html\.smc$}).reverse.each do |path|
|
|
10
|
+
_with(_load(path), &block)
|
|
11
|
+
i += 1
|
|
12
|
+
break if amount <= i
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def each_archived_news(&block)
|
|
17
|
+
date = @obj["uri"].match(%r{/(\d{4})(\d{2})?(\d{2})?\.html$}).to_a
|
|
18
|
+
date.shift
|
|
19
|
+
date = date.join("")
|
|
20
|
+
_glob(".", %r{/#{date}\d{#{12-date.length}}\.html\.smc$}).reverse.each do |path|
|
|
21
|
+
_with(_load(path), &block)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def news_time
|
|
26
|
+
date = @obj["uri"].match(%r{/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})\.html}).to_a
|
|
27
|
+
date.shift
|
|
28
|
+
return Time.local(*date)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def news_ftime(format = "%Y-%m-%d")
|
|
32
|
+
news_time().strftime(format)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
Dir.chdir(File.dirname(__FILE__) + "/..")
|
|
2
|
+
|
|
3
|
+
require 'pathname'
|
|
4
|
+
require 'rubygems'
|
|
5
|
+
require 'smallcage'
|
|
6
|
+
|
|
7
|
+
task :default => :smcupdate
|
|
8
|
+
|
|
9
|
+
task :smcupdate do
|
|
10
|
+
system "smc update"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def load_svnignores(loader, path)
|
|
14
|
+
dirs = loader.load_dirs(Pathname.new(path) + "child_dummy") # TODO
|
|
15
|
+
ignores = []
|
|
16
|
+
dirs.reverse.each do |d|
|
|
17
|
+
data = d["svnignore"]
|
|
18
|
+
ignores << data unless data.to_s.empty?
|
|
19
|
+
break if d["svnignore_reset"]
|
|
20
|
+
end
|
|
21
|
+
data = dirs.last["svnignore_current"]
|
|
22
|
+
unless data.to_s.empty?
|
|
23
|
+
ignores << data
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
ignores.flatten!
|
|
27
|
+
ignores.uniq!
|
|
28
|
+
ignores.sort!
|
|
29
|
+
return ignores
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def set_svnignore(dryrun = false)
|
|
33
|
+
loader = SmallCage::Loader.new(".")
|
|
34
|
+
|
|
35
|
+
exec_svn(loader, ".", dryrun)
|
|
36
|
+
Dir.glob("**/") do |f|
|
|
37
|
+
exec_svn(loader, f, dryrun)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def exec_svn(loader, f, dryrun)
|
|
42
|
+
return if f =~ %r{^_smc/}
|
|
43
|
+
svnignores = load_svnignores(loader, f).join("\n")
|
|
44
|
+
return if svnignores.empty?
|
|
45
|
+
cmd = "svn propset svn:ignore '#{svnignores}' #{f}"
|
|
46
|
+
puts cmd
|
|
47
|
+
return if dryrun
|
|
48
|
+
puts "FAILED: #{cmd}" unless system cmd
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# _dir.smc
|
|
52
|
+
# svnignore: *.html # set recursively.
|
|
53
|
+
# svnignore_current: .project # add only current dir.
|
|
54
|
+
# svnignore_reset: true # ignore parent directory settings.
|
|
55
|
+
#
|
|
56
|
+
# You can use list.
|
|
57
|
+
# svnignore:
|
|
58
|
+
# - *.html
|
|
59
|
+
# - *.xml
|
|
60
|
+
desc "svn propset svn:ignore ..."
|
|
61
|
+
task :svnignore do
|
|
62
|
+
set_svnignore
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
desc "confirm svn commands."
|
|
66
|
+
task :svnignore_dryrun do
|
|
67
|
+
set_svnignore(true)
|
|
68
|
+
end
|