polyrex-calendar 0.1.12 → 0.1.13
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/polyrex-calendar.rb +226 -30
- metadata +22 -8
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43046cae49a8bb07a5549b4348acfb3ad8e662f3
|
4
|
+
data.tar.gz: c02d638727efa111ff15a4a0dc96eafa00b23880
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53d5cc3d4c823c2fa18b18c22d8a401e94def4db6fa55b1d9f2f1dac7e01e97f69c85f606941e865d190baaabff380c1ba6a2b3e89f2867e5e123c90de9a24a1
|
7
|
+
data.tar.gz: 26be0a97522f12ed84ec7e4284b7619c1baa1b1d5276bdb694256ef3ca95eafbe58077495e7d051ad009be8b867d411a78a8803456475206f82541e48c1f81d2
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/polyrex-calendar.rb
CHANGED
@@ -5,31 +5,75 @@
|
|
5
5
|
require 'polyrex'
|
6
6
|
require 'date'
|
7
7
|
require 'nokogiri'
|
8
|
+
require 'chronic_duration'
|
9
|
+
|
10
|
+
class Numeric
|
11
|
+
def ordinal
|
12
|
+
( (10...20).include?(self) ? 'th' : %w{ th st nd rd th th th th th th }[self % 10] )
|
13
|
+
end
|
14
|
+
end
|
8
15
|
|
9
16
|
class PolyrexCalendar
|
10
17
|
|
11
18
|
attr_accessor :xsl, :css, :polyrex, :month_xsl, :month_css
|
12
19
|
|
13
|
-
def initialize(year=nil)
|
20
|
+
def initialize(year=nil, options={})
|
21
|
+
|
22
|
+
@id = '1'
|
23
|
+
|
24
|
+
opts = {calendar_xsl: lib + '/calendar.xsl'
|
25
|
+
}.merge(options)
|
14
26
|
@year = year ? year.to_s : Time.now.year.to_s
|
15
27
|
generate_calendar
|
16
28
|
lib = File.dirname(__FILE__)
|
17
|
-
@xsl = File.open(lib + '/calendar.xsl','r').read
|
18
|
-
@css = File.open(lib + '/layout.css','r').read
|
19
|
-
@month_xsl = File.open(lib + '/month_calendar.xsl','r').read
|
20
|
-
@month_css = File.open(lib + '/month_layout.css','r').read
|
21
29
|
|
22
|
-
|
30
|
+
@xsl = File.read lib + '/calendar.xsl'
|
31
|
+
@css = File.read lib + '/layout.css'
|
32
|
+
|
33
|
+
PolyrexObjects::Month.class_eval do
|
34
|
+
|
35
|
+
def inspect()
|
36
|
+
"#<PolyrexObjects::Month:%s" % __id__
|
37
|
+
end
|
38
|
+
|
23
39
|
def to_webpage()
|
24
40
|
lib = File.dirname(__FILE__)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
41
|
+
|
42
|
+
month_xsl = File.read lib + '/month_calendar.xsl'
|
43
|
+
month_css = File.read lib + '/month_layout.css'
|
44
|
+
|
45
|
+
xslt = Nokogiri::XSLT(month_xsl)
|
46
|
+
html = xslt.transform(Nokogiri::XML(self.to_xml)).to_s
|
29
47
|
{self.name.downcase[0..2] + '_calendar.html' => html, 'month_layout.css' => month_css}
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
def wk(n)
|
52
|
+
self.records[n-1]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
PolyrexObjects::Week.class_eval do
|
57
|
+
|
58
|
+
def inspect()
|
59
|
+
"#<PolyrexObjects::Week:%s" % __id__
|
30
60
|
end
|
31
|
-
|
61
|
+
|
62
|
+
def to_webpage()
|
63
|
+
lib = File.dirname(__FILE__)
|
64
|
+
|
65
|
+
week_xsl = File.read lib + '/week_calendar.xsl'
|
66
|
+
week_layout_css = File.read lib + '/week_layout.css'
|
67
|
+
week_css = File.read lib + '/week.css'
|
32
68
|
|
69
|
+
xslt = Nokogiri::XSLT(week_xsl)
|
70
|
+
html = xslt.transform(Nokogiri::XML(self.to_xml)).to_s
|
71
|
+
{'week' + self.no + '_planner.html' => html, 'week_layout.css' => week_layout_css, \
|
72
|
+
'week.css' => week_css}
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
33
77
|
end
|
34
78
|
|
35
79
|
def to_a()
|
@@ -40,18 +84,23 @@ class PolyrexCalendar
|
|
40
84
|
@polyrex.to_xml pretty: true
|
41
85
|
end
|
42
86
|
|
43
|
-
def to_webpage()
|
87
|
+
def to_webpage()
|
88
|
+
#html = Rexslt.new(@xsl, @polyrex.to_xml).to_xml
|
44
89
|
html = generate_webpage(@polyrex.to_xml, @xsl)
|
45
90
|
{'calendar.html' => html, 'layout.css' => @css}
|
46
91
|
end
|
47
92
|
|
48
|
-
def import_events(
|
49
|
-
|
50
|
-
|
51
|
-
@polyrex.records[m].week[w].day[i].event = event[:title]
|
52
|
-
end
|
93
|
+
def import_events(objx)
|
94
|
+
@id = @polyrex.id_counter
|
95
|
+
method('import_'.+(objx.class.to_s.downcase).to_sym).call(objx)
|
53
96
|
self
|
54
97
|
end
|
98
|
+
|
99
|
+
alias import! import_events
|
100
|
+
|
101
|
+
def inspect()
|
102
|
+
%Q(=> #<PolyrexCalendar:#{self.object_id} @id="#{@id}", @year="#{@year}">)
|
103
|
+
end
|
55
104
|
|
56
105
|
def month(m)
|
57
106
|
@polyrex.records[m-1]
|
@@ -60,8 +109,105 @@ class PolyrexCalendar
|
|
60
109
|
def months
|
61
110
|
@polyrex.records
|
62
111
|
end
|
112
|
+
|
113
|
+
def parse_events(list)
|
114
|
+
|
115
|
+
polyrex = Polyrex.new('events/dayx[date, title]/entryx[start_time, end_time,' + \
|
116
|
+
' duration, title]')
|
117
|
+
|
118
|
+
polyrex.format_masks[1] = '([!start_time] \([!duration]\) [!title]|' + \
|
119
|
+
'[!start_time]-[!end_time] [!title]|' + \
|
120
|
+
'[!start_time] [!title])'
|
121
|
+
|
122
|
+
polyrex.parse(list)
|
123
|
+
|
124
|
+
self.import_events polyrex
|
125
|
+
end
|
126
|
+
|
127
|
+
def this_week()
|
128
|
+
m = DateTime.now.month
|
129
|
+
self.month(m).records.find do |week|
|
130
|
+
now = DateTime.now
|
131
|
+
week_no = now.cwday < 7 ? now.cweek - 1: now.cweek
|
132
|
+
week.no == week_no.to_s
|
133
|
+
end
|
134
|
+
end
|
63
135
|
|
136
|
+
def this_month()
|
137
|
+
self.month(DateTime.now.month)
|
138
|
+
end
|
139
|
+
|
64
140
|
private
|
141
|
+
|
142
|
+
def import_dynarex(dynarex)
|
143
|
+
dynarex.flat_records.each do |event|
|
144
|
+
m,w,i = @day[Date.parse(event[:date])]
|
145
|
+
@polyrex.records[m].week[w].day[i].event = event[:title]
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def import_polyrex(polyrex)
|
150
|
+
|
151
|
+
polyrex.records.each do |day|
|
152
|
+
|
153
|
+
d1 = Date.parse(day.date)
|
154
|
+
sd = d1.strftime("%Y-%b-%d ")
|
155
|
+
m,w,i = @day[d1]
|
156
|
+
|
157
|
+
cal_day = @polyrex.records[m].week[w].day[i]
|
158
|
+
|
159
|
+
cal_day.event = day.title
|
160
|
+
|
161
|
+
if day.records.length > 0 then
|
162
|
+
|
163
|
+
raw_entries = day.records
|
164
|
+
|
165
|
+
entries = raw_entries.inject({}) do |r,entry|
|
166
|
+
|
167
|
+
start_time = entry.start_time
|
168
|
+
|
169
|
+
if entry.end_time then
|
170
|
+
end_time = entry.end_time
|
171
|
+
duration = ChronicDuration.output(Time.parse(sd + end_time) \
|
172
|
+
- Time.parse(sd + start_time))
|
173
|
+
else
|
174
|
+
|
175
|
+
if entry.duration then
|
176
|
+
duration = entry.duration
|
177
|
+
else
|
178
|
+
duration = '10 mins'
|
179
|
+
end
|
180
|
+
|
181
|
+
end_time = (Time.parse(sd + start_time) + ChronicDuration.parse(duration))\
|
182
|
+
.strftime("%H:%M")
|
183
|
+
end
|
184
|
+
|
185
|
+
r.merge!(start_time => {time_start: start_time, time_end: end_time, \
|
186
|
+
duration: duration, title: entry.title})
|
187
|
+
|
188
|
+
end
|
189
|
+
|
190
|
+
seconds = entries.keys.map{|x| Time.parse(x) - Time.parse('08:00')}
|
191
|
+
|
192
|
+
unless d1.saturday? or d1.sunday? then
|
193
|
+
rows = slotted_sort(seconds).map do |x|
|
194
|
+
(Time.parse('08:00') + x.to_i).strftime("%H:%M") if x
|
195
|
+
end
|
196
|
+
else
|
197
|
+
rows = entries.keys
|
198
|
+
end
|
199
|
+
|
200
|
+
rows.each do |row|
|
201
|
+
create = cal_day.create
|
202
|
+
create.id = @id
|
203
|
+
create.entry entries[row] || {}
|
204
|
+
end
|
205
|
+
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
end
|
210
|
+
|
65
211
|
|
66
212
|
def generate_calendar()
|
67
213
|
|
@@ -90,8 +236,10 @@ class PolyrexCalendar
|
|
90
236
|
end
|
91
237
|
|
92
238
|
@a = months
|
93
|
-
|
94
|
-
|
239
|
+
schema = 'calendar[year]/month[no,name,year]/week[no, rel_no, mon, label]/' + \
|
240
|
+
'day[wday, xday, name, event, date, ordinal, overlap]/' + \
|
241
|
+
'entry[time_start, time_end, duration, title]'
|
242
|
+
@polyrex = Polyrex.new(schema, id_counter: @id)
|
95
243
|
year_start = months[0][0][-1]
|
96
244
|
@polyrex.summary.year = @year
|
97
245
|
old_year_week = (year_start - 7).cweek
|
@@ -99,24 +247,46 @@ class PolyrexCalendar
|
|
99
247
|
week_i = 0
|
100
248
|
|
101
249
|
months.each_with_index do |month,i|
|
102
|
-
|
103
|
-
@polyrex.create.month no: (i+1).to_s, name:
|
250
|
+
month_name = Date::MONTHNAMES[i+1]
|
251
|
+
@polyrex.create.month no: (i+1).to_s, name: month_name, year: @year do |create|
|
104
252
|
month.each_with_index do |week,j|
|
105
253
|
|
106
254
|
week_s = (week_i == 0 ? old_year_week : week_i).to_s
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
255
|
+
|
256
|
+
if week[0].nil? then
|
257
|
+
label = Date::MONTHNAMES[(i > 0 ? i : 12)] + " - " + month_name
|
258
|
+
end
|
259
|
+
|
260
|
+
if week[-1].nil? then
|
261
|
+
label = month_name + " - " + Date::MONTHNAMES[(i+2 <= 12 ? i+2 : 1)]
|
262
|
+
end
|
263
|
+
|
264
|
+
week_record = {
|
265
|
+
rel_no: (j+1).to_s,
|
266
|
+
no: week_s,
|
267
|
+
mon: month_name,
|
268
|
+
label: label
|
269
|
+
}
|
270
|
+
|
271
|
+
create.week week_record do |create|
|
272
|
+
week.each_with_index do |day, k|
|
273
|
+
|
274
|
+
# if it's a day in the month then ...
|
275
|
+
if day then
|
276
|
+
x = day
|
111
277
|
week_i += 1 if x.wday == 6
|
112
|
-
h = {wday: x.wday.to_s, xday: x.day.to_s,
|
113
|
-
date: x.strftime("%Y-%b-%d")
|
278
|
+
h = {wday: x.wday.to_s, xday: x.day.to_s, \
|
279
|
+
name: Date::DAYNAMES[k], date: x.strftime("%Y-%b-%d"), \
|
280
|
+
ordinal: x.day.to_i.ordinal}
|
114
281
|
else
|
115
282
|
#if blank find the nearest date in the week and calculate this date
|
116
283
|
# check right and if nothing then it's at the end of the month
|
117
284
|
x = week[-1] ? (week[-1] - (7-(k+1))) : week[0] + k
|
118
|
-
h = {wday: x.wday.to_s, xday: x.day.to_s,
|
285
|
+
h = {wday: x.wday.to_s, xday: x.day.to_s, \
|
286
|
+
name: Date::DAYNAMES[k], date: x.strftime("%Y-%b-%d"), \
|
287
|
+
ordinal: x.day.to_i.ordinal, overlap: 'true'}
|
119
288
|
end
|
289
|
+
|
120
290
|
create.day(h)
|
121
291
|
end
|
122
292
|
end
|
@@ -125,7 +295,32 @@ class PolyrexCalendar
|
|
125
295
|
end
|
126
296
|
|
127
297
|
end
|
298
|
+
|
299
|
+
def slotted_sort(a)
|
300
|
+
|
301
|
+
upper = 36000 # upper slot value
|
302
|
+
slot_width = 9000 # 2.5 hours
|
303
|
+
max_slots = 3
|
304
|
+
|
305
|
+
b = a.reverse.inject([]) do |r,x|
|
128
306
|
|
307
|
+
upper ||= 10; i ||= 0
|
308
|
+
diff = upper - x
|
309
|
+
|
310
|
+
if diff >= slot_width and (i + a.length) < max_slots then
|
311
|
+
r << nil
|
312
|
+
i += 1
|
313
|
+
upper -= slot_width
|
314
|
+
redo
|
315
|
+
else
|
316
|
+
upper -= slot_width if x <= upper
|
317
|
+
r << x
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
a = b.+([nil] * max_slots).take(max_slots).reverse
|
322
|
+
end
|
323
|
+
|
129
324
|
def generate_webpage(xml, xsl)
|
130
325
|
|
131
326
|
# transform the xml to html
|
@@ -134,5 +329,6 @@ class PolyrexCalendar
|
|
134
329
|
html = xslt.transform(doc).to_xml
|
135
330
|
html
|
136
331
|
|
137
|
-
end
|
138
|
-
|
332
|
+
end
|
333
|
+
|
334
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: polyrex-calendar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -29,34 +29,48 @@ cert_chain:
|
|
29
29
|
CIpMEIXEnQwmcmWL07xvpUquKTab0tCXtmcfjr74KP2KCm5guZyxeXaj9lD1OrnC
|
30
30
|
Kgt/mRI2beG8K7QY81GGMsQjiG95Dcko
|
31
31
|
-----END CERTIFICATE-----
|
32
|
-
date: 2013-
|
32
|
+
date: 2013-12-16 00:00:00.000000000 Z
|
33
33
|
dependencies:
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: polyrex
|
36
36
|
requirement: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
type: :runtime
|
42
42
|
prerelease: false
|
43
43
|
version_requirements: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: nokogiri
|
50
50
|
requirement: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
57
|
version_requirements: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: chronic_duration
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
type: :runtime
|
70
|
+
prerelease: false
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: '0'
|
62
76
|
description:
|
@@ -82,12 +96,12 @@ require_paths:
|
|
82
96
|
- lib
|
83
97
|
required_ruby_version: !ruby/object:Gem::Requirement
|
84
98
|
requirements:
|
85
|
-
- -
|
99
|
+
- - ">="
|
86
100
|
- !ruby/object:Gem::Version
|
87
101
|
version: '0'
|
88
102
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
103
|
requirements:
|
90
|
-
- -
|
104
|
+
- - ">="
|
91
105
|
- !ruby/object:Gem::Version
|
92
106
|
version: '0'
|
93
107
|
requirements: []
|
metadata.gz.sig
CHANGED
Binary file
|