enju_ndl 0.0.3

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.
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2011 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = EnjuNdl
2
+
3
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'EnjuNdl'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+ Bundler::GemHelper.install_tasks
27
+
28
+ require 'rspec/core'
29
+ require 'rspec/core/rake_task'
30
+
31
+ RSpec::Core::RakeTask.new(:spec) do |spec|
32
+ spec.pattern = FileList['spec/**/*_spec.rb']
33
+ end
34
+
35
+ task :default => :spec
@@ -0,0 +1,38 @@
1
+ class NdlBooksController < ApplicationController
2
+ before_filter :authenticate_user!
3
+ before_filter :check_librarian
4
+
5
+ def index
6
+ if params[:page].to_i == 0
7
+ page = 1
8
+ else
9
+ page = params[:page]
10
+ end
11
+ @query = params[:query].to_s.strip
12
+ books = NdlBook.search(params[:query], page)
13
+ @books = WillPaginate::Collection.create(page, NdlBook.per_page, books[:total_entries]) do |pager|
14
+ pager.replace books[:items]
15
+ end
16
+ end
17
+
18
+ def create
19
+ if params[:book]
20
+ @manifestation = NdlBook.import_from_sru_response(params[:book][:nbn])
21
+ if @manifestation
22
+ flash[:notice] = t('controller.successfully_created', :model => t('activerecord.models.manifestation'))
23
+ flash[:porta_import] == true
24
+ redirect_to manifestation_items_url(@manifestation)
25
+ else
26
+ flash[:notice] = t('page.record_not_found')
27
+ redirect_to ndl_books_url
28
+ end
29
+ end
30
+ end
31
+
32
+ private
33
+ def check_librarian
34
+ unless current_user.try(:has_role?, 'Librarian')
35
+ access_denied
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,11 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module NdlBooksHelper
3
+ def link_to_import(nbn)
4
+ manifestation = Manifestation.where(:nbn => nbn).first
5
+ unless manifestation
6
+ link_to '追加', ndl_books_path(:book => {:nbn => nbn}), :method => :post
7
+ else
8
+ '登録済み'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,87 @@
1
+ # -*- encoding: utf-8 -*-
2
+ class NdlBook
3
+ def self.search(query, page = 1, per_page = self.per_page)
4
+ if query
5
+ cnt = self.per_page
6
+ page = 1 if page.to_i < 1
7
+ idx = (page.to_i - 1) * cnt + 1
8
+ url = "http://api.porta.ndl.go.jp/servicedp/opensearch?dpid=zomoku&any=#{URI.encode(query.strip)}&cnt=#{cnt}&idx=#{idx}"
9
+ Rails.logger.debug url
10
+ xml = open(url).read
11
+ doc = Nokogiri::XML(xml)
12
+ items = doc.xpath('//channel/item')
13
+ total_entries = doc.at('//channel/openSearch:totalResults').content.to_i
14
+ {:items => items, :total_entries => total_entries}
15
+ else
16
+ {:items => [], :total_entries => 0}
17
+ end
18
+ end
19
+
20
+ def self.per_page
21
+ 10
22
+ end
23
+
24
+ def self.find_by_isbn(isbn)
25
+ url = "http://api.porta.ndl.go.jp/servicedp/opensearch?dpid=zomoku&isbn=#{isbn}&cnt=1&idx=1"
26
+ Rails.logger.debug url
27
+ xml = open(url).read
28
+ doc = Nokogiri::XML(xml).at('//channel/item')
29
+ {
30
+ :title => doc.at('./title').content,
31
+ :publisher => doc.xpath('./dc:publisher').collect(&:content).join(' '),
32
+ :creator => doc.xpath('./dc:creator[@xsi:type="dcndl:NDLNH"]').collect(&:content).join(' '),
33
+ :isbn => doc.at('./dc:identifier[@xsi:type="dcndl:ISBN"]').try(:content).to_s
34
+ }
35
+ end
36
+
37
+ def self.import_from_sru_response(jpno)
38
+ manifestation = Manifestation.where(:nbn => jpno).first
39
+ return if manifestation
40
+ response = Nokogiri::XML(open("http://api.porta.ndl.go.jp/servicedp/SRUDp?operation=searchRetrive&maximumRecords=10&recordSchema=dcndl_porta&query=%28jpno=#{jpno}%29")).at('//xmlns:recordData', 'xmlns' => "http://www.loc.gov/zing/srw/")
41
+ return unless response.content
42
+ doc = Nokogiri::XML(response.content)
43
+ title = {
44
+ :manifestation => doc.xpath('//dc:title').collect(&:content).join(' ').tr('a-zA-Z0-9 ', 'a-zA-Z0-9 ').squeeze(' '),
45
+ :transcription => doc.xpath('//dcndl:titleTranscription').collect(&:content).join(' ').tr('a-zA-Z0-9 ', 'a-zA-Z0-9 ').squeeze(' '),
46
+ :original => doc.xpath('//dcterms:alternative').collect(&:content).join(' ').tr('a-zA-Z0-9 ', 'a-zA-Z0-9 ').squeeze(' ')
47
+ }
48
+ lang = doc.at('//dc:language[@xsi:type="dcterms:ISO639-2"]').try(:content)
49
+ creators = []
50
+ doc.xpath('//dc:creator[@xsi:type="dcndl:NDLNH"]').each do |creator|
51
+ creators << creator.content.tr('a-zA-Z0-9 ‖', 'a-zA-Z0-9 ')
52
+ end
53
+ publishers = []
54
+ doc.xpath('//dc:publisher').each do |publisher|
55
+ publishers << publisher.content.tr('a-zA-Z0-9 ‖', 'a-zA-Z0-9 ')
56
+ end
57
+ pub_date = doc.at('//dcterms:issued').content.try(:tr, '0-9.', '0-9-').to_s.gsub(/(.*)/, '')
58
+ unless pub_date =~ /^\d+(-\d{0,2}){0,2}$/
59
+ pub_date = nil
60
+ end
61
+
62
+ Manifestation.transaction do
63
+ language = Language.where(:iso_639_2 => lang.downcase).first if lang
64
+ manifestation = Manifestation.new(
65
+ :original_title => title[:manifestation],
66
+ :title_transcription => title[:title_transcription],
67
+ :title_alternative => title[:original],
68
+ :pub_date => pub_date,
69
+ :isbn => doc.at('//dc:identifier[@xsi:type="dcndl:ISBN"]').try(:content),
70
+ :nbn => doc.at('//dc:identifier[@xsi:type="dcndl:JPNO"]').content,
71
+ :ndc => doc.at('//dc:subject[@xsi:type="dcndl:NDC"]').try(:content).try(:tr, '0-9.', '0-9.').to_s.gsub(/(.*)/, '')
72
+ )
73
+ manifestation.language = language if language
74
+ patron_creators = Patron.import_patrons(creators.zip([]).map{|f,t| {:full_name => f, :full_name_transcription => t}}).uniq
75
+ patron_publishers = Patron.import_patrons(publishers.zip([]).map{|f,t| {:full_name => f, :full_name_transcription => t}}).uniq
76
+ manifestation.creators << patron_creators
77
+ manifestation.publishers << patron_publishers
78
+ manifestation.save!
79
+ end
80
+ manifestation
81
+ end
82
+
83
+ attr_accessor :url
84
+
85
+ class AlreadyImported < StandardError
86
+ end
87
+ end
@@ -0,0 +1,23 @@
1
+ <!DOCTYPE html>
2
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%= @locale.to_s -%>" lang="<%= @locale.to_s -%>">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <%= render 'page/include' %>
6
+ <%= render 'page/portlets' %>
7
+ <title><%= t('enju_ndl.import_from_porta') %></title>
8
+ </head>
9
+ <body itemscope itemtype="http://schema.org/WebPage">
10
+
11
+ <%= render 'page/header' %>
12
+ <%= render 'page/menu' %>
13
+
14
+ <div id="content">
15
+
16
+ <%= yield %>
17
+
18
+ </div>
19
+
20
+ <%= render 'page/footer' %>
21
+
22
+ </body>
23
+ </html>
@@ -0,0 +1,48 @@
1
+ <div id="content_detail" class="ui-corner-all">
2
+ <h1 class="title">PORTA検索によるインポート</h1>
3
+ <div id="content_list">
4
+ <p id="notice"><%= notice %></p>
5
+
6
+ <%= form_for :books, :url => ndl_books_path, :html => {:method => 'get'} do -%>
7
+ <p>
8
+ <%= text_field_tag 'query', h(@query), {:id => 'search_form_top', :class => 'search_form'} -%>
9
+ <%= submit_tag '検索' -%>
10
+ </p>
11
+ <%- end -%>
12
+
13
+ <% if @query.present? %>
14
+ <p><%= @books.total_entries %> 件が見つかりました。</p>
15
+
16
+ <table class="index">
17
+ <tr>
18
+ <th></th>
19
+ <th>書名</th>
20
+ </tr>
21
+ <% @books.each do |book| %>
22
+ <tr class="line<%= cycle("0", "1") -%>">
23
+ <td>
24
+ <%= link_to_import(book.at('./dc:identifier[@xsi:type="dcndl:JPNO"]').try(:content).to_s) %>
25
+ </td>
26
+ <td>
27
+ <%= link_to book.at('./title').content, book.at('./link').content %>
28
+ <br />
29
+ <%= book.xpath('./dc:creator[@xsi:type="dcndl:NDLNH"]').collect(&:content).join(' ') %>
30
+ <%= book.xpath('./dc:publisher').collect(&:content).join(' ') %>
31
+ ISBN: <%= book.at('./dc:identifier[@xsi:type="dcndl:ISBN"]').try(:content).to_s %>
32
+ </td>
33
+ </tr>
34
+ <% end %>
35
+ </table>
36
+
37
+ <br />
38
+
39
+ <%= will_paginate(@books) %>
40
+ <% else %>
41
+ <%= javascript_tag("$('#search_form_top').focus()") -%>
42
+ <% end %>
43
+
44
+ </div>
45
+ </div>
46
+
47
+ <div id="submenu" class="ui-corner-all">
48
+ </div>
@@ -0,0 +1,3 @@
1
+ en:
2
+ enju_ndl:
3
+ import_from_porta: Import from PORTA
@@ -0,0 +1,3 @@
1
+ ja:
2
+ enju_ndl:
3
+ import_from_porta: PORTA検索によるインポート
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ resources :ndl_books, :only => [:index, :create]
3
+ end
@@ -0,0 +1,67 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module EnjuNdl
3
+ module Crd
4
+ def self.included(base)
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ def get_crd_response(options)
10
+ params = {:query_logic => 1, :results_num => 1, :results_num => 200, :sort => 10}.merge(options)
11
+ query = []
12
+ query << "01_#{params[:query_01].to_s.gsub(' ', ' ')}" if params[:query_01]
13
+ query << "02_#{params[:query_02].to_s.gsub(' ', ' ')}" if params[:query_02]
14
+ delimiter = '.'
15
+ url = "http://crd.ndl.go.jp/refapi/servlet/refapi.RSearchAPI?query=#{URI.escape(query.join(delimiter))}&query_logic=#{params[:query_logic]}&results_get_position=#{params[:results_get_position]}&results_num=#{params[:results_num]}&sort=#{params[:sort]}"
16
+
17
+ xml = open(url).read.to_s
18
+ end
19
+
20
+ def search_crd(options)
21
+ params = {:page => 1}.merge(options)
22
+ crd_page = params[:page].to_i
23
+ crd_page = 1 if crd_page <= 0
24
+ crd_startrecord = (crd_page - 1) * Question.crd_per_page + 1
25
+ params[:results_get_position] = crd_startrecord
26
+ params[:results_num] = Question.crd_per_page
27
+
28
+ xml = get_crd_response(params)
29
+ doc = Nokogiri::XML(xml)
30
+
31
+ response = {
32
+ :results_num => doc.at('//xmlns:hit_num').try(:content).to_i,
33
+ :results => []
34
+ }
35
+ doc.xpath('//xmlns:result').each do |result|
36
+ set = {
37
+ :question => result.at('QUESTION').try(:content),
38
+ :reg_id => result.at('REG-ID').try(:content),
39
+ :answer => result.at('ANSWER').try(:content),
40
+ :crt_date => result.at('CRT-DATE').try(:content),
41
+ :solution => result.at('SOLUTION').try(:content),
42
+ :lib_id => result.at('LIB-ID').try(:content),
43
+ :lib_name => result.at('LIB-NAME').try(:content),
44
+ :url => result.at('URL').try(:content),
45
+ :ndc => result.at('NDC').try(:content)
46
+ }
47
+ begin
48
+ set[:keyword] = result.xpath('xmlns:KEYWORD').collect(&:content)
49
+ rescue NoMethodError
50
+ set[:keyword] = []
51
+ end
52
+ response[:results] << set
53
+ end
54
+
55
+ crd_count = response[:results_num]
56
+ if crd_count > 1000
57
+ crd_total_count = 1000
58
+ else
59
+ crd_total_count = crd_count
60
+ end
61
+
62
+ resources = response[:results]
63
+ crd_results = WillPaginate::Collection.create(crd_page, Question.crd_per_page, crd_total_count) do |pager| pager.replace(resources) end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,4 @@
1
+ module EnjuNdl
2
+ class Engine < Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,48 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module EnjuNdl
3
+ module NdlSearch
4
+ def self.included(base)
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ def rss_import(url)
10
+ doc = Nokogiri::XML(open(url))
11
+ ns = {"dc" => "http://purl.org/dc/elements/1.1/", "xsi" => "http://www.w3.org/2001/XMLSchema-instance", "dcndl" => "http://ndl.go.jp/dcndl/terms/"}
12
+ doc.xpath('//item', ns).each do |item|
13
+ isbn = item.at('./dc:identifier[@xsi:type="dcndl:ISBN"]').try(:content)
14
+ ndl_bib_id = item.at('./dc:identifier[@xsi:type="dcndl:NDLBibID"]').try(:content)
15
+ manifestation = Manifestation.where(:ndl_bib_id => ndl_bib_id).first
16
+ manifestation = Manifestation.find_by_isbn(isbn) unless manifestation
17
+ # FIXME: 日本語決めうち?
18
+ language_id = Language.where(:iso_639_2 => 'jpn').first.id rescue 1
19
+ unless manifestation
20
+ manifestation = self.new(
21
+ :original_title => item.at('./dc:title').content,
22
+ :title_transcription => item.at('./dcndl:titleTranscription').try(:content),
23
+ :isbn => isbn,
24
+ :ndl_bib_id => ndl_bib_id,
25
+ :description => item.at('./dc:description').try(:content),
26
+ :pub_date => item.at('./dc:date').try(:content).try(:gsub, '.', '-'),
27
+ :language_id => language_id
28
+ )
29
+ if manifestation.valid?
30
+ item.xpath('./dc:creator').each_with_index do |creator, i|
31
+ next if i == 0
32
+ patron = Patron.where(:full_name => creator.try(:content)).first
33
+ patron = Patron.new(:full_name => creator.try(:content)) unless patron
34
+ manifestation.creators << patron if patron.valid?
35
+ end
36
+ item.xpath('./dc:publisher').each_with_index do |publisher, i|
37
+ patron = Patron.where(:full_name => publisher.try(:content)).first
38
+ patron = Patron.new(:full_name => publisher.try(:content)) unless patron
39
+ manifestation.publishers << patron if patron.valid?
40
+ end
41
+ end
42
+ end
43
+ end
44
+ Sunspot.commit
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,165 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module EnjuNdl
3
+ module Porta
4
+ def self.included(base)
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ def import_isbn(isbn)
10
+ isbn = ISBN_Tools.cleanup(isbn)
11
+ raise EnjuNdl::InvalidIsbn unless ISBN_Tools.is_valid?(isbn)
12
+
13
+ manifestation = Manifestation.find_by_isbn(isbn)
14
+ return manifestation if manifestation
15
+
16
+ doc = return_xml(isbn)
17
+ raise EnjuNdl::RecordNotFound if doc.at('//openSearch:totalResults').content.to_i == 0
18
+
19
+ pub_date, language, nbn = nil, nil, nil
20
+
21
+ publishers = get_publishers(doc).zip([]).map{|f,t| {:full_name => f, :full_name_transcription => t}}
22
+
23
+ # title
24
+ title = get_title(doc)
25
+
26
+ # date of publication
27
+ pub_date = doc.at('//dcterms:issued').content.try(:tr, '0-9.', '0-9-').to_s.gsub(/(.*)/, '')
28
+ unless pub_date =~ /^\d+(-\d{0,2}){0,2}$/
29
+ pub_date = nil
30
+ end
31
+
32
+ language = get_language(doc)
33
+ nbn = doc.at('//dc:identifier[@xsi:type="dcndl:JPNO"]').content
34
+ ndc = doc.at('//dc:subject[@xsi:type="dcndl:NDC"]').try(:content)
35
+
36
+ Patron.transaction do
37
+ publisher_patrons = Patron.import_patrons(publishers)
38
+ language_id = Language.where(:iso_639_2 => language).first.id rescue 1
39
+
40
+ manifestation = Manifestation.new(
41
+ :original_title => title[:manifestation],
42
+ :title_transcription => title[:transcription],
43
+ # TODO: PORTAに入っている図書以外の資料を調べる
44
+ #:carrier_type_id => CarrierType.where(:name => 'print').first.id,
45
+ :language_id => language_id,
46
+ :isbn => isbn,
47
+ :pub_date => pub_date,
48
+ :nbn => nbn,
49
+ :ndc => ndc
50
+ )
51
+ manifestation.ndc = ndc
52
+ manifestation.publishers << publisher_patrons
53
+ end
54
+
55
+ #manifestation.send_later(:create_frbr_instance, doc.to_s)
56
+ create_frbr_instance(doc, manifestation)
57
+ return manifestation
58
+ end
59
+
60
+ def import_isbn!(isbn)
61
+ manifestation = import_isbn(isbn)
62
+ manifestation.save!
63
+ manifestation
64
+ end
65
+
66
+ def create_frbr_instance(doc, manifestation)
67
+ title = get_title(doc)
68
+ creators = get_creators(doc).zip([]).map{|f,t| {:full_name => f, :full_name_transcription => t}}
69
+ language = get_language(doc)
70
+ subjects = get_subjects(doc)
71
+
72
+ Patron.transaction do
73
+ creator_patrons = Patron.import_patrons(creators)
74
+ language_id = Language.where(:iso_639_2 => language).first.id rescue 1
75
+ content_type_id = ContentType.where(:name => 'text').first.id rescue 1
76
+ manifestation.creators << creator_patrons
77
+ if defined?(Subject)
78
+ subjects.each do |term|
79
+ subject = Subject.where(:term => term).first
80
+ manifestation.subjects << subject if subject
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ def search_porta(query, options = {})
87
+ options = {:item => 'any', :startrecord => 1, :per_page => 10, :raw => false}.merge(options)
88
+ doc = nil
89
+ results = {}
90
+ startrecord = options[:startrecord].to_i
91
+ if startrecord == 0
92
+ startrecord = 1
93
+ end
94
+ url = "http://api.porta.ndl.go.jp/servicedp/opensearch?dpid=#{options[:dpid]}&#{options[:item]}=#{URI.escape(query)}&cnt=#{options[:per_page]}&idx=#{startrecord}"
95
+ if options[:raw] == true
96
+ open(url).read
97
+ else
98
+ RSS::Rss::Channel.install_text_element("openSearch:totalResults", "http://a9.com/-/spec/opensearchrss/1.0/", "?", "totalResults", :text, "openSearch:totalResults")
99
+ RSS::BaseListener.install_get_text_element "http://a9.com/-/spec/opensearchrss/1.0/", "totalResults", "totalResults="
100
+ feed = RSS::Parser.parse(url, false)
101
+ end
102
+ end
103
+
104
+ def normalize_isbn(isbn)
105
+ if isbn.length == 10
106
+ ISBN_Tools.isbn10_to_isbn13(isbn)
107
+ else
108
+ ISBN_Tools.isbn13_to_isbn10(isbn)
109
+ end
110
+ end
111
+
112
+ def return_xml(isbn)
113
+ xml = self.search_porta(isbn, {:dpid => 'zomoku', :item => 'isbn', :raw => true}).to_s
114
+ doc = Nokogiri::XML(xml)
115
+ if doc.at('//openSearch:totalResults').content.to_i == 0
116
+ isbn = normalize_isbn(isbn)
117
+ xml = self.search_porta(isbn, {:dpid => 'zomoku', :item => 'isbn', :raw => true}).to_s
118
+ doc = Nokogiri::XML(xml)
119
+ end
120
+ doc
121
+ end
122
+
123
+ private
124
+ def get_title(doc)
125
+ title = {
126
+ :manifestation => doc.xpath('//item[1]/title').collect(&:content).join(' ').tr('a-zA-Z0-9 ', 'a-zA-Z0-9 ').squeeze(' '),
127
+ :transcription => doc.xpath('//item[1]/dcndl:titleTranscription').collect(&:content).join(' ').tr('a-zA-Z0-9 ', 'a-zA-Z0-9 ').squeeze(' '),
128
+ :original => doc.xpath('//dcterms:alternative').collect(&:content).join(' ').tr('a-zA-Z0-9 ', 'a-zA-Z0-9 ').squeeze(' ')
129
+ }
130
+ end
131
+
132
+ def get_creators(doc)
133
+ creators = []
134
+ doc.xpath('//item[1]/dc:creator[@xsi:type="dcndl:NDLNH"]').each do |creator|
135
+ creators << creator.content.gsub('‖', '').tr('a-zA-Z0-9 ', 'a-zA-Z0-9 ')
136
+ end
137
+ creators
138
+ end
139
+
140
+ def get_subjects(doc)
141
+ subjects = []
142
+ doc.xpath('//item[1]/dc:subject[@xsi:type="dcndl:NDLSH"]').each do |subject|
143
+ subjects << subject.content.tr('a-zA-Z0-9 ‖', 'a-zA-Z0-9 ')
144
+ end
145
+ return subjects
146
+ end
147
+
148
+ def get_language(doc)
149
+ # TODO: 言語が複数ある場合
150
+ language = doc.xpath('//item[1]/dc:language[@xsi:type="dcterms:ISO639-2"]').first.content.downcase
151
+ end
152
+
153
+ def get_publishers(doc)
154
+ publishers = []
155
+ doc.xpath('//item[1]/dc:publisher').each do |publisher|
156
+ publishers << publisher.content.tr('a-zA-Z0-9 ‖', 'a-zA-Z0-9 ')
157
+ end
158
+ return publishers
159
+ end
160
+ end
161
+
162
+ class AlreadyImported < StandardError
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,3 @@
1
+ module EnjuNdl
2
+ VERSION = "0.0.3"
3
+ end
data/lib/enju_ndl.rb ADDED
@@ -0,0 +1,36 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require "enju_ndl/engine"
3
+ require 'open-uri'
4
+ require 'enju_ndl/ndl_search'
5
+ require 'enju_ndl/crd'
6
+ require 'enju_ndl/porta'
7
+
8
+ module EnjuNdl
9
+ module ActsAsMethods
10
+ def self.included(base)
11
+ base.extend ClassMethods
12
+ end
13
+
14
+ module ClassMethods
15
+ def enju_ndl_search
16
+ include EnjuNdl::NdlSearch
17
+ end
18
+
19
+ def enju_ndl_crd
20
+ include EnjuNdl::Crd
21
+ end
22
+
23
+ def enju_ndl_porta
24
+ include EnjuNdl::Porta
25
+ end
26
+ end
27
+ end
28
+
29
+ class RecordNotFound < StandardError
30
+ end
31
+
32
+ class InvalidIsbn < StandardError
33
+ end
34
+ end
35
+
36
+ ActiveRecord::Base.send :include, EnjuNdl::ActsAsMethods
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :enju_ndl do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class EnjuNdlTest < ActiveSupport::TestCase
4
+ test "truth" do
5
+ assert_kind_of Module, EnjuNdl
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ # Configure Rails Environment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
+ require "rails/test_help"
6
+
7
+ Rails.backtrace_cleaner.remove_silencers!
8
+
9
+ # Load support files
10
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: enju_ndl
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kosuke Tanabe
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-12-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: &70201338394300 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 3.1.3
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70201338394300
25
+ - !ruby/object:Gem::Dependency
26
+ name: sqlite3
27
+ requirement: &70201338393660 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70201338393660
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec-rails
38
+ requirement: &70201338392740 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70201338392740
47
+ description: NDL WebAPI wrapper for Next-L Enju
48
+ email:
49
+ - tanabe@mwr.mediacom.keio.ac.jp
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - app/controllers/ndl_books_controller.rb
55
+ - app/helpers/ndl_books_helper.rb
56
+ - app/models/ndl_book.rb
57
+ - app/views/layouts/ndl_books.html.erb
58
+ - app/views/ndl_books/index.html.erb
59
+ - config/locales/en.yml
60
+ - config/locales/ja.yml
61
+ - config/routes.rb
62
+ - lib/enju_ndl/crd.rb
63
+ - lib/enju_ndl/engine.rb
64
+ - lib/enju_ndl/ndl_search.rb
65
+ - lib/enju_ndl/porta.rb
66
+ - lib/enju_ndl/version.rb
67
+ - lib/enju_ndl.rb
68
+ - lib/tasks/enju_ndl_tasks.rake
69
+ - MIT-LICENSE
70
+ - Rakefile
71
+ - README.rdoc
72
+ - test/enju_ndl_test.rb
73
+ - test/test_helper.rb
74
+ homepage: https://github.com/nabeta/enju_ndl
75
+ licenses: []
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements: []
93
+ rubyforge_project:
94
+ rubygems_version: 1.8.11
95
+ signing_key:
96
+ specification_version: 3
97
+ summary: enju_ndl plugin
98
+ test_files:
99
+ - test/enju_ndl_test.rb
100
+ - test/test_helper.rb
101
+ has_rdoc: