243 lines
5.5 KiB
Ruby
243 lines
5.5 KiB
Ruby
# Copyright (c) 2018(-2023) STMicroelectronics.
|
|
# All rights reserved.
|
|
#
|
|
# This file is part of the TouchGFX 4.21.2 distribution.
|
|
#
|
|
# This software is licensed under terms that can be found in the LICENSE file in
|
|
# the root directory of this software component.
|
|
# If no LICENSE file comes with this software, it is provided AS-IS.
|
|
#
|
|
###############################################################################/
|
|
class TextEntries
|
|
include Enumerable
|
|
|
|
def initialize
|
|
@entries = []
|
|
@unicode_is_rtl = false
|
|
end
|
|
|
|
def each(&block)
|
|
@entries.each(&block)
|
|
end
|
|
|
|
def remove(entry)
|
|
@entries.delete(entry)
|
|
end
|
|
|
|
def add(entry)
|
|
@entries.push(entry)
|
|
end
|
|
|
|
def empty?
|
|
@entries.empty?
|
|
end
|
|
|
|
def different_typographies
|
|
[ar,default]
|
|
end
|
|
|
|
def different_alignments
|
|
[ar,default]
|
|
end
|
|
|
|
def languages_with_specific_settings
|
|
@entries.collect { |entry| entry.typographies.keys + entry.alignments.keys + entry.directions.keys }.flatten.uniq
|
|
end
|
|
|
|
def remove_language(language)
|
|
@entries.each { |entry| entry.remove_translation_in(language) }
|
|
end
|
|
|
|
def typographies
|
|
@entries.map(&:default_typography).uniq
|
|
end
|
|
|
|
def entries
|
|
@entries
|
|
end
|
|
|
|
def with_typography(typography)
|
|
@entries.select { |entry| entry.typography == typography }
|
|
end
|
|
|
|
def text_id(text_id)
|
|
@entries.find { |entry| entry.text_id == text_id }
|
|
end
|
|
|
|
def all_text_ids
|
|
@entries.collect { |entry| entry.text_id }
|
|
end
|
|
|
|
def include?(text_entry)
|
|
@entries.find { |entry| entry.text_id == text_entry.text_id || entry.cpp_text_id == text_entry.cpp_text_id }
|
|
end
|
|
|
|
def unicode_uses_rtl
|
|
@unicode_is_rtl = true
|
|
end
|
|
|
|
def is_rtl
|
|
@unicode_is_rtl || @entries.any? { |entry| entry.is_rtl }
|
|
end
|
|
end
|
|
|
|
class TextEntry
|
|
attr_reader :text_id
|
|
attr_reader :typographies
|
|
attr_reader :alignments
|
|
attr_reader :directions
|
|
attr_reader :default_typography
|
|
attr_reader :default_alignment
|
|
attr_reader :default_direction
|
|
|
|
def initialize(text_id, default_typography, default_alignment, default_direction)
|
|
@text_id = text_id
|
|
@typographies = {}
|
|
@alignments = {}
|
|
@directions = {}
|
|
@translations = {}
|
|
|
|
# default typography
|
|
@default_typography = default_typography
|
|
|
|
# default alignment
|
|
@default_alignment = get_alignment_as_string(default_alignment)
|
|
|
|
# default direction
|
|
@default_direction = get_direction_as_string(default_direction)
|
|
end
|
|
|
|
def add_typography(language, typography)
|
|
@typographies[language] = typography
|
|
end
|
|
def add_alignment(language, alignment)
|
|
@alignments[language] = alignment
|
|
end
|
|
def add_direction(language, direction)
|
|
@directions[language] = direction
|
|
end
|
|
|
|
def add_translation(language, text)
|
|
translation = Translation.new(text)
|
|
@translations[language] = translation
|
|
end
|
|
|
|
def remove_translation_in(language)
|
|
@translations.delete(language)
|
|
end
|
|
|
|
def translations
|
|
@translations.values
|
|
end
|
|
|
|
def translation_in(language)
|
|
@translations[language]
|
|
end
|
|
|
|
def translations_with_typography(typography)
|
|
languages_with_typography = languages.select do |language|
|
|
if @typographies[language].nil?
|
|
@default_typography == typography
|
|
else
|
|
@typographies[language] == typography
|
|
end
|
|
end
|
|
|
|
languages_with_typography.collect{ |language| translation_in(language) }
|
|
end
|
|
|
|
def languages
|
|
@translations.keys
|
|
end
|
|
|
|
def number_of_substitutions_in(language)
|
|
@translations[language].number_of_substitutions
|
|
end
|
|
|
|
def cpp_text_id
|
|
cppify(text_id)
|
|
end
|
|
|
|
# includes the default typography
|
|
def get_all_typographies
|
|
@typographies.values.compact.insert(0, @default_typography)
|
|
end
|
|
|
|
# includes the default alignment
|
|
def get_all_alignments_as_string
|
|
@alignments.values.compact.collect{ |a| get_alignment_as_string(a) }.insert(0, @default_alignment)
|
|
end
|
|
|
|
# includes the default direction
|
|
def get_all_directions_as_string
|
|
@directions.values.compact.collect{ |a| get_direction_as_string(a) }.insert(0, @default_direction)
|
|
end
|
|
|
|
def is_rtl
|
|
get_all_directions_as_string.any? { |dir| dir == 'RTL' }
|
|
end
|
|
|
|
private
|
|
|
|
def get_alignment_as_string(a)
|
|
a.to_s.empty? ? 'LEFT' : a.to_s.upcase
|
|
end
|
|
|
|
def get_direction_as_string(d)
|
|
d.to_s.empty? ? 'LTR' : d.to_s.upcase
|
|
end
|
|
|
|
def cppify(text)
|
|
t_type = "T_" + text.upcase
|
|
|
|
# strip the keys for characters, that can not be used in C++
|
|
t_type = t_type.to_ascii
|
|
t_type.gsub!(" ", "_")
|
|
t_type.gsub!(/[^0-9a-zA-Z_]/, '')
|
|
t_type
|
|
end
|
|
end
|
|
|
|
class Translation
|
|
attr_reader :text
|
|
def initialize(text)
|
|
@text = text
|
|
end
|
|
def empty?
|
|
@text.nil? || @text.empty?
|
|
end
|
|
def length
|
|
@text.length
|
|
end
|
|
def number_of_substitutions
|
|
to_cpp.count("\2")
|
|
end
|
|
def unicodes
|
|
# Collect all unicodes and add a terminating zero, which is also part of the string
|
|
@unicodes ||=
|
|
begin
|
|
numbers.map { |number| number.to_s.gsub(/\[|\]/,'').to_i } + [0]
|
|
end
|
|
end
|
|
def to_cpp
|
|
cpp_text = @text.gsub("\2", '') # Remove all existing placeholders
|
|
regex = Regexp.new(/([^\\]|^)<(|.*?[^\\])>/) # Avoid matching \< and \>
|
|
while cpp_text.match(regex)
|
|
cpp_text.gsub!(regex, '\1'+"\2")
|
|
end
|
|
cpp_text.gsub('\\<', '<').gsub('\\>', '>') # Remove \ before < and >
|
|
end
|
|
private
|
|
def numbers
|
|
to_cpp.unpack('U*')
|
|
end
|
|
end
|
|
|
|
class String
|
|
def to_ascii
|
|
# modernized version of http://craigjolicoeur.com/blog/ruby-iconv-to-the-rescue
|
|
self.encode("ASCII", "UTF-8", :undef => :replace, :invalid => :replace, :replace => '').
|
|
unpack('U*').select { |cp| cp < 127 }.pack('U*')
|
|
end
|
|
end
|