honyomi 0.2.0 → 1.0.0

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.
@@ -1,8 +1,17 @@
1
+ # -*- coding: utf-8 -*-
1
2
  require 'haml'
2
3
  require 'honyomi/database'
3
4
  require 'honyomi/util'
4
5
  require 'sinatra'
5
- require 'sinatra/reloader' if ENV['SINATRA_RELOADER']
6
+ if ENV['SINATRA_RELOADER']
7
+ require 'sinatra/reloader'
8
+ also_reload '../../**/*.rb'
9
+ end
10
+
11
+ SEARCH_RPAGE = 20
12
+
13
+ BOOKMARK_RPAGE = 20
14
+ BOOKMARK_COMMENT_LENGTH = 255
6
15
 
7
16
  include Honyomi
8
17
 
@@ -22,11 +31,23 @@ get '/' do
22
31
  end
23
32
  end
24
33
 
34
+ get '/help' do
35
+ haml :help
36
+ end
37
+
25
38
  post '/search' do
39
+ q = Query.new(params[:query])
40
+
26
41
  if params[:book_id] && !@params[:book_id].empty?
27
- redirect "/v/#{@params[:book_id]}?query=#{escape(params[:query])}"
42
+ if q.key['book'][0] || q.key['title'][0]
43
+ redirect "/?query=#{escape(q.src)}"
44
+ elsif q.jump_page_no
45
+ redirect "/v/#{@params[:book_id]}?page=#{q.jump_page_no}&query=#{escape(q.src)}"
46
+ else
47
+ redirect "/v/#{@params[:book_id]}?query=#{escape(q.src)}"
48
+ end
28
49
  else
29
- redirect "/?query=#{escape(params[:query])}"
50
+ redirect "/?query=#{escape(q.src)}"
30
51
  end
31
52
  end
32
53
 
@@ -47,6 +68,8 @@ get '/v/:id' do
47
68
  else
48
69
  if @params[:query] && !@params[:query].empty?
49
70
  search_book_home(book)
71
+ elsif @params[:b] == '1'
72
+ book_bookmark(book)
50
73
  else
51
74
  book_home(book)
52
75
  end
@@ -54,24 +77,56 @@ get '/v/:id' do
54
77
  end
55
78
  end
56
79
 
80
+ post '/command' do
81
+ @database = $database
82
+
83
+ case params[:kind]
84
+ when 'favorite'
85
+ page = @database.pages["#{params[:id].to_i}:#{params[:page_no].to_i}"]
86
+
87
+ if params[:favorited] == 'true'
88
+ @database.add_bookmark(page)
89
+ else
90
+ @database.delete_bookmark(page)
91
+ end
92
+ ""
93
+
94
+ when 'favorite-update'
95
+ bm = @database.update_bookmark_comment(params[:id].to_i, params[:page_no].to_i, params[:comment])
96
+ Util.render_bookmark_comment_to_html(bm)
97
+
98
+ when 'title-form-save'
99
+ @database.change_book(params[:id].to_i,
100
+ {
101
+ title: params[:title],
102
+ author: params[:author],
103
+ url: params[:url],
104
+ })
105
+ ""
106
+ end
107
+ end
108
+
57
109
  helpers do
58
110
 
59
111
  def home
60
- @header_info = %Q|#{@database.books.size} books, #{@database.pages.size} pages.|
61
-
62
- r = @database.books.map { |book|
63
- <<EOF
112
+ if @params[:b] == '1'
113
+ @header_info = %Q|<a href="/">#{@database.books.size}</a> books, <strong>#{@database.bookmarks.size}</strong> bookmarks.|
114
+ render_bookmarks(@database.bookmarks, [{key: "timestamp", order: "descending"}])
115
+ else
116
+ @header_info = %Q|<strong>#{@database.books.size}</strong> books, <a href="/?b=1">#{@database.bookmarks.size}</a> bookmarks.|
117
+ r = @database.books.map { |book|
118
+ <<EOF
64
119
  <li>#{book.id}: <a href="/v/#{book.id}">#{book.title}</a> (#{book.page_num}P)</li>
65
120
  EOF
66
- }.reverse
121
+ }.reverse
67
122
 
68
- @content = <<EOF
123
+ @content = <<EOF
69
124
  <ul>
70
125
  #{r.join("\n")}
71
126
  </ul>
72
127
  EOF
73
-
74
- haml :index
128
+ haml :index
129
+ end
75
130
  end
