mhc 1.0.3 → 1.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c96c8be0a9d697380b98effb30cb85bf489af611
4
- data.tar.gz: 76549b9fb166f1d034923456901740a25126efef
3
+ metadata.gz: b1c058aa0f117bd28b047082f0bffb7829a65336
4
+ data.tar.gz: 33e55550fee0eab49840f679b57f703803bc9ac7
5
5
  SHA512:
6
- metadata.gz: 4e913eca6be7cf2b0a69515ab986767293a4283053410111d6fb2128b1b2dbe1c14a43f106fff29611dc67c6c24673003684f136f06a13209916926ecf3d0ef0
7
- data.tar.gz: b07087fce50e126f637a5b3942b0e6cadc1b7d4b5111d111d251f29c88e52bf6f05bafb3606f52cbc3492023afb66d28a6fc3aac190d2d6b24915d235015dace
6
+ metadata.gz: 59543a84b06f8f386b7f3bd33ad4ba8116479308d69a2079d1a8c30dc03a38a5433119117852168b746e364ccbec43576cb9ac3b15fc11532ce5ea5bc5389097
7
+ data.tar.gz: 2ba5edb349ac06b2e5cc31891c37fe2bde122db6918c0bfec4d9589f1c4c7ccd667adcdb5f99a678a135e5ae2815d0c90164f5fe6aac0da984cf776ab1b3dfa5
data/README.org CHANGED
@@ -23,9 +23,12 @@
23
23
  # #+LATEX_HEADER: \pagestyle{empty}
24
24
  # #+LaTeX: \thispagestyle{empty}
25
25
 
