Class: UniProp::UnicodeManager

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(prop_data) ⇒ UnicodeManager

Returns a new instance of UnicodeManager.



5
6
7
# File 'lib/uniprop/unicode_manager.rb', line 5

def initialize(prop_data)
  @prop_data = prop_data
end

Instance Attribute Details

#prop_dataObject (readonly)

Returns the value of attribute prop_data.



3
4
5
# File 'lib/uniprop/unicode_manager.rb', line 3

def prop_data
  @prop_data
end

Instance Method Details

#generate_metadata(file_path, using_version_name, generated_version_name) ⇒ Object

initialize時に指定したメタデータを使用し、メタデータを作成

Parameters:

  • file_path (Pathname)

    メタデータを生成するパス

  • using_version_name (String)

    生成に使用するバージョン名

  • generated_version_name (String)

    生成するバージョン名



25
26
27
28
29
30
31
# File 'lib/uniprop/unicode_manager.rb', line 25

def (file_path, using_version_name, generated_version_name)
  prop_data.(
    file_path,
    prop_data.find_efficient_version(using_version_name),
    prop_data.find_version(generated_version_name)
  )
end

#inspectObject



111
112
113
# File 'lib/uniprop/inspects.rb', line 111

def inspect
  "#<#{self.class.name}>"
end

#propertiesArray<String>

メタデータに含まれる全バージョンの全プロパティ名を取得

Returns:

  • (Array<String>)


35
36
37
38
39
# File 'lib/uniprop/unicode_manager.rb', line 35

def properties
  @properties ||= prop_data.version_managers
                            .map { _1.properties }
                            .reduce([], :|)
end

#text_changed_codepoints(property, version1, version2) ⇒ Array<Integer>

Note:

単にデータファイルの文字が異なるコードポイントを取得するだけで、エイリアスの判定は行わない(例: Ageプロパティのプロパティ値5.0はエイリアスとしてV5_0を持つが、5.0とV5_0は別の値とみなす)

version1で値が定義済みのコードポイントのうち、version2では他の値が定義されているものを取得version2の方が新しい場合、version1から変更された値のみが取得される。version1の方が新しい場合、version2で追加された値も取得される。

Parameters:

  • property (String)
  • version1 (String)
  • version2 (String)

Returns:

  • (Array<Integer>)


91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/uniprop/unicode_manager.rb', line 91

def text_changed_codepoints(property, version1, version2)
  pvg1 = version_manager(version1).property_manager(property).property_value_group
  pvg2 = version_manager(version2).property_manager(property).property_value_group

  result = []
  # Blockプロパティのように、多くのコードポイントに同じ値が定義されるプロパティが存在
  # そのため、すべてのコードポイントの値を比較するのではなく、一度値ごとのコードポイントをまとめた方が効率的
  pvg1.values_to_codepoints.each do |values, cps1|
    cps2 = pvg2.values_to_codepoints[values].to_a
    diff_cps = cps1 - cps2
    result << diff_cps if !diff_cps.empty?
  end

  result.flatten
end

#validate_metadata(version_name) ⇒ Object

version_nameのメタデータを検証

Parameters:

  • version_name (String)


17
18
19
# File 'lib/uniprop/unicode_manager.rb', line 17

def (version_name)
  prop_data.find_version(version_name)...run_all_validations
end

#value_changed_codepoints(property, version1, version2) ⇒ Array<Integer>

text_changed_codepointsの処理に加え、エイリアスの判定を実行し、値が変更されたコードポイントを取得

Parameters:

  • property (String)
  • version1 (String)
  • version2 (String)

Returns:

  • (Array<Integer>)


57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/uniprop/unicode_manager.rb', line 57

def value_changed_codepoints(property, version1, version2)
  pm1 = version_manager(version1).property_manager(property)
  pm2 = version_manager(version2).property_manager(property)
  vm2 = version_manager(version2)

  # 文字列は変更されているが、別エイリアスに表記が変更されただけのコードポイントを判別
  # 例: "Y"のエイリアスとして"Yes", "T", "True"、"N"のエイリアスとして"No", "F", "False"が存在する時、
  # ["Y", "N"] -> ["False", "True"]が表記の変更だけで、値は変わっていないことを検出する手順
  # ["Y", "N"]の各値のエイリアスを求め、["Yes", "T", "True", "N", "No", "F", "False"]の配列を生成
  # ["False", "True"]から["Yes", "T", "True", "N", "No", "F", "False"]を引き、結果がemptyであれば値の変更は無いと判別
  result = []
  text_changed_codepoints(property, version1, version2).each do |cp|
    values1 = pm1.values_of(cp)
    values2 = pm2.values_of(cp)

    values1 = values1.class==Array ? values1 : [values1]
    values2 = values2.class==Array ? values2 : [values2]

    values1_aliases = values1.map { vm2.value_aliases(property, _1) }
                             .flatten
    
    result << cp if !(values2-values1_aliases).empty?
  end

  result
end

#version_manager(version) ⇒ VersionManager

Parameters:

  • version (String)

    バージョン名

Returns:



11
12
13
# File 'lib/uniprop/unicode_manager.rb', line 11

def version_manager(version)
  prop_data.version_manager(version)
end

#versions_of(property, char, value) ⇒ Object

codepointでpropertyのプロパティ値としてvalueが定義されているバージョン名をすべて取得

Parameters:

  • property (String)

    プロパティ名

  • char (String)

    検索する1文字

  • value (String)

    プロパティ値



45
46
47
48
49
50
# File 'lib/uniprop/unicode_manager.rb', line 45

def versions_of(property, char, value)
  warn "Versions prior to 4.0-Update are not included in the results because the metadata does not exist."
  prop_data.version_managers
        .filter { _1.has_value?(property, char.ord, value)}
        .map { _1.version.version_name }
end