Class: UniProp::VersionMetaData

Inherits:
Object
  • Object
show all
Defined in:
lib/uniprop/inspects.rb,
lib/uniprop/metadata_processor.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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_metadataObject (readonly)

Returns the value of attribute raw_metadata.



71
72
73
# File 'lib/uniprop/metadata_processor.rb', line 71

def 
  @raw_metadata
end

#versionObject (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_propertiesArray<Property>

メタデータ内に含まれるプロパティを取得

Returns:



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_propfilesArray<PropFile>

メタデータに記述のあるPropFileを取得

Returns:



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

Returns:



364
365
366
367
368
369
370
371
372
# File 'lib/uniprop/metadata_processor.rb', line 364

def (propfile)
   = propfile_metadatas.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内の記述を、加工せずそのまま取得

Returns:

  • (Hash<String,Object>)

    値の形式はキーによって異なる。

Raises:



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のフォーマットに関する情報がメタデータにあるかを判定

Parameters:

Returns:

  • (Boolean)


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

Returns:

  • (Boolean)


374
375
376
377
378
# File 'lib/uniprop/metadata_processor.rb', line 374

def has_propfile_metadata?(propfile)
  !!(propfile)
rescue
  false
end

#inspectObject



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>

Note:

codepointによって複数のmissingが定義されている場合には返り値は複数のMissingDefオブジェクトになる

propertyのMissingDefオブジェクトを取得

Parameters:

Returns:



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_namesArray<String>

メタデータに含まれるプロパティ名を取得

Returns:

  • (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 = []
  propfile_metadatas.each do ||
    .raw_blocks.each { @property_names.concat(_1.content.flatten) }
  end

  @property_names.uniq!
  @property_names
end

#property_to_actual_positionsHash<Property,Array<Position>>

メタデータを元に、各Propertyと、そのPositionを取得

Returns:



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 has_propfile_metadata?(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_propfilesHash<Property,Set<PropFile>]

バージョンに属する各Propertyと、そのPropertyが実際に記述されているPropFileの関係のHashを取得

Returns:



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_metadatasArray<PropFileMetaData>

Returns:



325
326
327
328
329
330
331
332
# File 'lib/uniprop/metadata_processor.rb', line 325

def propfile_metadatas
  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>

Note:

codepointによって複数のmissingが定義されている場合には返り値は複数のMissingDefオブジェクトになる

fileのMissingDefオブジェクトを取得

Parameters:

Returns:



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_namesSet<String>

メタデータに記述されているPropFileの名前を取得

Returns:

  • (Set<String>)


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_propertiesHash<PropFile,Array<Property>>

メタデータを元に、各PropFileと、それに含まれるPropertyを取得

Returns:



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 has_propfile_metadata?(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_namesArray<String>

versionに含まれるUnihanのファイル名を取得

Returns:

  • (Array<String>)


336
337
338
# File 'lib/uniprop/metadata_processor.rb', line 336

def unihan_file_names
  @unihan_file_names ||= ["unihan_files"].to_a
end

#unihan_propertiesArray<Property>

Returns:



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_namesArray<Property>

versionに含まれるUnihanのプロパティ名を取得

Returns:



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_validatorVersionMetaDataValidator



176
177
178
179
# File 'lib/uniprop/metadata_processor.rb', line 176

def 
  @version_metadata_validator ||= VersionMetaDataValidator.new(self)
  @version_metadata_validator
end