summary refs log tree commit diff stats
path: root/generator/pronunciation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'generator/pronunciation.cpp')
-rw-r--r--generator/pronunciation.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/generator/pronunciation.cpp b/generator/pronunciation.cpp new file mode 100644 index 0000000..eb07607 --- /dev/null +++ b/generator/pronunciation.cpp
@@ -0,0 +1,87 @@
1#include "pronunciation.h"
2#include <list>
3#include <algorithm>
4#include <cctype>
5#include <iterator>
6#include "database.h"
7#include "field.h"
8#include "../lib/util.h"
9
10namespace verbly {
11 namespace generator {
12
13 int pronunciation::nextId_ = 0;
14
15 pronunciation::pronunciation(std::string phonemes) :
16 id_(nextId_++),
17 phonemes_(phonemes)
18 {
19 auto phonemeList = split<std::list<std::string>>(phonemes, " ");
20
21 auto rhymeStart = std::find_if(std::begin(phonemeList), std::end(phonemeList), [] (std::string phoneme) {
22 return phoneme.find("1") != std::string::npos;
23 });
24
25 // Rhyme detection
26 if (rhymeStart != std::end(phonemeList))
27 {
28 std::list<std::string> rhymePhonemes;
29
30 std::transform(rhymeStart, std::end(phonemeList), std::back_inserter(rhymePhonemes), [] (std::string phoneme) {
31 std::string naked;
32
33 std::remove_copy_if(std::begin(phoneme), std::end(phoneme), std::back_inserter(naked), [] (char ch) {
34 return std::isdigit(ch);
35 });
36
37 return naked;
38 });
39
40 rhyme_ = implode(std::begin(rhymePhonemes), std::end(rhymePhonemes), " ");
41
42 if (rhymeStart != std::begin(phonemeList))
43 {
44 prerhyme_ = *std::prev(rhymeStart);
45 }
46 }
47
48 // Syllable/stress
49 for (std::string phoneme : phonemeList)
50 {
51 if (std::isdigit(phoneme.back()))
52 {
53 // It's a vowel!
54 syllables_++;
55
56 if (phoneme.back() == '1')
57 {
58 stress_.push_back('1');
59 } else {
60 stress_.push_back('0');
61 }
62 }
63 }
64 }
65
66 database& operator<<(database& db, const pronunciation& arg)
67 {
68 std::list<field> fields;
69
70 fields.emplace_back("pronunciation_id", arg.getId());
71 fields.emplace_back("phonemes", arg.getPhonemes());
72 fields.emplace_back("syllables", arg.getSyllables());
73 fields.emplace_back("stress", arg.getStress());
74
75 if (arg.hasRhyme())
76 {
77 fields.emplace_back("rhyme", arg.getRhymePhonemes());
78 fields.emplace_back("prerhyme", arg.getPrerhyme());
79 }
80
81 db.insertIntoTable("pronunciations", std::move(fields));
82
83 return db;
84 }
85
86 };
87};