76
131
 
77
132
  def search_home
@@ -82,18 +137,14 @@ EOF
82
137
  end
83
138
 
84
139
  def book_home(book)
85
- @book_id = book.id
86
- @header_title = header_title_book(book, @params[:query])
87
- @header_info = header_info_book(book, @params[:query])
88
- @content = ""
89
- haml :index
140
+ text_page(book, 1)
90
141
  end
91
142
 
92
143
  def search_book_home(book)
93
144
  @book_id = book.id
94
145
  @header_title = header_title_book(book, @params[:query])
95
146
 
96
- search_common(@params[:query] + " book: #{book.id}",
147
+ search_common(@params[:query] + " book:#{book.id}",
97
148
  [["page_no", :asc]],
98
149
  false
99
150
  )
@@ -114,28 +165,60 @@ EOF
114
165
  haml :index
115
166
  end
116
167
 
168
+ PAGE_SIZE = 5
169
+
117
170
  def text_page(book, page_no)
118
- page = @database.book_pages(book.id)[page_no]
119
171
  keywords = Util.extract_keywords(@params[:query])
172
+ page = @database.pages["#{book.id}:#{page_no}"]
120
173
 
121
174
  @book_id = book.id
122
175
  @header_title = header_title_book(book, @params[:query])
123
- @header_info = header_info_book(book, @params[:query], page)
176
+ @header_info = header_info_book(book, @params[:query])
177
+ @content = ""
178
+
179
+ pages = @database.book_pages(@book_id)
180
+ page_index = page_no - 1
181
+
182
+ prev_link = ""
183
+ if page_index > 0
184
+ prev_link = <<EOF
185
+ <ul class="pager">
186
+ <li><a href='#{url + "?page=#{[page_no - PAGE_SIZE, 1].max}"}' >Prev</a></li>
187
+ </ul>
188
+ EOF
189
+ end
190
+
191
+ main_contents = (pages.to_a[page_index, PAGE_SIZE] || []).map do |page|
192
+ render_page(page, keywords: keywords, with_number: true)
193
+ end
194
+
195
+ pagination_str = ""
196
+ if page_index + PAGE_SIZE < pages.count
197
+ pagination_str = <<EOF
198
+ <ul class="pager">
199
+ <li><a href='#{url + "?page=#{page_no + PAGE_SIZE}"}' rel='next'>Next</a></li>
200
+ </ul>
201
+ EOF
202
+ end
124
203
 
125
- @content = render_page(page, keywords: keywords)
204
+ @content = <<EOF
205
+ #{prev_link}
206
+ <div class="autopagerize_page_element">
207
+ #{main_contents.join("\n")}
208
+ </div>
209
+ #{pagination_str}
210
+ EOF
126
211
 
127
212
  haml :index
128
213
  end
129
214
 
130
- RPAGE_SIZE = 20
131
-
132
215
  def search_common(query, sort_keys, is_filter)
133
- results = @database.search(query)
216
+ results, snippet = @database.search(Query.new(query))
134
217
 
135
218
  rpage = @params[:rpage] ? @params[:rpage].to_i : 1
136
- rpage_entries = results.paginate(sort_keys, :page => rpage, :size => RPAGE_SIZE)
219
+ rpage_entries = results.paginate(sort_keys, :page => rpage, :size => SEARCH_RPAGE)
137
220
  pagination_str = ""
138
- if (rpage - 1) * RPAGE_SIZE + rpage_entries.count < results.count
221
+ if (rpage - 1) * SEARCH_RPAGE + rpage_entries.count < results.count
139
222
  pagination_str = <<EOF
140
223
  <ul class="pager">
141
224
  <li><a href='#{url + "?query=#{escape(@params[:query])}&rpage=#{rpage + 1}"}' rel='next'>Next</a></li>
@@ -143,15 +226,18 @@ EOF
143
226
  EOF
144
227
  end
145
228
 
146
- snippet = results.expression.snippet([["<span class=\"highlight\">", "</span>"]], {html_escape: true, normalize: true, max_results: 5})
147
-
148
229
  books = {}
149
230
 
150
231
  results.each do |page|
151
232
  books[page.book.path] = 1
152
233
  end
153
234
 
154
- @header_info = %Q|#{books.size} books, #{results.size} pages|
235
+ if is_filter
236
+ @header_info = %Q|#{books.size} books, #{results.size} pages|
237
+ else
238
+ @header_info = %Q|#{results.size} pages|
239
+ end
240
+
155
241
 
156
242
  r = rpage_entries.map do |page|
157
243
  if is_filter
@@ -162,15 +248,30 @@ EOF
162
248
  filter_str = ""
163
249
  end
164
250
 
251
+ bm = @database.bookmark_from_page(page)
252
+ comment_hits = snippet.execute(bm ? (bm.comment || "") : "")
253
+ text_hits = snippet.execute(page.text || "")
254
+
255
+ main_contents =
256
+ wrap_result_body_element(comment_hits) +
257
+ wrap_result_body_element(text_hits)
258
+
165
259
  <<EOF
166
260
  <div class="result">
167
- <div class="title"><a href="/v/#{page.book.id}?query=#{escape(@params[:query])}&page=#{page.page_no}">#{page.book.title}</a> (P#{page.page_no})</div>
261
+ <div class="title">
262
+ <div class="ss-box">#{favstar(page)}</div>
263
+ <div><a href="/v/#{page.book.id}?query=#{escape(@params[:query])}&page=#{page.page_no}">#{page.book.title}</a> (P#{page.page_no})</div>
264
+ <div class="ss-end"></div>
265
+ </div>
266
+
168
267
  <div class="row info">
169
268
  #{filter_str}
170
269
  </div>
270
+
171
271
  <div class="main">
172
- #{snippet.execute(page.text).map {|segment| "<div class=\"result-body-element\">" + segment.gsub("\n", "") + "</div>"}.join("\n") }
272
+ #{main_contents}
173
273
  </div>
274
+
174
275
  </div>
175
276
  EOF
176
277
  end
@@ -185,36 +286,159 @@ EOF
185
286
  haml :index
186
287
  end
187
288
 
289
+ def book_bookmark(book)
290
+ @book_id = book.id
291
+ @header_title = header_title_book(book, @params[:query])
292
+ @header_info = header_info_book(book, @params[:query])
293
+ render_bookmarks(@database.books_bookmark(book), [{key: "page.page_no", order: "ascending"}])
294
+ end
295
+
296
+ def render_bookmarks(bookmarks, sort_keys)
297
+ rpage = @params[:rpage] ? @params[:rpage].to_i : 1
298
+ sorted = bookmarks.sort(sort_keys, offset: (rpage - 1) * BOOKMARK_RPAGE, limit: BOOKMARK_RPAGE)
299
+
300
+ r = sorted.map { |bookmark|
301
+ page = bookmark.page
302
+ book = page.book
303
+ title = book.title
304
+
305
+ content = []
306
+ content << bookmark.comment if bookmark.comment
307
+ content << page.text if page.text
308
+
309
+ r = []
310
+ rest = BOOKMARK_COMMENT_LENGTH
311
+ content.each do |e|
312
+ if e.length > rest
313
+ r << e[0, rest]
314
+ break
315
+ else
316
+ r << e
317
+ rest -= e.length
318
+ end
319
+ end
320
+
321
+ content = r.map { |e| "<p>#{escape_html(e)}</p>" }.join("\n")
322
+
323
+ <<EOF
324
+ <div class="result">
325
+ <div class="title">
326
+ <div class="ss-box">#{favstar(page)}</div>
327
+ <div><a href="/v/#{book.id}?page=#{page.page_no}">#{book.title}</a> (P#{page.page_no})</div>
328
+ <div class="ss-end"></div>
329
+ </div>
330
+
331
+ <div class="main">
332
+ <div class="result-body-element">#{content}</div>
333
+ </div>
334
+ </div>
335
+ EOF
336
+ }
337
+
338
+ pagination_str = ""
339
+ if rpage * BOOKMARK_RPAGE < bookmarks.count
340
+ pagination_str = <<EOF
341
+ <ul class="pager">
342
+ <li><a href='#{url + "?b=1&rpage=#{rpage + 1}"}' rel='next'>Next</a></li>
343
+ </ul>
344
+ EOF
345
+ end
346
+
347
+
348
+ @content = <<EOF
349
+ <div class="autopagerize_page_element">
350
+ #{r.join("\n")}
351
+ </div>
352
+ #{pagination_str}
353
+ EOF
354
+ haml :index
355
+ end
356
+
188
357
  def header_title_book(book, query)
189
358
  query = query ? "?query=#{query}" : ""
190
- "<a href='/#{query}'>HOME</a> &gt; <a href='/v/#{book.id}#{query}'>#{book.title}</a>"
359
+
360
+ <<EOF
361
+ <div class="title">
362
+ <a href='/#{query}'>HOME</a> &gt; <a href='/v/#{book.id}#{query}' id="book-title" honyomi-book-id="#{book.id}">#{escape_html(book.title)}</a> <span class='edit-link'>- <a href="#">Edit</a></span>
363
+ </div>
364
+ <div class="etc">
365
+ <span id="book-author">#{escape_html(book.author)}</span>
366
+ <span><a id="book-url" href="#{book.url}">#{escape_html(book.url)}</a></span>
367
+ </div>
368
+ EOF
191
369
  end
192
370
 
193
- def header_info_book(book, query, page = nil)
371
+ def header_info_book(book, query)
194
372
  query = query ? "&query=#{query}" : ""
195
373
  file_mb = File.stat(book.path).size / (1024 * 1024)
196
374
 
197
- if page.nil?
198
- %Q|#{book.page_num} pages. <a href="/v/#{book.id}?dl=1">Download</a> <span class="file-size">(#{file_mb}M)</span>&nbsp;&nbsp;&nbsp;<a href="/v/#{book.id}?pdf=1">Pdf</a>&nbsp;&nbsp;&nbsp;<a href="/v/#{book.id}?text=1#{query}">Text</a>|
375
+ pages = @params[:b] == '1' ? "<a href=\"/v/#{book.id}\">#{book.page_num}</a>" : "<strong>#{book.page_num}</strong>"
376
+
377
+ bm = @database.books_bookmark(book)
378
+ if @params[:b] == '1'
379
+ bm_text = ", <strong><span class=\"boomark-number\">#{bm.count}</span></strong> bookmarks. "
199
380
  else
200
- %Q|<i class="fa fa-file-text-o"></i> P#{page.page_no} &nbsp;&nbsp;&nbsp;<a href="/v/#{book.id}?dl=1">Download</a> <span class="file-size">(#{file_mb}M)</span>&nbsp;&nbsp;&nbsp;<a href="/v/#{book.id}?pdf=1#page=#{page.page_no}">Pdf</a>&nbsp;&nbsp;&nbsp;<a href="/v/#{book.id}?text=1#{query}##{page.page_no}">Text</a>|
381
+ bm_text = ", <a href=\"/v/#{book.id}?b=1\"><span class=\"boomark-number\">#{bm.count}</span></a> bookmarks. "
201
382
  end
383
+
384
+ %Q|#{pages} pages#{bm_text}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="/v/#{book.id}?dl=1">Download</a> <span class="file-size">(#{file_mb}M)</span>&nbsp;&nbsp;&nbsp;<a href="/v/#{book.id}?pdf=1">Pdf</a>&nbsp;&nbsp;&nbsp;<a href="/v/#{book.id}?text=1#{query}">Text</a>|
202
385
  end
203
386
 
204
387
  def render_page(page, options = {})
205
- with_number = options[:with_number] ? %Q|<div class="no"><i class="fa fa-file-text-o"></i> <a href="##{page.page_no}">P#{page.page_no}</a></div>| : ""
388
+ book = page.book
389
+ with_number = ""
390
+ if options[:with_number]
391
+ with_number = <<EOF
392
+ <div class="no row">
393
+ <div class="col-xs-3"><div class="ss-box">#{favstar(page)}</div> <a href="##{page.page_no}">P#{page.page_no}</a></div>
394
+ <div class="col-xs-offset-8 col-xs-1"><a href="/v/#{book.id}?pdf=1#page=#{page.page_no}"><i class="fa fa-file-text-o"></i></a></div>
395
+ </div>
396
+ EOF
397
+ end
398
+
399
+ comment = ""
400
+
401
+ bm = @database.bookmark_from_page(page)
402
+
403
+ if bm && bm.comment && !bm.comment.empty?
404
+ comment = <<EOF
405
+ <div class="comment">
406
+ #{Util.render_bookmark_comment_to_html(bm)}
407
+ </div>
408
+ EOF
409
+ end
206
410
 
207
- text = escape_html(page.text)
208
- text = Util.highlight_keywords(text, options[:keywords], 'highlight') if options[:keywords]
411
+ text = Util.highlight_keywords(page.text, options[:keywords], 'highlight')
209
412
  text = text.gsub("\n\n", "<br/><br/>")
210
413
 
211
414
  <<EOF
212
415
  <div class="page" id="#{page.page_no}">
213
416
  #{with_number}
417
+ #{comment}
214
418
  <div class="main">
215
419
  #{text}
216
420
  </div>
217
421
  </div>
218
422
  EOF
219
423
  end
424
+
425
+ def favstar(page)
426
+ classes = @database.bookmark?(page) ? "star favorited" : "star"
427
+ attr = []
428
+ attr << %Q|honyomi-id="#{page.book.id}"|
429
+ attr << %Q|honyomi-page-no="#{page.page_no}"|
430
+ attr << %Q|honyomi-title="#{page.book.title}"|
431
+ bm = @database.bookmark_from_page(page)
432
+ attr << %Q|honyomi-comment="#{escape_html(bm.comment).gsub("\n", "&#13;")}"| if bm && bm.comment
433
+
434
+ "<a href=\"javascript:\" id=\"star-#{page.book.id}-#{page.page_no}\" class=\"#{classes}\" #{attr.join(" ")}>Star</a>"
435
+ end
436
+
437
+ def wrap_result_body_element(hits)
438
+ r = hits.map { |segment|
439
+ "<div class=\"result-body-element\">" + segment.gsub("\n", "") + "</div>"
440
+ }.join("\n")
441
+
442
+ "<p>#{r}</p>"
443
+ end
220
444
  end
@@ -3,10 +3,17 @@
3
3
  }
