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.
Files changed (79) hide show
  1. data/History.txt +48 -0
  2. data/License.txt +20 -0
  3. data/README.txt +1 -0
  4. data/Rakefile +140 -0
  5. data/bin/smc +16 -0
  6. data/lib/smallcage.rb +18 -0
  7. data/lib/smallcage/application.rb +164 -0
  8. data/lib/smallcage/commands/auto.rb +158 -0
  9. data/lib/smallcage/commands/base.rb +19 -0
  10. data/lib/smallcage/commands/clean.rb +32 -0
  11. data/lib/smallcage/commands/export.rb +41 -0
  12. data/lib/smallcage/commands/import.rb +217 -0
  13. data/lib/smallcage/commands/manifest.rb +39 -0
  14. data/lib/smallcage/commands/server.rb +15 -0
  15. data/lib/smallcage/commands/update.rb +121 -0
  16. data/lib/smallcage/document_path.rb +46 -0
  17. data/lib/smallcage/erb_base.rb +16 -0
  18. data/lib/smallcage/http_server.rb +66 -0
  19. data/lib/smallcage/loader.rb +278 -0
  20. data/lib/smallcage/misc.rb +13 -0
  21. data/lib/smallcage/renderer.rb +19 -0
  22. data/lib/smallcage/resources/Manifest.erb +19 -0
  23. data/lib/smallcage/resources/auto.html +119 -0
  24. data/lib/smallcage/runner.rb +51 -0
  25. data/lib/smallcage/version.rb +9 -0
  26. data/project/base/_smc/helpers/base_helper.rb +41 -0
  27. data/project/base/_smc/helpers/site_helper.rb +5 -0
  28. data/project/base/_smc/templates/default.rhtml +5 -0
  29. data/project/base/_smc/templates/footer.rhtml +0 -0
  30. data/project/base/_smc/templates/header.rhtml +0 -0
  31. data/project/bluecloth/_smc/helpers/blue_cloth_helper.rb +10 -0
  32. data/project/bluecloth/_smc/templates/markdown.rhtml +5 -0
  33. data/project/lang/_smc/helpers/lang_helper.rb +19 -0
  34. data/project/lang/_smc/templates/other_lang.rhtml +6 -0
  35. data/project/news/_smc/helpers/news_helper.rb +36 -0
  36. data/project/nkf/_smc/filters/filters.yml +3 -0
  37. data/project/nkf/_smc/filters/nkf_filter.rb +15 -0
  38. data/project/rake/_smc/Rakefile +68 -0
  39. data/project/redcloth/_smc/helpers/red_cloth_helper.rb +10 -0
  40. data/project/redcloth/_smc/templates/textile.rhtml +5 -0
  41. data/project/relpath/_smc/filters/filters.yml +2 -0
  42. data/project/relpath/_smc/filters/relpath_filter.rb +13 -0
  43. data/project/standard/_dir.smc +2 -0
  44. data/project/standard/_smc/helpers/base_helper.rb +34 -0
  45. data/project/standard/_smc/helpers/menu_helper.rb +23 -0
  46. data/project/standard/_smc/templates/default.rhtml +5 -0
  47. data/project/standard/_smc/templates/footer.rhtml +13 -0
  48. data/project/standard/_smc/templates/header.rhtml +37 -0
  49. data/project/standard/_smc/templates/menu.rhtml +6 -0
  50. data/project/standard/_smc/templates/redirect.rhtml +13 -0
  51. data/project/standard/_smc/templates/sidebar.rhtml +7 -0
  52. data/project/standard/_smc/templates/topic_path.rhtml +6 -0
  53. data/project/standard/common/css/default.css +145 -0
  54. data/project/standard/common/css/print.css +0 -0
  55. data/project/standard/index.html.smc +3 -0
  56. data/project/standard/sample/_dir.smc +1 -0
  57. data/project/standard/sample/index.html.smc +7 -0
  58. data/project/standard/sample/redirect.html.smc +2 -0
  59. data/project/standard/sample/sub/_dir.smc +1 -0
  60. data/project/standard/sample/sub/contents.html.smc +3 -0
  61. data/project/standard/sample/sub/index.html.smc +7 -0
  62. data/spec/data/htdocs1/_dir.smc +0 -0
  63. data/spec/data/htdocs1/a/b/c/index.html.smc +6 -0
  64. data/spec/data/htdocs2/_smc/templates/dummy.rhtml +0 -0
  65. data/spec/data/htdocs2/a/b/c/test.html +1 -0
  66. data/spec/data/htdocs2/a/b/test.html +1 -0
  67. data/spec/data/htdocs2/a/test.html.smc +2 -0
  68. data/spec/document_path_spec.rb +42 -0
  69. data/spec/export_spec.rb +45 -0
  70. data/spec/import_spec.rb +20 -0
  71. data/spec/loader_spec.rb +55 -0
  72. data/spec/manifest_spec.rb +39 -0
  73. data/spec/misc_spec.rb +25 -0
  74. data/spec/smallcage_spec.rb +40 -0
  75. data/spec/spec.opts +1 -0
  76. data/spec/spec_helper.rb +9 -0
  77. data/test/test_helper.rb +2 -0
  78. data/test/test_smallcage.rb +11 -0
  79. 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,9 @@
1
+ module SmallCage #:nodoc:
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 1
5
+ TINY = 3
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ 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
@@ -0,0 +1,5 @@
1
+ module SmallCage
2
+ module SiteHelper
3
+
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ <%= header %>
2
+
3
+ <%= body %>
4
+
5
+ <%= footer %>
File without changes
File without changes
@@ -0,0 +1,10 @@
1
+ module SmallCage
2
+ module BlueClothHelper
3
+ require "bluecloth"
4
+
5
+ def render_markdown(str)
6
+ BlueCloth.new(str).to_html
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ <%= header %>
2
+
3
+ <%= render_markdown(body) %>
4
+
5
+ <%= footer %>
@@ -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,6 @@
1
+ <%- unless lang == "ja" -%>
2
+ <a href="<%= switch_lang('ja') %>">Japanese</a>
3
+ <%- end -%>
4
+ <%- unless lang == "en" -%>
5
+ <a href="<%= switch_lang('en') %>">English</a>
6
+ <%- 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,3 @@
1
+ after_rendering_filters:
2
+ - name: nkf_filter
3
+ args: "-W -s" # UTF-8 to SJIS
@@ -0,0 +1,15 @@
1
+ module SmallCage
2
+ require "nkf"
3
+
4
+ class NkfFilter
5
+
6
+ def initialize(opts)
7
+ @args = opts["args"]
8
+ end
9
+
10
+ def after_rendering_filter(obj, str)
11
+ return NKF.nkf(@args, str)
12
+ end
13
+
14
+ end
15
+ 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
@@ -0,0 +1,10 @@
1
+ module SmallCage
2
+ module RedClothHelper
3
+ require "redcloth"
4
+
5
+ def render_textile(str)
6
+ RedCloth.new(str).to_html
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ <%= header %>
2
+
3
+ <%= render_textile(body) %>
4
+
5
+ <%= footer %>
@@ -0,0 +1,2 @@
1
+ after_rendering_filters:
2
+ - name: relpath_filter