Class: CBETA
- Inherits:
-
Object
- Object
- CBETA
- Defined in:
- lib/cbeta.rb
Defined Under Namespace
Classes: BMToText, Canon, CharCount, CharFrequency, Gaiji, HTMLToPDF, HTMLToText, P5aToHTML, P5aToHTMLForEveryEdition, P5aToHTMLForPDF, P5aToSimpleHTML, P5aToText, P5aValidator, UnicodeService, XMLDocument
Constant Summary collapse
- CANON =
'CC|DA|GA|GB|LC|TX|ZS|ZW|[A-Z]'
- SORT_ORDER =
%w(T X A K S F C D U P J L G M N ZS I ZW B GA GB Y LC TX CC)
- VOL3 =
%w[A CC C G GA GB L M P U]
- DATA =
File.join(File.dirname(__FILE__), 'data')
- PUNCS =
',.()[] 。‧.,、;?!:︰/()「」『』《》<>〈〉〔〕[]【】〖〗〃…—─ ~│┬▆△*+-='
Class Method Summary collapse
-
.get_canon_from_vol(vol) ⇒ String
由 冊號 取得 藏經 ID.
-
.get_canon_id_from_linehead(linehead) ⇒ String
由 行首資訊 取得 藏經 ID.
-
.get_canon_id_from_work_id(work) ⇒ String
由 典籍編號 取得 藏經 ID.
-
.get_linehead(file_basename, lb) ⇒ String
CBETA 行首資訊,例如 “T01n0001_p0001a01” 或 “T25n1510ap0757b29”.
-
.get_sort_order_from_canon_id(canon) ⇒ String
由「藏經 ID」取得「排序用編號」,例如:傳入 “T” 回傳 “A”;傳入 “X” 回傳 “B”.
-
.get_work_id_from_file_basename(fn) ⇒ String
由 XML檔主檔名 取得 典籍編號.
-
.get_xml_file_from_vol_and_work(vol, work) ⇒ String
由 冊號 及 典籍編號 取得 XML 主檔名.
-
.linehead_to_s(linehead) ⇒ String
將行首資訊轉為引用格式.
-
.linehead_to_xml_file_path(linehead) ⇒ String
由 行首資訊 取得 XML檔相對路徑.
- .normalize_vol(vol) ⇒ Object
- .open_xml(fn) ⇒ Object
-
.pua(gid) ⇒ Object
傳入 缺字碼,傳回 Unicode PUA 字元.
-
.ranjana_pua(gid) ⇒ Object
傳入 蘭札體 缺字碼,傳回 Unicode PUA 字元.
-
.siddham_pua(gid) ⇒ Object
傳入 悉曇字 缺字碼,傳回 Unicode PUA 字元.
Instance Method Summary collapse
-
#get_canon_abbr(id) ⇒ String
取得藏經略名.
-
#get_canon_nickname(id) ⇒ String
藏經短名,例如 “大正藏”.
-
#get_canon_symbol(id) ⇒ String
取得藏經略符.
-
#get_category(book_id) ⇒ String
傳入經號,取得部類.
-
#initialize ⇒ CBETA
constructor
載入藏經資料.
Constructor Details
#initialize ⇒ CBETA
載入藏經資料
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
# File 'lib/cbeta.rb', line 158 def initialize() @canon_abbr = {} @canon_nickname = {} fn = File.join(File.dirname(__FILE__), 'data/canons.csv') CSV.foreach(fn, :headers => true, encoding: 'utf-8') do |row| id = row['id'] unless row['nickname'].nil? @canon_nickname[id] = row['nickname'] end next if row['abbreviation'].nil? next if row['abbreviation'].empty? @canon_abbr[id] = row['abbreviation'] end fn = File.join(File.dirname(__FILE__), 'data/categories.json') s = File.read(fn) @categories = JSON.parse(s) end |
Class Method Details
.get_canon_from_vol(vol) ⇒ String
由 冊號 取得 藏經 ID
32 33 34 |
# File 'lib/cbeta.rb', line 32 def self.get_canon_from_vol(vol) vol.sub(/^(#{CANON}).*$/, '\1') end |
.get_canon_id_from_linehead(linehead) ⇒ String
由 行首資訊 取得 藏經 ID
18 19 20 |
# File 'lib/cbeta.rb', line 18 def self.get_canon_id_from_linehead(linehead) linehead.sub(/^(#{CANON}).*$/, '\1') end |
.get_canon_id_from_work_id(work) ⇒ String
由 典籍編號 取得 藏經 ID
25 26 27 |
# File 'lib/cbeta.rb', line 25 def self.get_canon_id_from_work_id(work) work.sub(/^(#{CANON}).*$/, '\1') end |
.get_linehead(file_basename, lb) ⇒ String
Returns CBETA 行首資訊,例如 “T01n0001_p0001a01” 或 “T25n1510ap0757b29”.
39 40 41 42 43 44 45 46 47 48 |
# File 'lib/cbeta.rb', line 39 def self.get_linehead(file_basename, lb) if file_basename.match(/^(T\d\dn0220)/) r = $1 else r = file_basename end r += '_' if r.match(/\d$/) r += 'p' + lb r end |
.get_sort_order_from_canon_id(canon) ⇒ String
由「藏經 ID」取得「排序用編號」,例如:傳入 “T” 回傳 “A”;傳入 “X” 回傳 “B”
84 85 86 87 88 89 90 91 92 93 |
# File 'lib/cbeta.rb', line 84 def self.get_sort_order_from_canon_id(canon) # CBETA 提供,惠敏法師最後決定的全文檢索順序表, 2016-06-03 i = SORT_ORDER.index(canon) if i.nil? puts "unknown canon id: #{canon}" return nil end (i + 'A'.ord).chr end |
.get_work_id_from_file_basename(fn) ⇒ String
由 XML檔主檔名 取得 典籍編號
75 76 77 78 79 |
# File 'lib/cbeta.rb', line 75 def self.get_work_id_from_file_basename(fn) r = fn.sub(/^(#{CANON})\d{2,3}n(.*)$/, '\1\2') r = 'T0220' if r.start_with? 'T0220' r end |
.get_xml_file_from_vol_and_work(vol, work) ⇒ String
由 冊號 及 典籍編號 取得 XML 主檔名
54 55 56 |
# File 'lib/cbeta.rb', line 54 def self.get_xml_file_from_vol_and_work(vol, work) vol + 'n' + work.sub(/^(#{CANON})(.*)$/, '\2') end |
.linehead_to_s(linehead) ⇒ String
將行首資訊轉為引用格式
103 104 105 106 107 108 |
# File 'lib/cbeta.rb', line 103 def self.linehead_to_s(linehead) linehead.match(/^((?:#{CANON})\d+)n(.*)_p(\d+)([a-z]\d+)$/) { return "#{$1}, no. #{$2}, p. #{$3}, #{$4}" } nil end |
.linehead_to_xml_file_path(linehead) ⇒ String
由 行首資訊 取得 XML檔相對路徑
62 63 64 65 66 67 68 69 70 |
# File 'lib/cbeta.rb', line 62 def self.linehead_to_xml_file_path(linehead) # 經號: 四碼數字 + 英文字母 或如 嘉興藏 英文字母 + 三碼數字 w = '(?:\d+[a-zA-Z]?|[AB]\d{3})' if m = linehead.match(/^(?<work>(?<vol>(?<canon>#{CANON})\d+)n#{w}).*$/) File.join(m[:canon], m[:vol], m[:work]+'.xml') else nil end end |
.normalize_vol(vol) ⇒ Object
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/cbeta.rb', line 110 def self.normalize_vol(vol) if vol.match(/^(#{CANON})(.*)$/) canon = $1 vol = $2 if VOL3.include? canon # 這些藏經的冊號是三碼 vol_len = 3 else vol_len = 2 end canon + vol.rjust(vol_len, '0') else abort "unknown vol format: #{vol}" end end |
.open_xml(fn) ⇒ Object
127 128 129 130 131 132 |
# File 'lib/cbeta.rb', line 127 def self.open_xml(fn) s = File.read(fn) doc = Nokogiri::XML(s) doc.remove_namespaces!() doc end |
.pua(gid) ⇒ Object
傳入 缺字碼,傳回 Unicode PUA 字元
135 136 137 138 139 140 141 142 143 |
# File 'lib/cbeta.rb', line 135 def self.pua(gid) if gid.start_with? 'SD' siddham_pua(gid) elsif gid.start_with? 'RJ' ranjana_pua(gid) else [0xf0000 + gid[2..-1].to_i].pack 'U' end end |
.ranjana_pua(gid) ⇒ Object
傳入 蘭札體 缺字碼,傳回 Unicode PUA 字元
146 147 148 149 |
# File 'lib/cbeta.rb', line 146 def self.ranjana_pua(gid) i = 0x100000 + gid[-4..-1].hex [i].pack("U") end |
.siddham_pua(gid) ⇒ Object
傳入 悉曇字 缺字碼,傳回 Unicode PUA 字元
152 153 154 155 |
# File 'lib/cbeta.rb', line 152 def self.siddham_pua(gid) i = 0xFA000 + gid[-4..-1].hex [i].pack("U") end |
Instance Method Details
#get_canon_abbr(id) ⇒ String
取得藏經略名
205 206 207 208 209 |
# File 'lib/cbeta.rb', line 205 def get_canon_abbr(id) r = get_canon_symbol(id) return nil if r.nil? r.sub(/^【(.*?)】$/, '\1') end |
#get_canon_nickname(id) ⇒ String
Returns 藏經短名,例如 “大正藏”.
179 180 181 182 |
# File 'lib/cbeta.rb', line 179 def get_canon_nickname(id) return nil unless @canon_nickname.key? id @canon_nickname[id] end |
#get_canon_symbol(id) ⇒ String
取得藏經略符
192 193 194 195 |
# File 'lib/cbeta.rb', line 192 def get_canon_symbol(id) return nil unless @canon_abbr.key? id @canon_abbr[id] end |
#get_category(book_id) ⇒ String
傳入經號,取得部類
218 219 220 |
# File 'lib/cbeta.rb', line 218 def get_category(book_id) @categories[book_id] end |