4
4
 
5
5
  .header .title {
6
- font-size: 130%;
7
6
  margin: 0px 0px 10px 0px;
8
7
  }
9
8
 
9
+ .header .title .title {
10
+ font-size: 130%;
11
+ }
12
+
13
+ .header .title .etc {
14
+ font-size: 100%;
15
+ }
16
+
10
17
  .header .info {
11
18
  margin: 10px 0px 0px 5px;
12
19
  }
@@ -52,6 +59,13 @@
52
59
  padding: 20px 0px 10px 0px;
53
60
  }
54
61
 
62
+ .page .comment {
63
+ background-color: #f0f0f0;
64
+ border: solid 1px #d0d0d0;
65
+ font-size: 95%;
66
+ margin-bottom: 2px;
67
+ }
68
+
55
69
  .page .main {
56
70
  background-color: #fbfbfb;
57
71
  border: solid 1px #d0d0d0;
@@ -66,7 +80,49 @@
66
80
  .highlight {
67
81
  /* background-color: #B4D5FF; */
68
82
  /* background-color: #FFF17A; */
69
- background-color: #FEEFA2;
83
+ /* background-color: #FEEFA2; */
84
+ background-color: #c0deff;
70
85
  font-weight: bold;
71
86
  }
72
87
 
88
+ .ss-box {
89
+ float: left;
90
+ margin-right: 5px;
91
+ }
92
+
93
+ .ss-end {
94
+ clear: both;
95
+ }
96
+
97
+ .star {
98
+ text-indent: -5000px;
99
+ display: block;
100
+ background: transparent url("/image/star.png") 20px;
101
+ height: 20px;
102
+ width: 20px;
103
+ }
104
+
105
+ .star.favorited {
106
+ background-position: 0px;
107
+ }
108
+
109
+ input#clear {
110
+ /* margin-left: 0px; */
111
+ width: 64px;
112
+ height: 36px;
113
+ font-size: 12px;
114
+ }
115
+
116
+ .edit-link {
117
+ color: #8f8f8f;
118
+ }
119
+
120
+ .edit-link a {
121
+ color: #8f8f8f;
122
+ }
123
+
124
+ /* help */
125
+
126
+ #help h3 {
127
+ font-size: 120%;
128
+ }
@@ -0,0 +1,155 @@
1
+ function click_clear_button() {
2
+ $(".form-control").val("").focus();
3
+ }
4
+
5
+ $(document).ready(function() {
6
+ $(document).on('click', '.star', function(e) {
7
+ var id = $(this).attr('honyomi-id');
8
+ var page_no = $(this).attr('honyomi-page-no');
9
+ var title = $(this).attr('honyomi-title');
10
+
11
+ if (!$(this).hasClass('favorited')) {
12
+ // NEW
13
+ $(this).addClass('favorited');
14
+
15
+ var num = parseInt($(".boomark-number").text());
16
+ $(".boomark-number").text(num + 1);
17
+
18
+ // ajax
19
+ $.post(
20
+ '/command',
21
+ {
22
+ kind: 'favorite',
23
+ id: id,
24
+ page_no: page_no,
25
+ favorited: true
26
+ },
27
+ function(data) {
28
+ // Return a result of POST
29
+ }
30
+ );
31
+
32
+ } else {
33
+ // EDIT
34
+ $('#modal-bookmark-label').html(
35
+ "<span class=\"modal-bookmark-data hidden\" " +
36
+ "honyomi-id=\"" + id + "\" " +
37
+ "honyomi-page-no=\"" + page_no + "\" " +
38
+ "></span>" +
39
+ title + " (P" + page_no + ")"
40
+ );
41
+
42
+ $(".modal-body textarea").val($(this).attr('honyomi-comment'));
43
+
44
+ $('#modal-bookmark-edit').modal();
45
+ }
46
+
47
+ e.preventDefault();
48
+ });
49
+
50
+ var updateMemo = function () {
51
+ var id = $(".modal-bookmark-data").attr('honyomi-id');
52
+ var page_no = $(".modal-bookmark-data").attr('honyomi-page-no');
53
+ var comment = $(".modal-body textarea").val();
54
+
55
+ $("#star-" + id + "-" + page_no).attr("honyomi-comment", comment);
56
+
57
+ $.post(
58
+ '/command',
59
+ {
60
+ kind: 'favorite-update',
61
+ id: id,
62
+ page_no: page_no,
63
+ comment: comment
64
+ },
65
+ function(data) {
66
+ var comment = $("#" + page_no + " .comment");
67
+
68
+ if (comment.size() == 0) {
69
+ $('<div class="comment">' + data + '</div>').insertBefore("#" + page_no + " .main");
70
+ } else {
71
+ comment.html(data);
72
+ }
73
+ }
74
+ );
75
+ }
76
+
77
+ $("#modal-bookmark-edit .btn-primary").click(function (e) {
78
+ updateMemo();
79
+ });
80
+
81
+ $(".modal-body textarea").keydown(function (e) {
82
+ if (e.ctrlKey && e.keyCode == 13) {
83
+ $('#modal-bookmark-edit').modal('hide');
84
+ updateMemo();
85
+ }
86
+ });
87
+
88
+ $("#modal-bookmark-edit .btn-danger").click(function (e) {
89
+ var id = $(".modal-bookmark-data").attr('honyomi-id');
90
+ var page_no = $(".modal-bookmark-data").attr('honyomi-page-no');
91
+
92
+ if (confirm("Delete this bookmark?")) {
93
+ $("#star-" + id + "-" + page_no).removeClass('favorited');
94
+ $("#" + page_no + " .comment").remove();
95
+
96
+ var num = parseInt($(".boomark-number").text());
97
+ $(".boomark-number").text(num - 1);
98
+
99
+ $.post(
100
+ '/command',
101
+ {
102
+ kind: 'favorite',
103
+ id: id,
104
+ page_no: page_no,
105
+ favorited: false
106
+ }
107
+ );
108
+ }
109
+ });
110
+
111
+ $(".edit-link").click(function (e) {
112
+ $(".title").addClass('hide');
113
+ $(".title-form").removeClass('hide');
114
+ $("#title-form-title").val($("#book-title").text());
115
+ $("#title-form-author").val($("#book-author").text());
116
+ $("#title-form-url").val($("#book-url").text());
117
+ });
118
+
119
+ var hideTitleForm = function() {
120
+ $(".title").removeClass('hide');
121
+ $(".title-form").addClass('hide');
122
+ }
123
+
124
+ $("#title-form-save").click(function (e) {
125
+ var id = $("#book-title").attr('honyomi-book-id');
126
+ var title = $("#title-form-title").val();
127
+ var author = $("#title-form-author").val();
128
+ var url = $("#title-form-url").val();
129
+
130
+ $("#book-title").text(title);
131
+ $("#book-author").text(author);
132
+ $("#book-url").attr('href', url);
133
+ $("#book-url").text(url);
134
+
135
+ $.post(
136
+ '/command',
137
+ {
138
+ kind: 'title-form-save',
139
+ id: id,
140
+ title: title,
141
+ author: author,
142
+ url: url
143
+ },
144
+ function(data) {
145
+ // Return a result of POST
146
+ }
147
+ );
148
+
149
+ hideTitleForm();
150
+ });
151
+
152
+ $("#title-form-cancel").click(function (e) {
153
+ hideTitleForm();
154
+ });
155
+ });