From 5841a9a89d75e75bee0f6c2910a2076d4a668a5e Mon Sep 17 00:00:00 2001 From: Satoshi Kojima Date: Sat, 22 Feb 2020 17:26:18 +0900 Subject: [PATCH] fix add_item new broken interface. including fix #109 --- lib/gepub/book.rb | 8 ++-- lib/gepub/book_add_item.rb | 8 ++-- spec/book_spec.rb | 87 ++++++++++++++++++++++++++++++++++++++ tools/generate_function.rb | 3 +- 4 files changed, 98 insertions(+), 8 deletions(-) diff --git a/lib/gepub/book.rb b/lib/gepub/book.rb index 61a5c3d..fc04c61 100644 --- a/lib/gepub/book.rb +++ b/lib/gepub/book.rb @@ -467,10 +467,12 @@ def add_item_internal(href, content: nil, item_attributes: , attributes: {}, ord item_attributes.each do |attr, val| next if val.nil? method_name = if attr == :toc_text - attr.to_s + "" + elsif attr == :property + "add_" else - "add_" + attr.to_s - end + "set_" + end + attr.to_s item.send(method_name, val) end item diff --git a/lib/gepub/book_add_item.rb b/lib/gepub/book_add_item.rb index ba19e30..54193f1 100644 --- a/lib/gepub/book_add_item.rb +++ b/lib/gepub/book_add_item.rb @@ -3,18 +3,18 @@ class Book # add an item(i.e. html, images, audios, etc) to Book. # the added item will be referenced by the first argument in the EPUB container. def add_item(href, deprecated_content = nil, deprecated_id = nil, deprecated_attributes = nil, content: nil, - id: nil,media_type: nil,fallback: nil,properties: nil,media_overlay: nil,toc_text: nil, + id: nil,media_type: nil,fallback: nil,properties: nil,media_overlay: nil,toc_text: nil,property: nil, attributes: {}) content, id, attributes = handle_deprecated_add_item_arguments(deprecated_content, deprecated_id, deprecated_attributes, content, id, attributes) - add_item_internal(href, content: content, item_attributes: { id: id,media_type: media_type,fallback: fallback,properties: properties,media_overlay: media_overlay,toc_text: toc_text }, attributes: attributes, ordered: false) + add_item_internal(href, content: content, item_attributes: { id: id,media_type: media_type,fallback: fallback,properties: properties,media_overlay: media_overlay,toc_text: toc_text,property: property }, attributes: attributes, ordered: false) end # same as add_item, but the item will be added to spine of the EPUB. def add_ordered_item(href, deprecated_content = nil, deprecated_id = nil, deprecated_attributes = nil, content:nil, - id: nil,media_type: nil,fallback: nil,properties: nil,media_overlay: nil,toc_text: nil, + id: nil,media_type: nil,fallback: nil,properties: nil,media_overlay: nil,toc_text: nil,property: nil, attributes: {}) content, id, attributes = handle_deprecated_add_item_arguments(deprecated_content, deprecated_id, deprecated_attributes, content, id, attributes) - add_item_internal(href, content: content, item_attributes: { id: id,media_type: media_type,fallback: fallback,properties: properties,media_overlay: media_overlay,toc_text: toc_text }, attributes: attributes, ordered: true) + add_item_internal(href, content: content, item_attributes: { id: id,media_type: media_type,fallback: fallback,properties: properties,media_overlay: media_overlay,toc_text: toc_text,property: property }, attributes: attributes, ordered: true) end end end diff --git a/spec/book_spec.rb b/spec/book_spec.rb index 97ed0d5..9f11a21 100644 --- a/spec/book_spec.rb +++ b/spec/book_spec.rb @@ -272,8 +272,95 @@ end end describe 'add_item' do + it 'adds item with media type' do + book = GEPUB::Book.new + book.add_item 'chap3.xml', content: nil, media_type: 'application/docbook+xml' + expect(book.items.size).to eq 1 + end + + it 'adds item with fallback' do + book = GEPUB::Book.new + xhtml_item = book.add_item 'chap3.xhtml' + docbook_item = book.add_item 'chap3.xml', content: nil, media_type: 'application/docbook+xml', fallback: xhtml_item.id + expect(docbook_item.fallback).to eq xhtml_item.id + expect(book.items.size).to eq 2 + end + + it 'add item with toc text' do + book = GEPUB::Book.new + book.add_item 'chap3.xhtml', toc_text: 'chapter 3' + expect(book.instance_eval { @toc[0][:text] } ).to eq 'chapter 3' + expect(book.items.size).to eq 1 + end + + it 'add item with properties' do + book = GEPUB::Book.new + item = book.add_item 'chap3.xhtml', properties: ['page-spread-right'] + expect(item.properties.size).to eq 1 + expect(item.properties[0]).to eq 'page-spread-right' + expect(book.items.size).to eq 1 + end + + it 'add item with property' do + book = GEPUB::Book.new + item = book.add_item 'chap3.xhtml', property: 'page-spread-right' + expect(item.properties.size).to eq 1 + expect(item.properties[0]).to eq 'page-spread-right' + expect(book.items.size).to eq 1 + end + + it 'add item with media_overlay' do + book = GEPUB::Book.new + item = book.add_item 'chap3.xhtml', media_overlay: 'id-for-media-overlay' + expect(item.media_overlay).to eq 'id-for-media-overlay' + expect(book.items.size).to eq 1 + end end describe 'add_ordered_item' do + it 'adds ordered item with media type' do + book = GEPUB::Book.new + book.add_ordered_item 'chap3.xml', content: nil, media_type: 'application/docbook+xml' + expect(book.items.size).to eq 1 + end + + it 'adds ordered_item with fallback' do + book = GEPUB::Book.new + xhtml_item = book.add_item 'chap3.xhtml' + docbook_item = book.add_ordered_item 'chap3.xml', content: nil, media_type: 'application/docbook+xml', fallback: xhtml_item.id + expect(docbook_item.fallback).to eq xhtml_item.id + expect(book.items.size).to eq 2 + end + + it 'add ordered item with toc text' do + book = GEPUB::Book.new + book.add_ordered_item 'chap3.xhtml', toc_text: 'chapter 3' + expect(book.instance_eval { @toc[0][:text] } ).to eq 'chapter 3' + expect(book.items.size).to eq 1 + end + + it 'add ordered item with properties' do + book = GEPUB::Book.new + item = book.add_ordered_item 'chap3.xhtml', properties: ['page-spread-right'] + expect(item.properties.size).to eq 1 + expect(item.properties[0]).to eq 'page-spread-right' + expect(book.items.size).to eq 1 + end + + it 'add item with property' do + book = GEPUB::Book.new + item = book.add_ordered_item 'chap3.xhtml', property: 'page-spread-right' + expect(item.properties.size).to eq 1 + expect(item.properties[0]).to eq 'page-spread-right' + expect(book.items.size).to eq 1 + end + + + it 'add ordered_item with media_overlay' do + book = GEPUB::Book.new + item = book.add_ordered_item 'chap3.xhtml', media_overlay: 'id-for-media-overlay' + expect(item.media_overlay).to eq 'id-for-media-overlay' + expect(book.items.size).to eq 1 + end end describe 'ordered' do end diff --git a/tools/generate_function.rb b/tools/generate_function.rb index e5205bf..28ff117 100644 --- a/tools/generate_function.rb +++ b/tools/generate_function.rb @@ -4,7 +4,8 @@ end.map do |attr| attr.sub('-', '_') end -attrs << "toc_text" +attrs << "toc_text" +attrs << "property" attrs_arguments_string = attrs.map { |attr| "#{attr}: nil" }.join(',') attrs_internal_string = "{ " + attrs.map { |attr| "#{attr}: #{attr}"}.join(',') + " }" File.write(File.join(File.dirname(__FILE__), "../lib/gepub/book_add_item.rb"), <