26
+ [[file:https://badge.fury.io/rb/mhc.svg]]
27
+ [[http://melpa.org/#/mhc][file:http://melpa.org/packages/mhc-badge.svg]]
28
+
26
29
  * DESCRIPTION
27
- MHC is designed to help those who receive most appointments via email.
28
- Using MHC, you can easily import schedule articles from emails.
30
+ MHC is a simple and powerful calendar tool, which consists of
31
+ a CLI tool written in Ruby (mhc) and a nifty Emacs frontend UI (mhc.el).
29
32
 
30
33
  You can get the latest version from:
31
34
  + https://github.com/yoshinari-nomura/mhc
@@ -33,24 +36,212 @@
33
36
 
34
37
  MHC has following features:
35
38
 
36
- + Easy import your schedule from existing buffers.
37
- For example, using with Mew/Gnus/Wanderlust (MUAs on Emacs),
38
- you can easily compose your schedule items from
39
- appoint-emails. MHC will guess the title,
40
- date, time and description by scanning the email.
41
- + Simple data structure allows you to manipulate stored data in many ways.
42
- + Appointments can be made to repeat in flexible ways.
43
- + powerful but simple expression of appointments.
39
+ + Easy import from existing Emacs buffers
40
+ + MHC will guess the title, date, time and description from the content of buffer.
41
+
42
+ + Simple plain-text data format
43
+ + MHC stores articles in similar format to MH (email); you can manipulate them
44
+ by many other text-manipulation tools, editors, UNIX command-line tools or your own scripts.
45
+
46
+ + Flexible output format
47
+ + Currently plain-text, iCalendar, S-formula (mhc.el, calfw), org-table, howm, JSON: ([[http://fullcalendar.io/][full-calendar]]) are supported.
44
48
 
45
- MHC stores schedule articles in the same form of MH; you can manipulate
46
- these messages not only by above tools but also by many other MUAs,
47
- editors, UNIX commandline tools or your own scripts.
49
+ + Selective export to Google Calendar with flexible filters and modifiers.
50
+ + MHC can export custom-filtered calendars to Google Calendar via CalDaV.
51
+ Check [[https://github.com/yoshinari-nomura/mhc/blob/master/samples/DOT.mhc-config.yml][mhc-config.yml]] for details.
48
52
 
49
53
  * SYSTEM REQUIREMENTS
50
54
  + Ruby 2.1 or newer
51
55
  + Emacs 24 or newer
52
56
 
53
- * Information for Developers
57
+ * INSTALL AND SETUP
58
+ ** Ruby CLI (mhc)
59
+ mhc CLI command can be installed from rubygems.org.
60
+ #+BEGIN_SRC shell-script
61
+ $ gem install mhc
62
+ #+END_SRC
63
+
64
+ Or, if you want to install mhc in a sandbox (recommended),
65
+ Bunlder would help you:
66
+ #+BEGIN_SRC shell-script
67
+ $ gem install bundler
68
+ $ mkdir /path/to/install/mhc
69
+ $ cd /path/to/install/mhc
70
+ $ bundle init
71
+ $ echo 'gem "mhc"' >> Gemfile
72
+ $ bundle install --path=vendor/bundle --binstubs=bin
73
+ $ export PATH=/path/to/install/mhc/bin:$PATH
74
+ #+END_SRC
75
+
76
+ Then, initialize config file and spool directory:
77
+ #+BEGIN_SRC shell-script
78
+ $ mhc init ~/mhc
79
+
80
+ # Read comments in config.yml carefully
81
+ $ vi ~/.config/mhc/config.yml
82
+
83
+ # Add Japanese Holidays if needed.
84
+ $ cp samples/japanese-holidays.mhcc ~/mhc/presets/
85
+ #+END_SRC
86
+
87
+ Check if mhc is working correctly:
88
+ #+BEGIN_SRC shell-script
89
+ $ mhc scan thismonth
90
+ #+END_SRC
91
+
92
+ ** Emacs UI (mhc.el)
93
+ *You have to install Ruby CLI before install mhc.el*
94
+
95
+ MHC is now available on [[http://melpa.org/][MELPA]]. If you set up packaging system correctly,
96
+ You can install mhc with package.el (=M-x= =package-install= =mhc=).
97
+ Check [[https://github.com/milkypostman/melpa#usage][MELPA usage]] for details.
98
+
99
+ And then, =M-x mhc= will show up the monthly calendar.
100
+
101
+ * USAGE
102
+ ** Ruby CLI (mhc)
103
+ : mhc help
104
+
105
+ ** Emacs UI (mhc.el)
106
+ *** Keybind
107
+ 1) Jump and Show
108
+
109
+ =n/p=, =h/j/k/l= would work as expected.
110
+
111
+ | Key | Function |
112
+ |-----------------+----------------------------|
113
+ | =<= | Show previous month |
114
+ | =P= | Show previous year |
115
+ | =>= | Show next month |
116
+ | =N= | Show next year |
117
+ | =g= | Go to specific month |
118
+ | =v= | Toggle message window |
119
+ | =RET/SPC/./DEL= | Show/scroll message buffer |
120
+ | =/= | Search by keyword |
121
+
122
+ 2) Manipulate articles
123
+
124
+ | Key | Function |
125
+ |-----+------------------------------------------------|
126
+ | =E= | Create a new article draft interactively |
127
+ | =M= | Open pointed article to edit |
128
+ | =D= | Delete pointed article |
129
+ | =C= | Copy article temporally as a reusable template |
130
+ | =Y= | Same as =E= but use the template stored by =C= |
131
+
132
+ 3) Draft Buffer
133
+
134
+ | Key | Function |
135
+ |----------+----------------------------------------|
136
+ | =C-cC-c= | Finish editing and register to DB |
137
+ | =C-cC-q= | Discard editing buffer w/o touching DB |
138
+
139
+ * Article format
140
+ ** Example
141
+ MHC stores every article in the form of RFC822-like format.
142
+ Once you open a new article draft in Emacs by typing =E=,
143
+ You may feel the draft is very similar to email's one.
144
+ This is an example of MHC article:
145
+ #+BEGIN_EXAMPLE
146
+ X-SC-Subject: Home party
147
+ X-SC-Location: my second house
148
+ X-SC-Day: 20150715
149
+ X-SC-Time: 18:00-21:00
150
+ X-SC-Category: Private Party
151
+ X-SC-Cond:
152
+ X-SC-Duration:
153
+ X-SC-Record-Id: C34D89F5-27FA-4243-AC6C-168D8D243D9A
154
+ X-SC-Sequence: 0
155
+
156
+ This is a sample schedule article about a home party scheduled on
157
+ 20150715 18:00-21:00. MHC schedule articles are similar to RFC822
158
+ style message like this. In the header part, you can place any extra
159
+ headers you want. if you import an article from existing email, you
160
+ may want to insert the original email headers such as Subject,
161
+ From, Date.
162
+ #+END_EXAMPLE
163
+
164
+ ** Time related headers
165
+ MHC has four types of headers to specify time/date-range or recurring conditions:
166
+ + =X-SC-Day=
167
+ + =X-SC-Time=
168
+ + =X-SC-Cond=
169
+ + =X-SC-Duration=
170
+
171
+ *** X-SC-Day
172
+ =X-SC-Day:= specifies an enumeration of occurrence dates separated by white space:
173
+ #+BEGIN_EXAMPLE
174
+ X-SC-Day: 20150704 ... all-day event
175
+ X-SC-Day: 20150704-20150705 ... two-days long single event
176
+ X-SC-Day: 20150704 20150705 ... two all-day events
177
+ #+END_EXAMPLE
178
+
179
+ If =X-SC-Time:= is specified with =X-SC-Day:=,
180
+ =X-SC-Time:= acts on all enumerated dates in =X-SC-Day:=.
181
+ So, you cannot set multiple-days value (=20150704-20150705=) with =X-SC-Time:=.
182
+ You can also put =!= prefix to specify the exception days (See below about =X-SC-Cond:=)
183
+
184
+ *** X-SC-Time
185
+ =X-SC-Time:= specifies a time range in a day or a point of time like:
186
+ #+BEGIN_EXAMPLE
187
+ X-SC-Time: 10:00-12:00
188
+ X-SC-Time: 10:00
189
+ #+END_EXAMPLE
190
+ You can leave it blank for all-day events.
191
+
192
+ With the combination of =X-SC-Day:=, you can specify some particular
193
+ time-range of a day. Currently, you cannot specify a time-range
194
+ across the multiple days.
195
+
196
+ *** X-SC-Cond
197
+ =X-SC-Cond:= defines a rule of recurrence; weekly, monthly or yearly.
198
+ You can place these keywords in =X-SC-Cond:= separating by white spaces:
199
+ | Keyword | Purpose |
200
+ |----------------------------+-----------------------|
201
+ | =01/02/.../31= | Day of month |
202
+ | =1st/2nd/3rd/4th/5th/Last= | Week order in a month |
203
+ | =Sun/Mon/.../Sat= | Day of week |
204
+ | =Jan/Feb/.../Dec= | Name of month |
205
+
206
+ Example:
207
+ #+BEGIN_EXAMPLE
208
+ X-SC-Cond: Fri ... Every Friday
209
+ X-SC-Cond: Tue Fri ... Every Tueday and Friday
210
+ X-SC-Cond: 31 Aug ... August 31st every year
211
+ X-SC-Cond: 1 ... First day on every month
212
+ X-SC-Cond: 1st 3rd Fri ... First and Third Friday every month
213
+ X-SC-Cond: Fri 13 ... 13th on every month or every Friday (not Friday 13th)
214
+ #+END_EXAMPLE
215
+
216
+ Sometimes you may want to set a particular date as exception.
217
+ In such case, you can exclude a date by placing =!YYYYMMDD=
218
+ in =X-SC-Day:=. For example:
219
+ #+BEGIN_EXAMPLE
220
+ X-SC-Day: !20150715 20150716
221
+ X-SC-Cond: Wed
222
+ X-SC-Duration: 20150701-20150731
223
+
224
+ This article occurs every Wednesday in July 2015 with the exception
225
+ of 2015-07-15 (Wed) and inclusion of 2015-07-16 (Thu).
226
+ #+END_EXAMPLE
227
+
228
+ *** X-SC-Duration
229
+ =X-SC-Duration:= acts on =X-SC-Cond:= to bounds the recurrence rule
230
+ in an inclusive manner.
231
+ Note that, =X-SC-Duration:= itself does not define any concrete occurrences and
232
+ does not act on =X-SC-Day:=.
233
+
234
+ Example:
235
+ #+BEGIN_EXAMPLE
236
+ X-SC-Day: !20150715 20150801
237
+ X-SC-Cond: Wed
238
+ X-SC-Duration: 20150701-20150731
239
+
240
+ Every Wednesday in July 2015 with the exception
241
+ of 2015-07-15 (Wed) and inclusion of 2015-08-01 (Sat).
242
+ #+END_EXAMPLE
243
+
244
+ * INFORMATION FOR DEVELOPERS
54
245
  ** INSTALL for developers:
55
246
  1) Install rbenv + ruby-build
56
247
  (see https://github.com/sstephenson/rbenv#basic-github-checkout for details)
@@ -186,7 +377,7 @@
186
377
  + sync_channels/* :: Sync records of MHC DB.
187
378
  If you remove any files under this directory,
188
379
  MHC Sync will be DAMAGED.
189
- * How to convert from the old MHC spool
380
+ * HOW TO CONVERT FROM THE OLD MHC SPOOL
190
381
  [[https://gist.github.com/yoshinari-nomura/bb9a197e0e01ad81c883][update-uuid.sh]] would help you.
191
382
 
192
383
  New format is:
data/Rakefile CHANGED
@@ -18,11 +18,14 @@ task :build => :check_version
18
18
  # Emacs stuffs must have the same version numbers
19
19
  # with Mhc::VERSION.
20
20
  task :check_version do
21
- for file in %w(mhc-vars.el Cask)
21
+ for file in %w(mhc.el mhc-vars.el Cask)
22
22
  path = File.expand_path("../emacs/#{file}", __FILE__)
23
23
  raise "File not found #{path}" unless File.exists?(path)
24
24
 
25
- if /(\d+\.\d+\.\d+).*MHC_VERSION/ !~ File.open(path).read || Mhc::VERSION != $1
25
+ content = File.open(path).read
26
+ unless (/^;; Version: (\d+\.\d+\.\d+)$/ =~ content ||
27
+ /(\d+\.\d+\.\d+).*MHC_VERSION$/ =~ content) &&
28
+ Mhc::VERSION == $1
26
29
  raise "#{path} does not have valid version number (#{$1})."
27
30
  end
28
31
  end
data/emacs/Cask CHANGED
@@ -5,7 +5,7 @@
5
5
  (source org)
6
6
  (source melpa)
7
7
 
8
- (package "mhc" "1.0.3" "Message Harmonized Calendaring system") ;; MHC_VERSION
8
+ (package "mhc" "1.0.4" "Message Harmonized Calendaring system") ;; MHC_VERSION
9
9
 
10
10
  (files "mhc.el" "mhc-*.el")
11
11
 
@@ -12,6 +12,7 @@
12
12
  ;;; Configration Variables:
13
13
 
14
14
  (require 'mhc-date)
15
+ (require 'mhc-misc)
15
16
  (require 'mhc-day)
16
17
  (require 'mhc-schedule)
17
18
  (require 'mhc-vars)
@@ -635,7 +636,7 @@ The keys that are defined for mhc-calendar-mode are:
635
636
  (defun mhc-calendar (&optional date)
636
637
  "Display 3-month mini calendar."
637
638
  (interactive)
638
- (setq date (or date (mhc-current-date) (mhc-calendar-get-date)))
639
+ (setq date (or date (mhc-summary-current-date) (mhc-calendar-get-date)))
639
640
  (when (and (get-buffer mhc-calendar/buffer) (set-buffer mhc-calendar/buffer))
640
641
  (setq date (or date mhc-calendar-view-date))
641
642
  (unless (mhc-date-yymm= date mhc-calendar-date)
@@ -1530,8 +1531,8 @@ The keys that are defined for mhc-calendar-mode are:
1530
1531
  mhc-calendar/hnf-ignore-categories))
1531
1532
  (setq lst (cdr lst))))
1532
1533
  (with-temp-buffer
1533
- (insert-file-contents-as-coding-system
1534
- mhc-default-coding-system mhcfile)
1534
+ (mhc-insert-file-contents-as-coding-system
1535
+ mhc-default-coding-system mhcfile)
1535
1536
  (mhc-header-decode-ewords)
1536
1537
  (mhc-header-narrowing
1537
1538
  (setq cats (mhc-header-get-value "x-sc-category"))
@@ -113,8 +113,8 @@
113
113
  (if schedule
114
114
  (cfw:details-popup
115
115
  (with-temp-buffer
116
- (insert-file-contents-as-coding-system
117
- mhc-default-coding-system
116
+ (mhc-insert-file-contents-as-coding-system
117
+ mhc-default-coding-system
118
118
  (mhc-record-name (mhc-schedule-record schedule)))
119
119
  (mhc-calendar/view-file-decode-header)
120
120
  (buffer-string)
@@ -89,6 +89,13 @@
89
89
  (defmacro mhc-time-to-string (time)
90
90
  `(mhc-time-let ,time (format "%02d:%02d" hh mm)))
91
91
 
92
+ (defun mhc-time-range-to-string (time-range)
93
+ (let ((time1 (nth 0 time-range))
94
+ (time2 (nth 1 time-range)))
95
+ (concat
96
+ (if time1 (mhc-time-to-string time1))
97
+ (if time2 (concat "-" (mhc-time-to-string time2))))))
98
+
92
99
  (defsubst mhc-time-to-list (time)
93
100
  (list (mhc-time-HH time)
94
101
  (mhc-time-MM time)))
@@ -32,7 +32,7 @@
32
32
 
33
33
  (defun mhc-db-search (&rest query)
34
34
  (let ((b (mhc-date-new 1970 1 1))
35
- (e (mhc-date-yy++ (mhc-date-now))))
35
+ (e (mhc-date-yy+ (mhc-date-now) 10)))
36
36
  (mhc-db-scan b e nil nil (mhc-db/query-to-search-string query))))
37
37
 
38
38
  (defun mhc-db/quote-string (string)
@@ -42,7 +42,7 @@
42
42
  (format "%s" keyword))
43
43
 
44
44
  (defun mhc-db/query-to-search-string (query)
45
- (let ((keywords '(:subject :body :category)) string)
45
+ (let ((keywords '(:subject :body :category :recurrence_tag)) string)
46
46
  (mapconcat 'identity
47
47
  (delq nil
48
48
  (mapcar
@@ -68,8 +68,6 @@ these fields are set to the draft after import TEMPLATE."
68
68
  (mhc-draft-setup-new)
69
69
  (mhc-draft-delete-garbage-headers)
70
70
  (mhc-draft-setup-headers preset-fields)
71
- ;; remove end of message marker
72
- (mhc-draft-remove-tailers)
73
71
  (mhc-draft-mode)
74
72
  (switch-to-buffer draft-buffer t)
75
73
  (goto-char (point-min)))))
@@ -30,6 +30,23 @@
30
30
 
31
31
  (defvar mhc-message-end-of-messge-marker "[End of message]")
32
32
 
33
+ (defun mhc-message/remove-overlay (overlay-property)
34
+ "Remove OVERLAY-PROPERTY from current buffer."
35
+ (dolist (ovl (overlays-in (point-max) (point-max)))
36
+ (if (overlay-get ovl overlay-property)
37
+ (delete-overlay ovl))))
38
+
39
+ (defun mhc-message/insert-end-mark ()
40
+ "Insert end of message mark."
41
+ (let ((end-mark (make-overlay (point-max) (point-max) nil t t))
42
+ (end-text mhc-message-end-of-messge-marker))
43
+ ;; Delete any previous markers.
44
+ (mhc-message/remove-overlay 'mhc-eom-overlay)
45
+ ;; Add a new marker.
46
+ (mhc-face-put end-text 'mhc-message-face-eof-marker)
47
+ (overlay-put end-mark 'mhc-eom-overlay t)
48
+ (overlay-put end-mark 'after-string end-text)))
49
+
33
50
  (define-derived-mode mhc-message-mode
34
51
  text-mode
35
52
  "MHC-Msg"
@@ -37,12 +54,8 @@
37
54
  (save-excursion
38
55
  (mhc-header-decode-ewords)
39
56
  (goto-char (point-max))
40
- (unless (re-search-backward
41
- (regexp-quote mhc-message-end-of-messge-marker)
42
- (- (point) (length mhc-message-end-of-messge-marker))
43
- t)
44
- (unless (bolp) (insert "\n"))
45
- (insert mhc-message-end-of-messge-marker))
57
+ (unless (bolp) (insert "\n"))
58
+ (mhc-message/insert-end-mark)
46
59
  (mhc-highlight-message))
47
60
  ;; (setq mhc-message-mode-called-count (1+ mhc-message-mode-called-count))
48
61
  ;; (message "mhc-message-mode-called-count: %d" mhc-message-mode-called-count)
@@ -212,6 +212,26 @@
212
212
  (sit-for 0)
213
213
  pass))))
214
214
 
215
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
216
+ ;; Window stack
217
+
218
+ (defvar mhc-misc-window-stack nil)
219
+
220
+ (defun mhc-misc-window-push ()
221
+ (interactive)
222
+ (setq mhc-misc-window-stack
223
+ (cons (current-window-configuration) mhc-misc-window-stack)))
224
+
225
+ (defun mhc-misc-window-pop ()
226
+ (interactive)
227
+ (if mhc-misc-window-stack
228
+ (set-window-configuration (car-safe mhc-misc-window-stack)))
229
+ (setq mhc-misc-window-stack (cdr-safe mhc-misc-window-stack)))
230
+
231
+ (defalias 'mhc-window-push 'mhc-misc-window-push)
232
+ (defalias 'mhc-window-pop 'mhc-misc-window-pop)
233
+
234
+
215
235
  (eval-and-compile
216
236
  (autoload 'rfc2047-decode-string "rfc2047"))
217
237
  (defalias 'mhc-misc-decode-eword-string 'rfc2047-decode-string)
@@ -250,6 +250,13 @@
250
250
  (mhc-parse-buffer (mhc-record-new filename))))
251
251
 
252
252
 
253
+ (defun mhc-parse-string (string)
254
+ "Parse schedules headers in the file, STRING."
255
+ (with-current-buffer
256
+ (mhc-get-buffer-create " *mhc-parse-file*")
257
+ (delete-region (point-min) (point-max))
258
+ (insert string)
259
+ (mhc-parse-buffer)))
253
260
 
254
261
  (provide 'mhc-parse)
255
262
 
@@ -280,8 +280,8 @@ If optional argument FOR-DRAFT is non-nil, Hilight message as draft message."
280
280
  (let ((buffer-read-only nil))
281
281
  (goto-char (point-min))
282
282
  (erase-buffer)
283
- (mhc-insert-file-contents-as-coding-system
284
- mhc-default-coding-system file)
283
+ (mhc-insert-file-contents-as-coding-system
284
+ mhc-default-coding-system file)
285
285
  (mhc-header-narrowing
286
286
  (mhc-header-delete-header
287
287
  "^\\(Content-.*\\|Mime-Version\\|User-Agent\\):" 'regexp))
@@ -559,8 +559,8 @@ If BANNER is set, it is printed on the horizontal line."
559
559
  (defmacro mhc-line-inserter-setup (inserter format alist)
560
560
  `(let (byte-compile-warnings)
561
561
  (setq ,inserter
562
- (byte-compile
563
- (list 'lambda ()
562
+ (byte-compile
563
+ (list 'lambda ()
564
564
  (mhc-line-parse-format ,format ,alist))))
565
565
  (when (get-buffer "*Compile-Log*")
566
566
  (bury-buffer "*Compile-Log*"))
@@ -588,8 +588,8 @@ If BANNER is set, it is printed on the horizontal line."
588
588
  (defun mhc-summary-line-insert ()
589
589
  "Insert summary line."
590
590
  (let ((mhc-tmp-day-face (cond
591
- ((mhc-schedule-in-category-p
592
- mhc-tmp-schedule "holiday")
591
+ ((mhc-day-holiday
592
+ mhc-tmp-dayinfo)
593
593
  'mhc-category-face-holiday)
594
594
  ((eq (mhc-day-day-of-week
595
595
  mhc-tmp-dayinfo) 0)
@@ -622,7 +622,7 @@ If BANNER is set, it is printed on the horizontal line."
622
622
  (define-key mhc-summary-mode-map "P" 'mhc-goto-prev-year)
623
623
 
624
624
  (define-key mhc-summary-mode-map "s" 'mhc-rescan-month)
625
- (define-key mhc-summary-mode-map "d" 'mhc-delete)
625
+ (define-key mhc-summary-mode-map "D" 'mhc-delete)
626
626
  (define-key mhc-summary-mode-map "c" 'mhc-set-default-category)
627
627
  (define-key mhc-summary-mode-map "?" 'mhc-calendar)
628
628
  (define-key mhc-summary-mode-map "t" 'mhc-calendar-toggle-insert-rectangle)
@@ -658,6 +658,32 @@ If BANNER is set, it is printed on the horizontal line."
658
658
  (use-local-map mhc-summary-mode-map)
659
659
  (run-hooks 'mhc-summary-mode-hook))
660
660
 
661
+ (defun mhc-summary-buffer-p (&optional buffer)
662
+ (if buffer
663
+ (set-buffer buffer))
664
+ mhc-summary-buffer-current-date-month)
665
+
666
+ (defun mhc-summary-current-date ()
667
+ (when (mhc-summary-buffer-p)
668
+ (let ((dayinfo (get-text-property (point) 'mhc-dayinfo)))
669
+ (or (and dayinfo (mhc-day-date dayinfo))
670
+ (save-excursion
671
+ (end-of-line)
672
+ (while (and (not (bobp))
673
+ (null dayinfo))
674
+ (or (setq dayinfo (get-text-property (point) 'mhc-dayinfo))
675
+ (forward-char -1)))
676
+ (and dayinfo (mhc-day-date dayinfo)))))))
677
+
678
+ (defvar mhc-summary-buffer-current-date-month nil
679
+ "Indicate summary buffer's month. It is also used by mhc-summary-buffer-p")
680
+ (make-variable-buffer-local 'mhc-summary-buffer-current-date-month)
681
+
682
+ (defun mhc-summary-current-date-month ()
683
+ mhc-summary-buffer-current-date-month)
684
+ (defalias 'mhc-current-date-month 'mhc-summary-current-date-month)
685
+
686
+
661
687
  (defun mhc-summary-display-message ()
662
688
  (interactive)
663
689
  (save-selected-window
@@ -17,7 +17,7 @@
17
17
 
18
18
 
19
19
  ;;; Constants:
20
- (defconst mhc-version "mhc 1.0.3") ;; MHC_VERSION
20
+ (defconst mhc-version "mhc 1.0.4") ;; MHC_VERSION
21
21
 
22
22
 
23
23
  ;;; Configration Variables:
@@ -1,9 +1,12 @@
1
- ;;; mhc.el --- MH Calendar.
1
+ ;;; mhc.el --- Message Harmonized Calendaring system.
2
2
 
3
+ ;; Description: Message Harmonized Calendaring system.
3
4
  ;; Author: Yoshinari Nomura <nom@quickhack.net>
4
- ;;
5
- ;; Created: 1994/07/04
6
- ;; Revised: $Date: 2009/05/31 12:54:50 $
5
+ ;; Created: 1994-07-04
6
+ ;; Version: 1.0.4
7
+ ;; Keywords: calendar
8
+ ;; URL: http://www.quickhack.net/mhc
9
+ ;; Package-Requires: ((calfw "20150703"))
7
10
 
8
11
  ;;;
9
12
  ;;; Commentary:
@@ -487,10 +490,6 @@ If HIDE-PRIVATE, private schedules are suppressed."
487
490
 
488
491
  (defvar mhc-face-week-color-paint-thick nil)
489
492
 
490
- (defvar mhc-summary-buffer-current-date-month nil
491
- "Indicate summary buffer's month. It is also used by mhc-summary-buffer-p")
492
- (make-variable-buffer-local 'mhc-summary-buffer-current-date-month)
493
-
494
493
  (defun mhc-expand-date-scope-backward (date scope)
495
494
  "Expand date scope backward involving the whole first week of month.
496
495
  DATE can be any date of the target month.
@@ -572,6 +571,14 @@ If SUBJECT-ONLY is non-nil, it will search only on X-SC-Subject:"
572
571
  (message "No match")
573
572
  (mhc-scan match))))
574
573
 
574
+ (defun mhc-search-recurrence (recurrence-tag)
575
+ "Search events by RECURRENCE-TAG."
576
+ (interactive "sSearch recurrence-tag: ")
577
+ (let* ((match (mhc-db-search :recurrence_tag recurrence-tag)))
578
+ (if (null match)
579
+ (message "No match")
580
+ (mhc-scan match))))
581
+
575
582
  (defun mhc-scan (events &optional insert-current-buffer clip-from clip-to)
576
583
  "Create mhc-summary buffer using EVENTS list.
577
584
  If INSERT-CURRENT-BUFFER is non-nil, insert contents in the current buffer.
@@ -607,7 +614,7 @@ Returns t if the importation was succeeded."
607
614
  (list (get-buffer (read-buffer "Import buffer: "
608
615
  (current-buffer))))))
609
616
  (let ((draft-buffer (generate-new-buffer mhc-draft-buffer-name))
610
- (current-date (or (mhc-current-date) (mhc-calendar-get-date) (mhc-date-now)))
617
+ (current-date (or (mhc-summary-current-date) (mhc-calendar-get-date) (mhc-date-now)))
611
618
  (succeed t)
612
619
  msgp date time subject location category recurrence-tag priority alarm)
613
620
  (and (called-interactively-p 'interactive)
@@ -632,7 +639,7 @@ Returns t if the importation was succeeded."
632
639
  (condition-case ()
633
640
  (if import-buffer
634
641
  (progn
635
- (delete-other-windows)
642
+ (delete-other-windows-vertically)
636
643
  (goto-char (point-min))
637
644
  (if (y-or-n-p "Do you want to import this article? ")
638
645
  (let* ((original (with-current-buffer
@@ -762,13 +769,7 @@ Returns t if the importation was succeeded."
762
769
  (mhc-date-format day "%04d%02d%02d" yy mm dd))
763
770
  date " ")
764
771
  "\nX-SC-Time: "
765
- (if time
766
- (let ((begin (car time))
767
- (end (nth 1 time)))
768
- (concat
769
- (if begin (mhc-time-to-string begin) "")
770
- (if end (concat "-" (mhc-time-to-string end)) "")))
771
- "")
772
+ (mhc-time-range-to-string time)
772
773
  "\nX-SC-Category: "
773
774
  (mapconcat (function capitalize) category " ")
774
775
  "\nX-SC-Priority: " (if priority
@@ -842,7 +843,7 @@ the default action of this command is changed to the latter."
842
843
  (mhc-record-subject-as-string record)))))
843
844
  (mhc-db-add-exception-rule
844
845
  record
845
- (or (mhc-current-date)
846
+ (or (mhc-summary-current-date)
846
847
  (mhc-calendar-view-date)))
847
848
  (mhc-db-delete-file record))
848
849
  (or (and (mhc-summary-buffer-p)
@@ -856,12 +857,18 @@ the default action of this command is changed to the latter."
856
857
  (let ((date-list (mapconcat
857
858
  (lambda (day)
858
859
  (mhc-date-format day "%04d%02d%02d" yy mm dd))
859
- (mhc-input-day "Date: " (mhc-current-date))
860
- " ")))
860
+ (mhc-input-day "Date: " (mhc-summary-current-date))
861
+ " "))
862
+ (time-list (mhc-time-range-to-string
863
+ (mhc-input-time "Time: "
864
+ (mhc-schedule-time-as-string
865
+ (car (mhc-record-schedules
866
+ (mhc-parse-string (mhc-draft-template)))))))))
861
867
  (mhc-window-push)
862
868
  (mhc-draft-new (mhc-draft-template)
863
869
  `(("x-sc-record-id" . ,(mhc-record-create-id))
864
870
  ("x-sc-sequence" . 0)
871
+ ("x-sc-time" . ,time-list)
865
872
  ("x-sc-day" . ,date-list)))))
866
873
 
867
874
  (defun mhc-reuse-copy ()
@@ -871,8 +878,8 @@ the default action of this command is changed to the latter."
871
878
  (record (mhc-summary-record)))
872
879
  (if (and (stringp file) (file-exists-p file))
873
880
  (with-temp-buffer
874
- (mhc-insert-file-contents-as-coding-system
875
- mhc-default-coding-system file)
881
+ (mhc-insert-file-contents-as-coding-system
882
+ mhc-default-coding-system file)
876
883
  (mhc-header-decode-ewords)
877
884
  (mhc-draft-store-template
878
885
  (buffer-substring-no-properties (point-min) (point-max)))
@@ -926,54 +933,11 @@ the default action of this command is changed to the latter."
926
933
  (message "Specified file(%s) does not exist." file)))
927
934
 
928
935
 
929
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
930
- ;;
931
- ;; Window stack
932
- ;;
933
-
934
- (defvar mhc-window-stack nil)
935
-
936
- (defun mhc-window-push ()
937
- (interactive)
938
- (setq mhc-window-stack
939
- (cons (current-window-configuration) mhc-window-stack)))
940
-
941
- (defun mhc-window-pop ()
942
- (interactive)
943
- (if mhc-window-stack
944
- (set-window-configuration (car-safe mhc-window-stack)))
945
- (setq mhc-window-stack (cdr-safe mhc-window-stack)))
946
-
947
936
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
948
937
  ;;
949
938
  ;; (Category . (parent-face fg bg))
950
939
  ;;
951
940
 
952
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
953
- ;; manipulate data from mhc-summary-buffer.
954
-
955
- (defconst mhc-summary-day-regex "\\([^|]+| +\\)?[0-9]+/\\([0-9]+\\)")
956
-
957
- (defun mhc-summary-buffer-p (&optional buffer)
958
- (if buffer
959
- (set-buffer buffer))
960
- mhc-summary-buffer-current-date-month)
961
-
962
- (defun mhc-current-date ()
963
- (when (mhc-summary-buffer-p)
964
- (let ((dayinfo (get-text-property (point) 'mhc-dayinfo)))
965
- (or (and dayinfo (mhc-day-date dayinfo))
966
- (save-excursion
967
- (end-of-line)
968
- (while (and (not (bobp))
969
- (null dayinfo))
970
- (or (setq dayinfo (get-text-property (point) 'mhc-dayinfo))
971
- (forward-char -1)))
972
- (and dayinfo (mhc-day-date dayinfo)))))))
973
-
974
- (defun mhc-current-date-month ()
975
- mhc-summary-buffer-current-date-month)
976
-
977
941
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
978
942
  ;; misc.
979
943
 
@@ -95,6 +95,14 @@ module Mhc
95
95
  return @categories = categories.parse(string)
96
96
  end
97
97
 
98
+ def holiday?
99
+ in_category?("holiday")
100
+ end
101
+
102
+ def in_category?(category)
103
+ categories.map{|c| c.to_s.downcase}.member?(category.downcase)
104
+ end
105
+
98
106
  ## description
99
107
  def description
100
108
  unless @description
@@ -77,7 +77,7 @@ module Mhc
77
77
 
78
78
  def format_header(context); ""; end
79
79
  def format_footer(context); ""; end
80
- def format_day_header(context, date); ""; end
80
+ def format_day_header(context, date, is_holiday); ""; end
81
81
  def format_day_footer(context, date); ""; end
82
82
 
83
83
  def format_body(context)
@@ -86,7 +86,7 @@ module Mhc
86
86
  end
87
87
 
88
88
  def format_day(context, date, items)
89
- string = format_day_header(context, date)
89
+ string = format_day_header(context, date, items.any?{|e| e.holiday?})
90
90
 
91
91
  items = sort_items_in_day(items)
92
92
  items.each_with_index do |occurrence, count|
@@ -176,7 +176,7 @@ module Mhc
176
176
  def format_header(context); "("; end
177
177
  def format_footer(context); "(periods #{@periods}))\n"; end
178
178
 
179
- def format_day_header(context, date)
179
+ def format_day_header(context, date, is_holiday)
180
180
  date.strftime("((%2m %2d %Y) . (")
181
181
  end
182
182
 
@@ -218,9 +218,9 @@ module Mhc
218
218
  def format_header(context); "("; end
219
219
  def format_footer(context); ")\n"; end
220
220
 
221
- def format_day_header(context, date)
221
+ def format_day_header(context, date, is_holiday)
222
222
  # (DAYS_FROM_EPOC . [year month day wday holiday-p (
223
- format("(%d . [%d %d %d %d nil (", date.absolute_from_epoch, date.year, date.month, date.day, date.wday)
223
+ format("(%d . [%d %d %d %d #{is_holiday ? 't' : 'nil'} (", date.absolute_from_epoch, date.year, date.month, date.day, date.wday)
224
224
  end
225
225
 
226
226
  def format_item(context, date, item)
@@ -19,7 +19,8 @@ module Mhc
19
19
  :time_range,
20
20
  :recurrence_tag,
21
21
  :mission_tag,
22
- :allday?
22
+ :allday?,
23
+ :holiday?
23
24
 
24
25
  attr_reader :event
25
26
 
@@ -44,6 +44,10 @@ module Mhc
44
44
 
45
45
  def self.parse_range(range_string)
46
46
  case range_string
47
+ # all
48
+ when /^all$/
49
+ return self.parse("19700101")..self.today + 365*10 # 10 years ahead
50
+
47
51
  # yyyymmdd-yyyymmdd
48
52
  when /^([^+-]+)-([^+-]+)$/
49
53
  return parse_relative($1)..parse_relative($2)
@@ -1,4 +1,4 @@
1
1
  module Mhc
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.4"
3
3
  PRODID = "-//Quickhack.net//MHC #{Mhc::VERSION}//EN"
4
4
  end
@@ -1,5 +1,6 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
+ git = File.expand_path('../.git', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'mhc/version'
5
6
 
@@ -13,7 +14,11 @@ Gem::Specification.new do |spec|
13
14
  spec.homepage = "http://www.quickhack.net/mhc"
14
15
  spec.license = "BSD"
15
16
 
16
- spec.files = `git ls-files -z`.split("\x0")
17
+ spec.files = if Dir.exist?(git)
18
+ `git ls-files -z`.split("\x0")
19
+ else
20
+ Dir['**/*']
21
+ end
17
22
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
23
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
24
  spec.require_paths = ["lib"]
@@ -1,18 +1,19 @@
1
1
  ##
2
2
  ## Japanese Holidays
3
3
  ##
4
- ## Place this as ~/Mail/schedule/presets/japanese-holidays.mhcc
4
+ ## Place this as REPOSITORY/presets/japanese-holidays.mhcc
5
5
  ##
6
6
 
7
7
  X-SC-Subject: 元日
8
8
  X-SC-Category: Holiday Japanese
9
+ X-SC-Duration: 19480101-
9
10
  X-SC-Cond: 1 Jan
10
11
  X-SC-Record-Id: E2BAB555-3CEB-4508-96AD-1B59AA24ADC3
11
12
 
12
13
  X-SC-Subject: 成人の日
13
14
  X-SC-Category: Holiday Japanese
14
15
  X-SC-Cond: 15 Jan
15
- X-SC-Duration: -19990115
16
+ X-SC-Duration: 19480115-19990115
16
17
  X-SC-Record-Id: EA9F4BA5-7D5A-4794-AFB3-6AB68FCA9719
17
18
 
18
19
  X-SC-Subject: 成人の日
@@ -24,12 +25,19 @@ X-SC-Record-Id: 0BC2CBD0-D81E-4315-B9A8-E112C8E3DC1C
24
25
  X-SC-Subject: 建国記念の日
25
26
  X-SC-Category: Holiday Japanese
26
27
  X-SC-Cond: 11 Feb
28
+ X-SC-Duration: 19670211-
27
29
  X-SC-Record-Id: AC1B378C-BAFE-4B6E-AF9C-78C2377E8AA4
28
30
 
31
+ X-SC-Subject: 天皇誕生日
32
+ X-SC-Category: Holiday Japanese
33
+ X-SC-Cond: 29 Apr
34
+ X-SC-Duration: 19480429-19980429
35
+ X-SC-Record-Id: B78EAAEE-9963-4573-9EC7-0879F8940AEE
36
+
29
37
  X-SC-Subject: みどりの日
30
38
  X-SC-Category: Holiday Japanese
31
39
  X-SC-Cond: 29 Apr
32
- X-SC-Duration: -20060429
40
+ X-SC-Duration: 19890429-20060429
33
41
  X-SC-Record-Id: B78EAAEE-9963-4573-9EC7-0879F8940AEE
34
42
 
35
43
  X-SC-Subject: 昭和の日
@@ -41,14 +49,9 @@ X-SC-Record-Id: A458E14C-960C-4F01-AF73-8ACB1B51A6A1
41
49
  X-SC-Subject: 憲法記念日
42
50
  X-SC-Category: Holiday Japanese
43
51
  X-SC-Cond: 3 May
52
+ X-SC-Duration: 19480503-
44
53
  X-SC-Record-Id: BA89778E-E8CC-4588-B5C3-56F86483DEC1
45
54
 
46
- X-SC-Subject: 国民の休日
47
- X-SC-Category: Holiday Japanese
48
- X-SC-Cond: 4 May
49
- X-SC-Duration: -20060504
50
- X-SC-Record-Id: 46953810-BD72-45DE-BC11-104CBE970CFF
51
-
52
55
  X-SC-Subject: みどりの日
53
56
  X-SC-Category: Holiday Japanese
54
57
  X-SC-Cond: 4 May
@@ -58,12 +61,13 @@ X-SC-Record-Id: 47938EDA-41A5-4E51-BDCB-2D3B60F49D71
58
61
  X-SC-Subject: こどもの日
59
62
  X-SC-Category: Holiday Japanese
60
63
  X-SC-Cond: 5 May
64
+ X-SC-Duration: 19480505-
61
65
  X-SC-Record-Id: 4AE5568A-2DFE-4B6B-92E5-C4BFADFB2CCF
62
66
 
63
67
  X-SC-Subject: 海の日
64
68
  X-SC-Category: Holiday Japanese
65
69
  X-SC-Cond: 20 Jul
66
- X-SC-Duration: -20020720
70
+ X-SC-Duration: 19960720-20020720
67
71
  X-SC-Record-Id: 5E03776A-4280-4337-85C0-F1322A3AAE6E
68
72
 
69
73
  X-SC-Subject: 海の日
@@ -72,22 +76,28 @@ X-SC-Cond: 3rd Mon Jul
72
76
  X-SC-Duration: 20030701-
73
77
  X-SC-Record-Id: BD4156C2-5546-4146-8297-09CF4210A346
74
78
 
79
+ X-SC-Subject: 山の日
80
+ X-SC-Category: Holiday Japanese
81
+ X-SC-Cond: 11 Aug
82
+ X-SC-Duration: 20160811-
83
+ X-SC-Record-Id: FC7C481B-7BF5-4639-B700-3B60CB99E05D
84
+
75
85
  X-SC-Subject: 敬老の日
76
86
  X-SC-Category: Holiday Japanese
77
87
  X-SC-Cond: 15 Sep
78
- X-SC-Duration: -20020915
88
+ X-SC-Duration: 19660915-20020915
79
89
  X-SC-Record-Id: 29BC6E4E-0D70-4EF8-8AF0-7000254D3CDB
80
90
 
81
91
  X-SC-Subject: 敬老の日
82
92
  X-SC-Category: Holiday Japanese
83
93
  X-SC-Cond: 3rd Mon Sep
84
- X-SC-Duration: 20030901-
94
+ X-SC-Duration: 20030915-
85
95
  X-SC-Record-Id: F303C1C9-01B0-437C-A2E2-BCD1ADD901F2
86
96
 
87
97
  X-SC-Subject: 体育の日
88
98
  X-SC-Category: Holiday Japanese
89
99
  X-SC-Cond: 10 Oct
90
- X-SC-Duration: -19991010
100
+ X-SC-Duration: 19661010-19991010
91
101
  X-SC-Record-Id: AFABC42C-2E9D-4093-A4AF-DA12D4D4B9D7
92
102
 
93
103
  X-SC-Subject: 体育の日
@@ -99,16 +109,19 @@ X-SC-Record-Id: C17D9CA5-28AF-4826-AD33-8B75473E5B52
99
109
  X-SC-Subject: 文化の日
100
110
  X-SC-Category: Holiday Japanese
101
111
  X-SC-Cond: 3 Nov
112
+ X-SC-Duration: 19481103-
102
113
  X-SC-Record-Id: A76779D2-BB44-4ED5-ACF9-B646E10C7313
103
114
 
104
115
  X-SC-Subject: 勤労感謝の日
105
116
  X-SC-Category: Holiday Japanese
106
117
  X-SC-Cond: 23 Nov
118
+ X-SC-Duration: 19481123-
107
119
  X-SC-Record-Id: 97E6F125-2625-44A9-8D43-A6FCA9670D8D
108
120
 
109
121
  X-SC-Subject: 天皇誕生日
110
122
  X-SC-Category: Holiday Japanese
111
123
  X-SC-Cond: 23 Dec
124
+ X-SC-Duration: 19891223-
112
125
  X-SC-Record-Id: 51D42B0D-EF46-4D65-B62A-6ED2F0D1F0B5
113
126
 
114
127
  ## 毎年変わる祝日と振替休日
@@ -134,20 +147,36 @@ X-SC-Category: Holiday Japanese
134
147
  X-SC-Record-Id: 54A339AD-F7FD-4E56-9B70-2D09F840E94D
135
148
 
136
149
  X-SC-Subject: 振替休日
137
- X-SC-Day: 19900212 19900430 19900924 19901224 19910506 19910916 19911104
138
- 19931011 19950102 19950116 19960212 19960506 19960916 19961104
139
- 19970721 19971124 19990322 19991011 20010212 20010430 20010924
140
- 20011224 20020506 20020916 20021104 20031124 20050321 20060102
141
- 20070212 20070430 20070924 20071224 20080506 20080721 20081124
142
- 20090506 20090922 20100322 20120102 20120430 20121224 20130506
150
+ X-SC-Day: 19730430 19730924 19740506 19740916 19741104 19751124
151
+ 19761011 19780102 19780116 19790212 19790430 19801124 19810504
152
+ 19820322 19821011 19840102 19840116 19840430 19840924 19850506
153
+ 19850916 19851104 19861124 19870504 19880321 19890102 19890116
154
+ 19900212 19900430 19900924 19901224 19910506 19910916 19911104
155
+ 19920504 19931011 19950102 19950116 19960212 19960506 19960916
156
+ 19961104 19970721 19971124 19980504 19990322 19991011 20010212
157
+ 20010430 20010924 20011224 20020506 20020916 20021104 20031124
158
+ 20050321 20060102 20070212 20070430 20070924 20071224 20080506
159
+ 20081124 20090506 20100322 20120102 20120430 20121224 20130506
143
160
  20131104 20140506 20141124 20150506 20160321 20170102 20180212
144
- 20180430 20180924 20181224 20190506 20191104 20200506 20230102
145
- 20240212 20240506 20240923 20241104 20250506 20251124 20260506
146
- 20270322 20290212 20290430 20290924 20291224 20300506 20301104
147
- 20310506 20311124
161
+ 20180430 20180924 20181224 20190506 20190812 20191104 20200506
162
+ 20230102 20240212 20240506 20240812 20240923 20241104 20250506
163
+ 20251124 20260506 20270322 20290212 20290430 20290924 20291224
164
+ 20300506 20300812 20301104 20310506 20311124 20330321 20340102
165
+ 20350212 20350430 20350924 20351224 20360506 20361124 20370506
166
+ 20400102 20400430 20401224 20410506 20410812 20411104 20420506
167
+ 20421124 20430506 20440321 20450102 20460212 20460430 20460924
168
+ 20461224 20470506 20470812 20471104 20480506 20500321
148
169
  X-SC-Category: Holiday Japanese
149
170
  X-SC-Record-Id: E2D696DF-EB49-44D7-B06C-812B10BD99A2
150
171
 
172
+ X-SC-Subject: 国民の休日
173
+ X-SC-Category: Holiday Japanese
174
+ X-SC-Day: 19880504 19890504 19900504 19910504 19930504 19940504 19950504
175
+ 19960504 19990504 20000504 20010504 20020504 20040504 20050504 20060504
176
+ 20090922 20150922 20260922 20320921 20370922 20430922 20490921 20540922
177
+ 20600921 20650922 20710922 20770921 20880921 20940921 20990922
178
+ X-SC-Record-Id: 46953810-BD72-45DE-BC11-104CBE970CFF
179
+
151
180
  ## Make sure you have at least one blank line for each entry (改行で終わる)
152
181
 
153
182
  ## EOF
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mhc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoshinari Nomura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-17 00:00:00.000000000 Z
11
+ date: 2015-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor