Class: UniProp::VersionMetaData
- Inherits:
-
Object
- Object
- UniProp::VersionMetaData
- Defined in:
- lib/uniprop/inspects.rb,
lib/uniprop/metadata_processor.rb
Instance Attribute Summary collapse
-
#raw_metadata ⇒ Object
readonly
Returns the value of attribute raw_metadata.
-
#version ⇒ Object
readonly
Returns the value of attribute version.
Instance Method Summary collapse
-
#actual_properties ⇒ Array<Property>
メタデータ内に含まれるプロパティを取得.
-
#actual_propfiles ⇒ Array<PropFile>
メタデータに記述のあるPropFileを取得.
- #find_propfile_metadata(propfile) ⇒ VersionMetaData
-
#find_raw_file_format(propfile) ⇒ Hash<String,Object>
メタデータに記述されているfile_formats内の記述を、加工せずそのまま取得.
-
#has_file_format?(propfile) ⇒ Boolean
結び付いているPropFileのフォーマットに関する情報がメタデータにあるかを判定.
- #has_propfile_metadata?(propfile) ⇒ Boolean
-
#initialize(version, raw_metadata) ⇒ VersionMetaData
constructor
A new instance of VersionMetaData.
- #inspect ⇒ Object
-
#property_missing_defs(property) ⇒ Array<MissingDef>
propertyのMissingDefオブジェクトを取得.
-
#property_names ⇒ Array<String>
メタデータに含まれるプロパティ名を取得.
-
#property_to_actual_positions ⇒ Hash<Property,Array<Position>>
メタデータを元に、各Propertyと、そのPositionを取得.
-
#property_to_actual_propfiles ⇒ Hash<Property,Set<PropFile>]
バージョンに属する各Propertyと、そのPropertyが実際に記述されているPropFileの関係のHashを取得.
- #propfile_metadatas ⇒ Array<PropFileMetaData>
-
#propfile_missing_defs(propfile) ⇒ Array<MissingDef>
fileのMissingDefオブジェクトを取得.
-
#propfile_names ⇒ Set<String>
メタデータに記述されているPropFileの名前を取得.
-
#propfile_to_actual_properties ⇒ Hash<PropFile,Array<Property>>
メタデータを元に、各PropFileと、それに含まれるPropertyを取得.
-
#unihan_file_names ⇒ Array<String>
versionに含まれるUnihanのファイル名を取得.
- #unihan_properties ⇒ Array<Property>
-
#unihan_property_names ⇒ Array<Property>
versionに含まれるUnihanのプロパティ名を取得.
- #version_metadata_validator ⇒ VersionMetaDataValidator
Constructor Details
#initialize(version, raw_metadata) ⇒ VersionMetaData
Returns a new instance of VersionMetaData.
73 74 75 76 |
# File 'lib/uniprop/metadata_processor.rb', line 73 def initialize(version, ) @version = version @raw_metadata = end |
Instance Attribute Details
#raw_metadata ⇒ Object (readonly)
Returns the value of attribute raw_metadata.
71 72 73 |
# File 'lib/uniprop/metadata_processor.rb', line 71 def @raw_metadata end |
#version ⇒ Object (readonly)
Returns the value of attribute version.
71 72 73 |
# File 'lib/uniprop/metadata_processor.rb', line 71 def version @version end |
Instance Method Details
#actual_properties ⇒ Array<Property>
メタデータ内に含まれるプロパティを取得
166 167 168 169 170 171 172 173 |
# File 'lib/uniprop/metadata_processor.rb', line 166 def actual_properties return @actual_properties if @actual_properties @actual_properties = propfile_to_actual_properties.values.flatten @actual_properties.concat(unihan_properties) @actual_properties end |
#actual_propfiles ⇒ Array<PropFile>
メタデータに記述のあるPropFileを取得
305 306 307 308 309 310 311 312 |
# File 'lib/uniprop/metadata_processor.rb', line 305 def actual_propfiles return @actual_propfiles if @actual_propfiles @actual_propfiles = [] propfile_names.each { @actual_propfiles<<version.find_file(_1) if version.has_file?(_1) } @actual_propfiles end |
#find_propfile_metadata(propfile) ⇒ VersionMetaData
364 365 366 367 368 369 370 371 372 |
# File 'lib/uniprop/metadata_processor.rb', line 364 def (propfile) = .find { _1.propfile==propfile } if return else raise MetaDataNotFoundError, "metadata for #{propfile} is not found." end end |
#find_raw_file_format(propfile) ⇒ Hash<String,Object>
メタデータに記述されているfile_formats内の記述を、加工せずそのまま取得
183 184 185 186 187 188 189 190 191 |
# File 'lib/uniprop/metadata_processor.rb', line 183 def find_raw_file_format(propfile) ["file_formats"].each do |file_format| if version.has_file?(file_format["file_name"]) f = version.find_file(file_format["file_name"]) return file_format if f==propfile end end raise(MetaDataNotFoundError, "Metadata for #{propfile.basename_prefix} is not found.") end |
#has_file_format?(propfile) ⇒ Boolean
結び付いているPropFileのフォーマットに関する情報がメタデータにあるかを判定
195 196 197 198 199 |
# File 'lib/uniprop/metadata_processor.rb', line 195 def has_file_format?(propfile) return !!find_raw_file_format(propfile) rescue return false end |
#has_propfile_metadata?(propfile) ⇒ Boolean
374 375 376 377 378 |
# File 'lib/uniprop/metadata_processor.rb', line 374 def (propfile) !!(propfile) rescue false end |
#inspect ⇒ Object
56 57 58 |
# File 'lib/uniprop/inspects.rb', line 56 def inspect "#<#{self.class.name} #{version.major}.#{version.minor}.#{version.tiny}>" end |
#property_missing_defs(property) ⇒ Array<MissingDef>
codepointによって複数のmissingが定義されている場合には返り値は複数のMissingDefオブジェクトになる
propertyのMissingDefオブジェクトを取得
275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/uniprop/metadata_processor.rb', line 275 def property_missing_defs(property) @property_to_missing_defs ||= {} return @property_to_missing_defs[property] if @property_to_missing_defs[property] # binaryプロパティのデフォルト値はFalse if property.property_value_type==:binary @property_to_missing_defs[property]=[MissingDef.new(CODEPOINT_RANGE,property,"False")] return @property_to_missing_defs[property] end # 最小限のファイルで動くよう、PropertyValueAliases.txtとプロパティが記述されているファイルのみからmissingの記述を探す # プロパティ記述ファイルとPropertyValueAliasesのうち、定義されているmissingの種類が最も多い値を返す search_files = property_to_actual_propfiles[property] search_files << version.property_value_aliases_file # 15.0.0のEastAsianWidth.txtとDerivedEastAsianWidth.txtのように、@missingから始まる定義の内容が異なる場合がある # ファイル内で定義される@missingの個数が最も多いファイルの定義を使用する search_files.each do |file| missing_defs = propfile_missing_defs(file).filter { _1.property==property } if !@property_to_missing_defs[property] || missing_defs.size > @property_to_missing_defs[property].size @property_to_missing_defs[property] = missing_defs end end @property_to_missing_defs[property] end |
#property_names ⇒ Array<String>
メタデータに含まれるプロパティ名を取得
152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/uniprop/metadata_processor.rb', line 152 def property_names return @property_names if @property_names @property_names = [] .each do || .raw_blocks.each { @property_names.concat(_1.content.flatten) } end @property_names.uniq! @property_names end |
#property_to_actual_positions ⇒ Hash<Property,Array<Position>>
メタデータを元に、各Propertyと、そのPositionを取得
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/uniprop/metadata_processor.rb', line 80 def property_to_actual_positions return @property_to_actual_positions if @property_to_actual_positions @property_to_actual_positions = {} actual_propfiles.each do |propfile| if (propfile) = (propfile) else next end .blocks.each_with_index do |block, block_no| block.content.each_with_index do |col, col_no| props = [] # この回のループのblock_no, col_noの箇所に存在するプロパティ if col.class==Array props.concat(col) else props << col end props.compact.uniq.each do |prop| @property_to_actual_positions[prop] ||= [] add_f = false # col_noをPositionオブジェクトに追加した時点でtrueに変更 # propfile, block_noが同じPositionが存在している場合、列を追加する (新しいPositionオブジェクトは生成しない) @property_to_actual_positions[prop].each do |position| if position.propfile==propfile && position.block==block_no position.columns << col_no add_f = true break end end if !add_f @property_to_actual_positions[prop] << Position.new(propfile, block.range, block_no, [col_no]) end end end end end @property_to_actual_positions end |
#property_to_actual_propfiles ⇒ Hash<Property,Set<PropFile>]
バージョンに属する各Propertyと、そのPropertyが実際に記述されているPropFileの関係のHashを取得
203 204 205 206 207 208 209 210 211 212 213 |
# File 'lib/uniprop/metadata_processor.rb', line 203 def property_to_actual_propfiles return @property_to_actual_propfiles if @property_to_actual_propfiles @property_to_actual_propfiles = Hash.new { |hash,key| hash[key]=Set.new } propfile_to_actual_properties.each do |propfile, actual_props| actual_props.each { @property_to_actual_propfiles[_1] << propfile } end @property_to_actual_propfiles end |
#propfile_metadatas ⇒ Array<PropFileMetaData>
325 326 327 328 329 330 331 332 |
# File 'lib/uniprop/metadata_processor.rb', line 325 def return @propfile_metadatas if @propfile_metadatas @propfile_metadatas = [] actual_propfiles.each { @propfile_metadatas<<PropFileMetaData.new(_1, find_raw_file_format(_1)) if has_file_format?(_1) } @propfile_metadatas end |
#propfile_missing_defs(propfile) ⇒ Array<MissingDef>
codepointによって複数のmissingが定義されている場合には返り値は複数のMissingDefオブジェクトになる
fileのMissingDefオブジェクトを取得
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 |
# File 'lib/uniprop/metadata_processor.rb', line 219 def propfile_missing_defs(propfile) @propfile_to_missing_defs ||= {} return @propfile_to_missing_defs[propfile] if @propfile_to_missing_defs[propfile] missing_defs = [] propfile.shaped_missing_value_lines.each do |shaped_missing_value_line| m = shaped_missing_value_line[0].match(/([0-9A-F]{4,6})\.\.([0-9A-F]{4,6})|([0-9A-F]{4,6})/) if m # cp..cpでマッチ if m && m[2] begin_cp = m[1].hex end_cp = m[2].hex # cpでマッチ elsif m && m[1] begin_cp = m[1].hex end_cp = m[1].hex end codepoint_range = Range.new(begin_cp, end_cp) # missingについて記述される行は、以下のどちらかの形式を取る # (1) @missing: codepoint; property; missing # (2) @missing: codepoint; missing # (1) の場合 if shaped_missing_value_line.size==3 property_name = shaped_missing_value_line[1] missing_value = shaped_missing_value_line[2] if version.has_property?(property_name) prop = version.find_property(property_name) missing_defs << MissingDef.new(codepoint_range, prop, missing_value) end # (2) の場合 # missingが記述されているファイルからPropertyを特定し使用 elsif shaped_missing_value_line.size==2 # ファイルに含まれるプロパティが1種類でない場合、プロパティを特定できない next if propfile_to_actual_properties[propfile].size!=1 missing_value = shaped_missing_value_line[1] prop = propfile_to_actual_properties[propfile].to_a[0] missing_defs << MissingDef.new(codepoint_range, prop, missing_value) end end end @propfile_to_missing_defs[propfile] = missing_defs @propfile_to_missing_defs[propfile] end |
#propfile_names ⇒ Set<String>
メタデータに記述されているPropFileの名前を取得
316 317 318 319 320 321 322 |
# File 'lib/uniprop/metadata_processor.rb', line 316 def propfile_names return @propfile_names if @propfile_names @propfile_names = ["file_formats"].map { _1["file_name"] }.to_a @propfile_names += unihan_file_names @propfile_names end |
#propfile_to_actual_properties ⇒ Hash<PropFile,Array<Property>>
メタデータを元に、各PropFileと、それに含まれるPropertyを取得
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/uniprop/metadata_processor.rb', line 128 def propfile_to_actual_properties return @propfile_to_actual_properties if @propfile_to_actual_properties @propfile_to_actual_properties = Hash.new { |hash,key| hash[key]=[] } actual_propfiles.each do |propfile| if (propfile) = (propfile) else next end .blocks.each do |block| block.content.flatten.each do |col_prop| # 一部ファイルではblockの中に配列が含まれるためflattenにする @propfile_to_actual_properties[propfile] << col_prop if version.has_property?(col_prop) end end end @propfile_to_actual_properties end |
#unihan_file_names ⇒ Array<String>
versionに含まれるUnihanのファイル名を取得
336 337 338 |
# File 'lib/uniprop/metadata_processor.rb', line 336 def unihan_file_names @unihan_file_names ||= ["unihan_files"].to_a end |
#unihan_properties ⇒ Array<Property>
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 |
# File 'lib/uniprop/metadata_processor.rb', line 347 def unihan_properties return @unihan_properties if @unihan_properties @unihan_properties = [] unihan_property_names.each do |prop_name| if version.has_property?(prop_name) prop = version.find_property(prop_name) else prop = UniProp::Property.new(version, prop_name) end @unihan_properties << prop end @unihan_properties end |
#unihan_property_names ⇒ Array<Property>
versionに含まれるUnihanのプロパティ名を取得
342 343 344 |
# File 'lib/uniprop/metadata_processor.rb', line 342 def unihan_property_names @unihan_property_names ||= ["unihan_properties"].to_a end |
#version_metadata_validator ⇒ VersionMetaDataValidator
176 177 178 179 |
# File 'lib/uniprop/metadata_processor.rb', line 176 def @version_metadata_validator ||= VersionMetaDataValidator.new(self) @version_metadata_validator end |