mhc 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
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