char_conv.lua 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. require('lib/text')
  2. local char_dir = mp.get_script_directory() .. '/char-conv/'
  3. local data = {}
  4. local languages = get_languages()
  5. for i = #languages, 1, -1 do
  6. lang = languages[i]
  7. if (lang == 'en') then
  8. data = {}
  9. else
  10. table_assign(data, get_locale_from_json(char_dir .. lang:lower() .. '.json'))
  11. end
  12. end
  13. local romanization = {}
  14. local function get_romanization_table()
  15. for k, v in pairs(data) do
  16. for _, char in utf8_iter(v) do
  17. romanization[char] = k
  18. end
  19. end
  20. end
  21. get_romanization_table()
  22. function need_romanization()
  23. return next(romanization) ~= nil
  24. end
  25. function char_conv(chars, use_ligature, has_separator)
  26. local separator = has_separator or ' '
  27. local length = 0
  28. local char_conv, sp, cache = {}, {}, {}
  29. local chars_length = utf8_length(chars)
  30. local concat = table.concat
  31. for _, char in utf8_iter(chars) do
  32. if use_ligature then
  33. if #char == 1 then
  34. char_conv[#char_conv + 1] = char
  35. else
  36. char_conv[#char_conv + 1] = romanization[char] or char
  37. end
  38. else
  39. length = length + 1
  40. if #char <= 2 then
  41. if (char ~= ' ' and length ~= chars_length) then
  42. cache[#cache + 1] = romanization[char] or char
  43. elseif (char == ' ' or length == chars_length) then
  44. if length == chars_length then
  45. cache[#cache + 1] = romanization[char] or char
  46. end
  47. sp[#sp + 1] = concat(cache)
  48. itable_clear(cache)
  49. end
  50. else
  51. if next(cache) ~= nil then
  52. sp[#sp + 1] = concat(cache)
  53. itable_clear(cache)
  54. end
  55. sp[#sp + 1] = romanization[char] or char
  56. end
  57. end
  58. end
  59. if use_ligature then
  60. return concat(char_conv)
  61. else
  62. return concat(sp, separator)
  63. end
  64. end
  65. return char_conv