juli 2.1.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +0 -1
- data/README.rdoc +1 -1
- data/Rakefile +1 -1
- data/doc/.juli/config +1 -1
- data/doc/.juli/{sourceforge.html → github.html} +4 -6
- data/doc/.juli/slidy.html +3 -5
- data/doc/.juli/takahashi_method.html +3 -5
- data/doc/index.txt +4 -25
- data/doc/juli(1).txt +1 -1
- data/doc/juli_tb.rb(1).txt +1 -1
- data/doc/photo(macro)/architecture.odg +0 -0
- data/doc/photo(macro)/architecture_1.png +0 -0
- data/doc/photo(macro).txt +46 -18
- data/doc/template.txt +2 -2
- data/juli.gemspec +5 -2
- data/lib/juli/macro/photo.rb +120 -24
- data/lib/juli/template/default.html +1 -1
- data/lib/juli/template/facebook.html +1 -1
- data/lib/juli/template/juli.css +59 -2
- data/lib/juli/template/sitemap.html +4 -6
- data/lib/juli/template/sitemap_order_by_mtime_DESC.html +4 -6
- data/lib/juli/template/slidy.html +3 -5
- data/lib/juli/template/sourceforge.html +4 -6
- data/lib/juli/template/takahashi_method.html +3 -5
- data/lib/juli/version.rb +1 -1
- metadata +49 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 23d7f4a628fca794dbc15c32e627de9887c5d95df32de6047985c1fdf69783a8
|
4
|
+
data.tar.gz: 1655dbe0f42221c7ca44afa3c1e1503032d38bd2e01bddd7f453da23fcfa0fe8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b3e6179071d46103f5dfedf5a8fd5b9be480faca6863fe835b388d8d8f647f6111f17ed7024bd5c2435aa59810133cfca3633179100526fa917d3bd7adb5952
|
7
|
+
data.tar.gz: ff2588d8e3321ab95df3f0e3f813f7011efcc22a4c3285ef09d5a5582f9399f58ab693d288f298ec83702c75b5d762e0b0fdaf79a3a831079293fd392b2aef2d
|
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
data/Rakefile
CHANGED
@@ -84,7 +84,7 @@ namespace :doc do
|
|
84
84
|
end
|
85
85
|
|
86
86
|
desc 'clean working files'
|
87
|
-
task clean: ['doc:clobber_app'
|
87
|
+
task clean: ['doc:clobber_app'] do
|
88
88
|
sh "find . -name '*~' -exec rm {} \\;"
|
89
89
|
sh 'rm', '-rf', *[parsers, test_conf_outout_top,
|
90
90
|
'InstalledFiles', '.config', # setup.rb generated
|
data/doc/.juli/config
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
output_top: ../doc_html/
|
2
|
-
template:
|
2
|
+
template: github.html
|
3
3
|
ext: .shtml
|
4
4
|
#amazon: '<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=wells00-22&o=9&p=8&l=as1&asins=%{asins}&ref=tf_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="float:right; width:120px;height:240px;margin:3px" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>'
|
5
5
|
amazon: '<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=wells00-22&o=9&p=8&l=as1&asins=%{asins}&ref=tf_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="float:right; width:120px;height:240px;margin:30px" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>'
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
2
2
|
<html>
|
3
3
|
<%#
|
4
|
-
This template is only for juli project's
|
4
|
+
This template is only for juli project's document.
|
5
5
|
|
6
6
|
DO NOT MODIFY THIS FILE DIRECTORY!
|
7
7
|
|
@@ -71,10 +71,8 @@ contents:: draw contents of page
|
|
71
71
|
<br/><br/>
|
72
72
|
<%= body %>
|
73
73
|
<hr/>
|
74
|
-
<a href="
|
75
|
-
><img src="
|
76
|
-
|
77
|
-
alt="Get jj_juli at SourceForge.net. Fast, secure and Free Open Source software downloads"
|
78
|
-
/></a> | Generated by <a href='http://jjjuli.sourceforge.net/'>juli <%= Juli::VERSION %></a>
|
74
|
+
<a href="https://github.com/fuminori-ido/juli"
|
75
|
+
><img height="32" width="32" src="https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/github.svg"
|
76
|
+
/></a> Generated by <a href='https://github.com/fuminori-ido/juli'>juli <%= Juli::VERSION %></a>
|
79
77
|
</body>
|
80
78
|
</html>
|
data/doc/.juli/slidy.html
CHANGED
@@ -182,11 +182,9 @@ so that please do not delete them.
|
|
182
182
|
<table width='100%'>
|
183
183
|
<tr>
|
184
184
|
<td>
|
185
|
-
<a href="
|
186
|
-
|
187
|
-
|
188
|
-
alt="Get jj_juli at SourceForge.net. Fast, secure and Free Open Source software downloads"
|
189
|
-
/></a> | Generated by <a href='http://jjjuli.sourceforge.net/'>juli <%= Juli::VERSION %></a>
|
185
|
+
<a href="https://github.com/fuminori-ido/juli"
|
186
|
+
><img height="32" width="32" src="https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/github.svg"
|
187
|
+
/></a> Generated by <a href='https://github.com/fuminori-ido/juli'>juli <%= Juli::VERSION %></a>
|
190
188
|
</td>
|
191
189
|
<td align=right>
|
192
190
|
slide <span id=curr_page></span>/<span id=total_page></span>
|
@@ -93,11 +93,9 @@ so that please do not delete them.
|
|
93
93
|
<table width='100%'>
|
94
94
|
<tr>
|
95
95
|
<td>
|
96
|
-
<a href="
|
97
|
-
><img src="
|
98
|
-
|
99
|
-
alt="Get jj_juli at SourceForge.net. Fast, secure and Free Open Source software downloads"
|
100
|
-
/></a> | Generated by <a href='http://jjjuli.sourceforge.net/'>juli <%= Juli::VERSION %></a>
|
96
|
+
<a href="https://github.com/fuminori-ido/juli"
|
97
|
+
><img height="32" width="32" src="https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/github.svg"
|
98
|
+
/></a> Generated by <a href='https://github.com/fuminori-ido/juli'>juli <%= Juli::VERSION %></a>
|
101
99
|
</td>
|
102
100
|
<td align=right>
|
103
101
|
slide <span id=curr_page></span>/<span id=total_page></span>
|
data/doc/index.txt
CHANGED
@@ -173,21 +173,6 @@ text file revision control is handled by je(1).
|
|
173
173
|
|
174
174
|
$ gem install juli
|
175
175
|
|
176
|
-
== from package
|
177
|
-
Prerequisites:
|
178
|
-
* rsync
|
179
|
-
* ruby-1.9
|
180
|
-
* RMagick (for photo(macro))
|
181
|
-
* sdbm (for tag(macro))
|
182
|
-
* i18n
|
183
|
-
|
184
|
-
1. download package from http://sourceforge.net/projects/jjjuli/files/
|
185
|
-
1. run setup.rb as follows:
|
186
|
-
|
187
|
-
$ tar zxvf juli-#.##.##.tgz
|
188
|
-
$ cd juli-#.##.##
|
189
|
-
$ ruby setup.rb # you may need 'sudo'
|
190
|
-
|
191
176
|
== from repository
|
192
177
|
|
193
178
|
Prerequisites:
|
@@ -199,16 +184,12 @@ Prerequisites:
|
|
199
184
|
* rake
|
200
185
|
* git
|
201
186
|
|
202
|
-
racc tool is required when you download from Sourceforge repository
|
203
|
-
and install it.
|
204
187
|
|
205
|
-
$ git clone git
|
206
|
-
$ cd
|
188
|
+
$ git clone git@github.com:fuminori-ido/juli.git
|
189
|
+
$ cd juli
|
207
190
|
$ rake # generate ruby source from *.y files
|
208
191
|
$ ruby setup.rb # you may need 'sudo'
|
209
192
|
|
210
|
-
* prototype.js is used (included in this package).
|
211
|
-
|
212
193
|
= See Also
|
213
194
|
|
214
195
|
== Sub topics
|
@@ -248,12 +229,10 @@ I found the following competitors also after the comparison research:
|
|
248
229
|
|
249
230
|
Any feedback is welcome. Please check the followings:
|
250
231
|
|
251
|
-
* <a href='
|
252
|
-
* <a href='http://sourceforge.net/projects/jjjuli/forums'>Help</a>
|
253
|
-
* <a href='http://sourceforge.net/tracker/?group_id=390715'>Bug Report, Feature Requests</a>
|
232
|
+
* <a href='https://github.com/fuminori-ido/juli/issues'>Bug Report, Feature Requests</a>
|
254
233
|
|
255
234
|
== Author
|
256
|
-
Fuminori Ido, https://
|
235
|
+
Fuminori Ido, https://github.com/fuminori-ido
|
257
236
|
|
258
237
|
== License
|
259
238
|
|
data/doc/juli(1).txt
CHANGED
data/doc/juli_tb.rb(1).txt
CHANGED
Binary file
|
Binary file
|
data/doc/photo(macro).txt
CHANGED
@@ -32,17 +32,23 @@ Example:
|
|
32
32
|
|
33
33
|
will be:
|
34
34
|
|
35
|
+
<hr/>
|
36
|
+
|
35
37
|
\{photo 2012-04-22/DCIM/101_PANA/P1010441.JPG}
|
36
38
|
|
37
39
|
When I visited the ruins of Hachioji-Castle in Japan,
|
38
40
|
I saw many beautiful statue of Buddha.
|
39
41
|
Here is one of them.
|
40
42
|
|
43
|
+
<hr/>
|
44
|
+
|
45
|
+
<br clear='all' />
|
46
|
+
|
41
47
|
In general, in Juli wiki text, write as follows:
|
42
48
|
|
43
49
|
\{photo a/b/c.jpg}
|
44
50
|
|
45
|
-
Where, a/b/c.jpg is a relative-path of the photo file from '
|
51
|
+
Where, a/b/c.jpg is a relative-path of the photo file from 'storage'
|
46
52
|
directory (see 'setup' section below).
|
47
53
|
|
48
54
|
As you see this example, by clicking this small photo,
|
@@ -64,23 +70,29 @@ Where,
|
|
64
70
|
* 'output_top' above is the juli configuration parameter specified in .juli/config
|
65
71
|
for HTML generated document top directory.
|
66
72
|
See juli(1) and/or tutorial.
|
67
|
-
* 'photo.
|
73
|
+
* 'photo.storages' above is configuration parameter in this macro
|
68
74
|
for all of your photo master file directory which may include
|
69
75
|
some private photos. Of course, only photos you specify in
|
70
76
|
\\{photo ...} macro are copied to public_photo as above figure shows.
|
71
77
|
See 'Setup' section below.
|
78
|
+
* 'photo.mount' is deprecated since v2.2.0
|
72
79
|
|
73
80
|
== Setup
|
74
81
|
|
75
|
-
1.
|
76
|
-
|
77
|
-
|
78
|
-
Maintenace of the mount directory is up to you.
|
79
|
-
If you have several directories, create one directory, and
|
80
|
-
move the directories under it or symlink to each.
|
82
|
+
1. For images in juli, use local photo directory and/or AWS S3.
|
83
|
+
We call it 'photo.storages' in this macro.
|
84
|
+
Maintenace of the 'photo.storages' is up to you.
|
81
85
|
1. In .juli/config, setup photo related entries like the followings:
|
82
86
|
photo:
|
83
|
-
|
87
|
+
storages:
|
88
|
+
- kind: local
|
89
|
+
dir: /home/wells/photo
|
90
|
+
- kind: aws
|
91
|
+
params:
|
92
|
+
region: ap-northeast-1
|
93
|
+
profile: juli
|
94
|
+
bucket: juli
|
95
|
+
prefix: photo
|
84
96
|
small:
|
85
97
|
width: 512
|
86
98
|
style: '...'
|
@@ -89,8 +101,10 @@ Where,
|
|
89
101
|
|
90
102
|
Where, each key means as follows:
|
91
103
|
|
92
|
-
|
93
|
-
|
104
|
+
storages[].kind::
|
105
|
+
either 'local' or 'aws'
|
106
|
+
storages[].dir::
|
107
|
+
Top directory of photos when kind == 'local'.
|
94
108
|
It is usually photo master file directory, photo uploade directory, or
|
95
109
|
SD-card back-up directory on your PC.
|
96
110
|
It SHOULD be NON-PUBLIC directory to protect annonymous
|
@@ -100,6 +114,12 @@ mount::
|
|
100
114
|
Relative path can be used, which is relative from JULI_REPO, not
|
101
115
|
from .juli/config.
|
102
116
|
Example: /home/wells/photo
|
117
|
+
storages[].params::
|
118
|
+
S3 access information when kind == 'aws'.
|
119
|
+
storages[].bucket::
|
120
|
+
S3 bucket name when kind == 'aws'.
|
121
|
+
storages[].prefix::
|
122
|
+
(not used now)
|
103
123
|
small::
|
104
124
|
small photo related configurations. See below for the detail.
|
105
125
|
small.width::
|
@@ -108,7 +128,7 @@ small.width::
|
|
108
128
|
small.style::
|
109
129
|
Small photo's style sheet.
|
110
130
|
'img.juli_photo_small' entry in the
|
111
|
-
doc/.juli/
|
131
|
+
doc/.juli/github.html file (in this package) is one of the example.
|
112
132
|
large::
|
113
133
|
large photo related configurations. See below for the detail.
|
114
134
|
large.width::
|
@@ -124,13 +144,13 @@ This setup is one-shot task.
|
|
124
144
|
|
125
145
|
== Maintenance
|
126
146
|
|
127
|
-
When you add photo, just
|
128
|
-
|
147
|
+
When you add photo in you 'storage', just execute 'juli(1)', then
|
148
|
+
photo in the storage is copied to public site.
|
129
149
|
|
130
150
|
== Security
|
131
151
|
|
132
|
-
1. When you set '
|
133
|
-
under the '
|
152
|
+
1. When you set 'storages[].dir', it SHOULD be out-of-url so that any photo
|
153
|
+
under the 'dir' cannot be accessed via internet.
|
134
154
|
1. Only photo referring by this macro can be accessed via internet.
|
135
155
|
|
136
156
|
== File permission
|
@@ -140,7 +160,7 @@ The following permission is required on juli(1):
|
|
140
160
|
* write permission on output_top/public_photo/ directory.
|
141
161
|
Where, output_top is the directory for generated HTML
|
142
162
|
specified at .juli/config.
|
143
|
-
* read permission under '
|
163
|
+
* read permission under 'storage'.
|
144
164
|
|
145
165
|
== Example
|
146
166
|
|
@@ -149,7 +169,15 @@ The following permission is required on juli(1):
|
|
149
169
|
<a href='#'>This document</a>'s \\{photo} macro setup is as follows:
|
150
170
|
|
151
171
|
photo:
|
152
|
-
|
172
|
+
storages:
|
173
|
+
- kind: local
|
174
|
+
dir: '/home/wells/photo'
|
175
|
+
- kind: aws
|
176
|
+
params:
|
177
|
+
region: ap-northeast-1
|
178
|
+
profile: juli
|
179
|
+
bucket: juli
|
180
|
+
prefix: ''
|
153
181
|
small:
|
154
182
|
width: 200
|
155
183
|
style: 'float: right'
|
data/doc/template.txt
CHANGED
@@ -206,8 +206,8 @@ but the purpose is different.
|
|
206
206
|
Helper is used for \{!template} and macro is used in juli wiki page.
|
207
207
|
|
208
208
|
Currently, there is no plan to integrate them.
|
209
|
-
If you need, please request me it with the detailed reason via
|
210
|
-
|
209
|
+
If you need, please request me it with the detailed reason via github page
|
210
|
+
https://github.com/fuminori-ido/juli
|
211
211
|
-> Tracker
|
212
212
|
-> Feature Request, thank you!
|
213
213
|
|
data/juli.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.name = "juli"
|
9
9
|
spec.version = Juli::VERSION
|
10
10
|
spec.authors = ["ido"]
|
11
|
-
spec.email = ["
|
11
|
+
spec.email = ["ido-gh@wtech.jp"]
|
12
12
|
|
13
13
|
spec.summary = %q{Offline wiki, and outline processor}
|
14
14
|
spec.description = %q{Offline wiki, and outline processor}
|
@@ -22,12 +22,15 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.executables = 'juli'
|
23
23
|
spec.require_paths = ["lib"]
|
24
24
|
|
25
|
+
spec.add_runtime_dependency 'aws-sdk-s3'
|
25
26
|
spec.add_runtime_dependency 'i18n'
|
26
27
|
spec.add_runtime_dependency 'rmagick'
|
27
28
|
|
29
|
+
spec.add_development_dependency 'byebug'
|
28
30
|
spec.add_development_dependency 'racc'
|
29
31
|
spec.add_development_dependency 'simplecov'
|
30
|
-
spec.add_development_dependency "bundler", "~>
|
32
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
31
33
|
spec.add_development_dependency "rake", "~> 10.0"
|
32
34
|
spec.add_development_dependency 'rdoc'
|
35
|
+
spec.add_development_dependency 'test-unit'
|
33
36
|
end
|
data/lib/juli/macro/photo.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+
require 'aws-sdk-s3'
|
1
2
|
require 'fileutils'
|
2
3
|
require 'digest/sha1'
|
3
4
|
require 'rmagick'
|
4
5
|
require 'pp'
|
6
|
+
require 'tmpdir'
|
5
7
|
|
6
8
|
module Juli
|
7
9
|
module Macro
|
@@ -14,7 +16,12 @@ module Juli
|
|
14
16
|
PUBLIC_PHOTO_DIR_DEFAULT = 'public_photo'
|
15
17
|
SEED_DEFAULT = '-- Juli seed default!! --'
|
16
18
|
CONF_DEFAULT = {
|
17
|
-
'
|
19
|
+
'storages' => [
|
20
|
+
{
|
21
|
+
'kind' => 'local',
|
22
|
+
'dir' => '/home/YOUR_NAME/Photos',
|
23
|
+
},
|
24
|
+
],
|
18
25
|
'small' => {
|
19
26
|
'width' => 512, # default small width in pixel
|
20
27
|
'style' => 'float: right'
|
@@ -32,15 +39,35 @@ module Juli
|
|
32
39
|
# Photo macro setup sample is as follows.
|
33
40
|
#
|
34
41
|
#photo:
|
35
|
-
# mount:
|
42
|
+
# mount: '#{CONF_DEFAULT['mount']}' # DEPERECATED, use storages[].kind = 'local'
|
43
|
+
# storages:
|
44
|
+
# - kind: local
|
45
|
+
# dir: '#{CONF_DEFAULT['mount']}'
|
46
|
+
# - kind: aws
|
47
|
+
# params:
|
48
|
+
# region: ap-northeast-1
|
49
|
+
# profile: juli
|
50
|
+
# bucket: juli
|
51
|
+
# prefix: photo
|
36
52
|
# small:
|
37
|
-
# width:
|
38
|
-
# style:
|
53
|
+
# width: #{CONF_DEFAULT['small']['width']}
|
54
|
+
# style: '#{CONF_DEFAULT['small']['style']}'
|
39
55
|
# large:
|
40
|
-
# width:
|
56
|
+
# width: #{CONF_DEFAULT['large']['width']}
|
41
57
|
EOM
|
42
58
|
end
|
43
59
|
|
60
|
+
def initialize
|
61
|
+
super
|
62
|
+
for storage in conf_photo && conf_photo['storages'] || {}
|
63
|
+
if storage['kind'] == 'aws'
|
64
|
+
_h = {}
|
65
|
+
storage['params'].each{|k,v| _h[k.to_sym] = v} # to sym
|
66
|
+
@aws = ::Aws::S3::Client.new(_h)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
44
71
|
def set_conf_default(conf)
|
45
72
|
set_conf_default_sub(conf, 'photo', CONF_DEFAULT)
|
46
73
|
end
|
@@ -64,8 +91,8 @@ EOM
|
|
64
91
|
# public photo directory is used to:
|
65
92
|
#
|
66
93
|
# * store converted photo from original one
|
67
|
-
# * protect private photo in 'mount' directory
|
68
|
-
# by copying (with conversion) to it on demand.
|
94
|
+
# * protect private photo in 'mount' directory and storage
|
95
|
+
# from public web access by copying (with conversion) to it on demand.
|
69
96
|
#
|
70
97
|
# === INPUTS
|
71
98
|
# url:: when true, return url, else, return physical file-system path
|
@@ -106,29 +133,23 @@ EOM
|
|
106
133
|
#
|
107
134
|
# and return the path.
|
108
135
|
#
|
136
|
+
# source photo is looked up under the following order:
|
137
|
+
# 1. local directory designated by 'mount' config, if defined
|
138
|
+
# 1. remote storage designated by 'storage' config, if defined
|
139
|
+
#
|
109
140
|
# === INPUTS
|
110
141
|
# path:: photo-macro path argument
|
111
142
|
# size:: :small, or :large
|
112
143
|
# url:: when true, return url, else, return physical file-system path
|
113
144
|
def intern(path, size = :small, url = true)
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
return ''
|
145
|
+
if conf_photo['mount']
|
146
|
+
STDERR.printf "DEPERECATED WARNING: 'mount' is deprecated; use 'storages'\n"
|
147
|
+
result = intern_local_mount(conf_photo['mount'], path, size, url)
|
148
|
+
return result if result != ''
|
118
149
|
end
|
119
150
|
|
120
|
-
|
121
|
-
if
|
122
|
-
File::Stat.new(public_phys_path).mtime < File::Stat.new(protected_path).mtime
|
123
|
-
|
124
|
-
img = Magick::ImageList.new(protected_path)
|
125
|
-
width = (s = conf_photo[size.to_s]) && s['width']
|
126
|
-
img.resize_to_fit!(width, img.rows * width / img.columns)
|
127
|
-
self.rotate(img).
|
128
|
-
strip!.
|
129
|
-
write(public_phys_path).destroy!
|
130
|
-
end
|
131
|
-
photo_path(path, size, url)
|
151
|
+
result = intern_storages(path, size, url)
|
152
|
+
return result if result != ''
|
132
153
|
end
|
133
154
|
|
134
155
|
# return <img...> HTML tag for the photo with this macro features.
|
@@ -149,7 +170,8 @@ EOM
|
|
149
170
|
@conf_photo ||= conf['photo']
|
150
171
|
end
|
151
172
|
|
152
|
-
|
173
|
+
private
|
174
|
+
|
153
175
|
def set_conf_default_sub(hash, key, val)
|
154
176
|
case val
|
155
177
|
when Hash
|
@@ -161,6 +183,80 @@ EOM
|
|
161
183
|
hash[key] = val if !hash[key]
|
162
184
|
end
|
163
185
|
end
|
186
|
+
|
187
|
+
# @return '' if not found
|
188
|
+
def intern_local_mount(mount_dir, path, size, url)
|
189
|
+
protected_path = File.join(mount_dir, path)
|
190
|
+
if !File.exist?(protected_path)
|
191
|
+
#debug("DEBUG: no source photo path(#{protected_path})")
|
192
|
+
return ''
|
193
|
+
end
|
194
|
+
|
195
|
+
public_phys_path = photo_path(path, size, false)
|
196
|
+
if !File.exist?(public_phys_path) ||
|
197
|
+
File::Stat.new(public_phys_path).mtime < File::Stat.new(protected_path).mtime
|
198
|
+
|
199
|
+
img = Magick::ImageList.new(protected_path)
|
200
|
+
width = (s = conf_photo[size.to_s]) && s['width']
|
201
|
+
img.resize_to_fit!(width, img.rows * width / img.columns)
|
202
|
+
self.rotate(img).
|
203
|
+
strip!.
|
204
|
+
write(public_phys_path).destroy!
|
205
|
+
end
|
206
|
+
photo_path(path, size, url)
|
207
|
+
end
|
208
|
+
|
209
|
+
def intern_storages(path, size, url)
|
210
|
+
result = ''
|
211
|
+
for storage in conf_photo && conf_photo['storages'] || {}
|
212
|
+
result = case storage['kind']
|
213
|
+
when 'local'
|
214
|
+
intern_local_mount(storage['dir'], path, size, url)
|
215
|
+
when 'aws'
|
216
|
+
intern_aws(storage, path, size, url)
|
217
|
+
else
|
218
|
+
raise "unsupported kind of storage(#{storage['kind']})"
|
219
|
+
end
|
220
|
+
return result if result != ''
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
# FIXME: I gave up to use 'fog' gem so that I'm using AWS S3 here now.
|
225
|
+
# I welcome somebody implements fog version!
|
226
|
+
def intern_aws(storage, path, size, url)
|
227
|
+
return '' if storage.nil? || storage.empty?
|
228
|
+
|
229
|
+
resp = nil
|
230
|
+
begin
|
231
|
+
resp = @aws.head_object(bucket: storage['bucket'], key: path)
|
232
|
+
rescue ::Aws::S3::Errors::NotFound
|
233
|
+
warn("WARN: no source photo path(#{path}) in storage")
|
234
|
+
return ''
|
235
|
+
end
|
236
|
+
|
237
|
+
public_phys_path = photo_path(path, size, false)
|
238
|
+
if !File.exist?(public_phys_path) ||
|
239
|
+
File::Stat.new(public_phys_path).mtime < resp.last_modified
|
240
|
+
|
241
|
+
work_path = tmpname('juli_photo')
|
242
|
+
resp = @aws.get_object(bucket: storage['bucket'],
|
243
|
+
key: path,
|
244
|
+
response_target: work_path)
|
245
|
+
img = Magick::ImageList.new(work_path)
|
246
|
+
width = (s = conf_photo[size.to_s]) && s['width']
|
247
|
+
img.resize_to_fit!(width, img.rows * width / img.columns)
|
248
|
+
self.rotate(img).
|
249
|
+
strip!.
|
250
|
+
write(public_phys_path).destroy!
|
251
|
+
#FileUtils.rm_f(work_path)
|
252
|
+
end
|
253
|
+
photo_path(path, size, url)
|
254
|
+
end
|
255
|
+
|
256
|
+
def tmpname(base_name)
|
257
|
+
t = Time.now.strftime("%Y%m%d")
|
258
|
+
"/tmp/#{base_name}-#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
|
259
|
+
end
|
164
260
|
end
|
165
261
|
end
|
166
262
|
end
|
@@ -59,6 +59,6 @@ contents:: draw contents of page
|
|
59
59
|
<br/><br/>
|
60
60
|
<%= body %>
|
61
61
|
<hr/>
|
62
|
-
Generated by <a href='
|
62
|
+
Generated by <a href='https://github.com/fuminori-ido/juli'>juli <%= Juli::VERSION %></a>
|
63
63
|
</body>
|
64
64
|
</html>
|
@@ -77,6 +77,6 @@ Facebook developer site application registration page fo
|
|
77
77
|
<%= fb_like %>
|
78
78
|
<%= fb_comments %>
|
79
79
|
<hr/>
|
80
|
-
Generated by <a href='
|
80
|
+
Generated by <a href='https://github.com/fuminori-ido/juli'>juli <%= Juli::VERSION %></a>
|
81
81
|
</body>
|
82
82
|
</html>
|
data/lib/juli/template/juli.css
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
body {
|
2
|
+
line-height: 1.2em;
|
3
|
+
}
|
4
|
+
|
1
5
|
p.default {
|
2
6
|
padding-left: 10px;
|
3
7
|
}
|
@@ -106,7 +110,13 @@ ol, ul {
|
|
106
110
|
|
107
111
|
/* Dictionary list */
|
108
112
|
table.juli_compact_dictionary {
|
109
|
-
|
113
|
+
border: 1px solid #aaa;
|
114
|
+
margin-top: 0.5em;
|
115
|
+
margin-bottom: 0.5em;
|
116
|
+
margin-left: 1em;
|
117
|
+
}
|
118
|
+
table.juli_compact_dictionary td:nth-child(1) {
|
119
|
+
padding-right: 1em;
|
110
120
|
}
|
111
121
|
dl.juli_dictionary dt {
|
112
122
|
margin-top: 0.5em;
|
@@ -144,6 +154,54 @@ div.sitemap {
|
|
144
154
|
text-align: left;
|
145
155
|
}
|
146
156
|
|
157
|
+
|
158
|
+
/*----------------------------------------------------------------
|
159
|
+
Additional
|
160
|
+
----------------------------------------------------------------*/
|
161
|
+
div#header {
|
162
|
+
background: #62a5dc;
|
163
|
+
border-radius: 10px;
|
164
|
+
text-align: center;
|
165
|
+
color: white;
|
166
|
+
height: 8em;
|
167
|
+
}
|
168
|
+
div#header div.site_title {
|
169
|
+
padding-top: 30px;
|
170
|
+
padding-bottom: 5px;
|
171
|
+
font-size: 3em;
|
172
|
+
line-height: 1.2em;
|
173
|
+
}
|
174
|
+
div#header div.site_title a {
|
175
|
+
text-decoration: none;
|
176
|
+
color: white;
|
177
|
+
}
|
178
|
+
div#header div.description {
|
179
|
+
font-size: 90%;
|
180
|
+
padding-bottom: 30px;
|
181
|
+
}
|
182
|
+
img.juli_photo_small {
|
183
|
+
margin: 10px;
|
184
|
+
border-top: 2px solid #888;
|
185
|
+
border-left: 2px solid #888;
|
186
|
+
border-right: 2px solid black;
|
187
|
+
border-bottom: 2px solid black;
|
188
|
+
padding: 0px;
|
189
|
+
}
|
190
|
+
|
191
|
+
table.default {
|
192
|
+
border-collapse: collapse;
|
193
|
+
border: 1px solid #a84;
|
194
|
+
}
|
195
|
+
table.default th, table.default td {
|
196
|
+
border: 1px solid #888;
|
197
|
+
}
|
198
|
+
table.default th.digit, table.default td.digit {
|
199
|
+
text-align: right;
|
200
|
+
}
|
201
|
+
table.default th {
|
202
|
+
background-color: #8db;
|
203
|
+
}
|
204
|
+
|
147
205
|
/*----------------------------------------------------------------
|
148
206
|
Tag list
|
149
207
|
----------------------------------------------------------------*/
|
@@ -159,7 +217,6 @@ a.juli_tag_08 { font-size: 195%; }
|
|
159
217
|
a.juli_tag_09 { font-size: 210%; }
|
160
218
|
a.juli_tag_10 { font-size: 225%; }
|
161
219
|
|
162
|
-
|
163
220
|
/*----------------------------------------------------------------
|
164
221
|
Photo
|
165
222
|
----------------------------------------------------------------*/
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<html>
|
2
2
|
<%#
|
3
|
-
This template is only for juli project's
|
3
|
+
This template is only for juli project's document.
|
4
4
|
%>
|
5
5
|
<!--
|
6
6
|
|
@@ -69,10 +69,8 @@ sitemap_order_by_mtime_DESC.html:: sitemap template (mtime decendant order)
|
|
69
69
|
<%= body %>
|
70
70
|
</table>
|
71
71
|
<hr/>
|
72
|
-
<a href="
|
73
|
-
><img src="
|
74
|
-
|
75
|
-
alt="Get jj_juli at SourceForge.net. Fast, secure and Free Open Source software downloads"
|
76
|
-
/></a> | Generated by <a href='http://jjjuli.sourceforge.net/'>juli <%= Juli::VERSION %></a>
|
72
|
+
<a href="https://github.com/fuminori-ido/juli"
|
73
|
+
><img height="32" width="32" src="https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/github.svg"
|
74
|
+
/></a> Generated by <a href='https://github.com/fuminori-ido/juli'>juli <%= Juli::VERSION %></a>
|
77
75
|
</body>
|
78
76
|
</html>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<html>
|
2
2
|
<%#
|
3
|
-
This template is only for juli project's
|
3
|
+
This template is only for juli project's document.
|
4
4
|
%>
|
5
5
|
<!--
|
6
6
|
|
@@ -69,10 +69,8 @@ sitemap.html:: sitemap template (alphabetical order)
|
|
69
69
|
<%= body %>
|
70
70
|
</table>
|
71
71
|
<hr/>
|
72
|
-
<a href="
|
73
|
-
><img src="
|
74
|
-
|
75
|
-
alt="Get jj_juli at SourceForge.net. Fast, secure and Free Open Source software downloads"
|
76
|
-
/></a> | Generated by <a href='http://jjjuli.sourceforge.net/'>juli <%= Juli::VERSION %></a>
|
72
|
+
<a href="https://github.com/fuminori-ido/juli"
|
73
|
+
><img height="32" width="32" src="https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/github.svg"
|
74
|
+
/></a> Generated by <a href='https://github.com/fuminori-ido/juli'>juli <%= Juli::VERSION %></a>
|
77
75
|
</body>
|
78
76
|
</html>
|
@@ -103,11 +103,9 @@ so that please do not delete them.
|
|
103
103
|
<table width='100%'>
|
104
104
|
<tr>
|
105
105
|
<td>
|
106
|
-
<a href="
|
107
|
-
|
108
|
-
|
109
|
-
alt="Get jj_juli at SourceForge.net. Fast, secure and Free Open Source software downloads"
|
110
|
-
/></a> | Generated by <a href='http://jjjuli.sourceforge.net/'>juli <%= Juli::VERSION %></a>
|
106
|
+
<a href="https://github.com/fuminori-ido/juli"
|
107
|
+
><img height="32" width="32" src="https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/github.svg"
|
108
|
+
/></a> Generated by <a href='https://github.com/fuminori-ido/juli'>juli <%= Juli::VERSION %></a>
|
111
109
|
</td>
|
112
110
|
<td align=right>
|
113
111
|
slide <span id=curr_page></span>/<span id=total_page></span>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
2
2
|
<html>
|
3
3
|
<%#
|
4
|
-
This template is only for juli project's
|
4
|
+
This template is only for juli project's document.
|
5
5
|
%>
|
6
6
|
<!--
|
7
7
|
|
@@ -62,10 +62,8 @@ contents:: draw contents of page
|
|
62
62
|
<br/><br/>
|
63
63
|
<%= body %>
|
64
64
|
<hr/>
|
65
|
-
<a href="
|
66
|
-
><img src="
|
67
|
-
|
68
|
-
alt="Get jj_juli at SourceForge.net. Fast, secure and Free Open Source software downloads"
|
69
|
-
/></a> | Generated by <a href='http://jjjuli.sourceforge.net/'>juli <%= Juli::VERSION %></a>
|
65
|
+
<a href="https://github.com/fuminori-ido/juli"
|
66
|
+
><img height="32" width="32" src="https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/github.svg"
|
67
|
+
/></a> Generated by <a href='https://github.com/fuminori-ido/juli'>juli <%= Juli::VERSION %></a>
|
70
68
|
</body>
|
71
69
|
</html>
|
@@ -93,11 +93,9 @@ so that please do not delete them.
|
|
93
93
|
<table width='100%'>
|
94
94
|
<tr>
|
95
95
|
<td>
|
96
|
-
<a href="
|
97
|
-
|
98
|
-
|
99
|
-
alt="Get jj_juli at SourceForge.net. Fast, secure and Free Open Source software downloads"
|
100
|
-
/></a> | Generated by <a href='http://jjjuli.sourceforge.net/'>juli <%= Juli::VERSION %></a>
|
96
|
+
<a href="https://github.com/fuminori-ido/juli"
|
97
|
+
><img height="32" width="32" src="https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/github.svg"
|
98
|
+
/></a> Generated by <a href='https://github.com/fuminori-ido/juli'>juli <%= Juli::VERSION %></a>
|
101
99
|
</td>
|
102
100
|
<td align=right>
|
103
101
|
slide <span id=curr_page></span>/<span id=total_page></span>
|
data/lib/juli/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: juli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ido
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aws-sdk-s3
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: i18n
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +52,20 @@ dependencies:
|
|
38
52
|
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: byebug
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: racc
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +100,14 @@ dependencies:
|
|
72
100
|
requirements:
|
73
101
|
- - "~>"
|
74
102
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
103
|
+
version: '2.0'
|
76
104
|
type: :development
|
77
105
|
prerelease: false
|
78
106
|
version_requirements: !ruby/object:Gem::Requirement
|
79
107
|
requirements:
|
80
108
|
- - "~>"
|
81
109
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
110
|
+
version: '2.0'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: rake
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,9 +136,23 @@ dependencies:
|
|
108
136
|
- - ">="
|
109
137
|
- !ruby/object:Gem::Version
|
110
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: test-unit
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
111
153
|
description: Offline wiki, and outline processor
|
112
154
|
email:
|
113
|
-
-
|
155
|
+
- ido-gh@wtech.jp
|
114
156
|
executables:
|
115
157
|
- juli
|
116
158
|
extensions: []
|
@@ -128,8 +170,8 @@ files:
|
|
128
170
|
- bin/juli_tb.rb
|
129
171
|
- bin/setup
|
130
172
|
- doc/.juli/config
|
173
|
+
- doc/.juli/github.html
|
131
174
|
- doc/.juli/slidy.html
|
132
|
-
- doc/.juli/sourceforge.html
|
133
175
|
- doc/.juli/takahashi_method.html
|
134
176
|
- doc/README_FOR_API
|
135
177
|
- doc/compare.ods
|
@@ -235,7 +277,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
235
277
|
version: '0'
|
236
278
|
requirements: []
|
237
279
|
rubyforge_project:
|
238
|
-
rubygems_version: 2.
|
280
|
+
rubygems_version: 2.7.6.2
|
239
281
|
signing_key:
|
240
282
|
specification_version: 4
|
241
283
|
summary: Offline wiki, and outline processor
|