static
| 613 | |
| 614 | // static |
| 615 | util::Status Builder::LoadCharsMap(absl::string_view filename, |
| 616 | CharsMap *chars_map) { |
| 617 | LOG(INFO) << "Loading mapping file: " << filename.data(); |
| 618 | CHECK_OR_RETURN(chars_map); |
| 619 | |
| 620 | auto input = filesystem::NewReadableFile(filename); |
| 621 | |
| 622 | RETURN_IF_ERROR(input->status()); |
| 623 | |
| 624 | std::string line; |
| 625 | chars_map->clear(); |
| 626 | while (input->ReadLine(&line)) { |
| 627 | std::vector<std::string> fields = |
| 628 | absl::StrSplit(line, '\t', absl::AllowEmpty()); |
| 629 | CHECK_GE(fields.size(), 1); |
| 630 | if (fields.size() == 1) fields.push_back(""); // Deletion rule. |
| 631 | std::vector<char32> src, trg; |
| 632 | for (auto s : absl::StrSplit(fields[0], ' ')) { |
| 633 | if (s.empty()) continue; |
| 634 | absl::ConsumePrefix(&s, "U+"); |
| 635 | src.push_back(string_util::HexToInt<char32>(s)); |
| 636 | } |
| 637 | for (auto s : absl::StrSplit(fields[1], ' ')) { |
| 638 | if (s.empty()) continue; |
| 639 | absl::ConsumePrefix(&s, "U+"); |
| 640 | trg.push_back(string_util::HexToInt<char32>(s)); |
| 641 | } |
| 642 | CHECK_OR_RETURN(!src.empty()); |
| 643 | (*chars_map)[src] = trg; |
| 644 | } |
| 645 | |
| 646 | return util::OkStatus(); |
| 647 | } |
| 648 | |
| 649 | // static |
| 650 | util::Status Builder::SaveCharsMap(absl::string_view filename, |