OSDN Git Service

Editorのデータ構造変更前、一時保存。
[wordring-tm/wordring-tm.git] / proxy / tmtext.cpp
1 #include "tmtext.h"
2
3 #include "debug.h"
4
5 // WordLink -------------------------------------------------------------------
6
7 TM::WordLink::WordLink() { }
8
9 TM::WordLink::WordLink(QJsonObject json)
10 {
11         QJsonArray ja = json["s"].toArray();
12
13         //append(json, word);
14 }
15
16 void TM::WordLink::clear()
17 {
18         m_sources.clear();
19         m_targets.clear();
20 }
21
22 void TM::WordLink::append(int place, Text::pointer word)
23 {
24         assert(word);
25         if(place == Source)
26         {
27                 if(!m_sources.contains(word)) m_sources.push_back(word);
28         }
29         if(place == Target)
30         {
31                 if(!m_targets.contains(word)) m_targets.push_back(word);
32         }
33 }
34
35 void TM::WordLink::remove(int place, Text::pointer word)
36 {
37         assert(word);
38         if(place == Source) m_sources.removeOne(word);
39         if(place == Target) m_targets.removeAll(word);
40 }
41
42 bool TM::WordLink::is_valid() const
43 {
44         return (!m_sources.isEmpty()) && (!m_targets.isEmpty());
45 }
46
47 bool TM::WordLink::is_empty() const
48 {
49         if(!m_sources.isEmpty()) return false;
50         if(!m_targets.isEmpty()) return false;
51         return true;
52 }
53
54 bool TM::WordLink::contains(int place, Text::pointer word)
55 {
56         if(place == Source) return m_sources.contains(word);
57         if(place == Target) return m_targets.contains(word);
58         return false;
59 }
60
61 int TM::WordLink::size(int place) const
62 {
63         if(place == Source) return m_sources.size();
64         if(place == Target) return m_targets.size();
65         return -1;
66 }
67
68 TM::WordLink::storage_type* TM::WordLink::sources() { return &m_sources; }
69
70 TM::WordLink::storage_type* TM::WordLink::targets() { return &m_targets; }
71
72 QJsonObject TM::WordLink::to_json() const
73 {
74         QJsonArray sources, targets;
75         for(Text::pointer const &p : m_sources)
76         {
77                 RangeData const *rd = static_cast<RangeData const*>(p->data().get());
78                 QJsonArray ja;
79                 ja.append(rd->begin());
80                 ja.append(rd->tail());
81                 sources.append(ja);
82         }
83         for(Text::pointer const &p : m_targets)
84         {
85                 RangeData const *rd = static_cast<RangeData const*>(p->data().get());
86                 QJsonArray ja;
87                 ja.append(rd->begin());
88                 ja.append(rd->tail());
89                 targets.append(ja);
90         }
91
92         QJsonObject result;
93         result["s"] = sources;
94         result["t"] = targets;
95
96         return result;
97 }
98
99 QString TM::WordLink::debug_dump() const
100 {
101         QString result;
102         for(Text::pointer p : m_sources) result += p->string() + ",";
103         result += ":";
104         for(Text::pointer p : m_targets) result += p->string() + ",";
105         return result;
106 }
107
108 TM::WordLink::pointer TM::WordLink::create() { return pointer(new WordLink()); }
109
110 TM::WordLink::pointer TM::WordLink::create(QJsonObject json)
111 {
112         return pointer(new WordLink(json));
113 }
114
115 // WordLinker -----------------------------------------------------------------
116
117 void TM::WordLinker::clear()
118 {
119         m_current_link.reset();
120         m_links.clear();
121 }
122
123 /*!
124  * \brief リンクの編集を開始します。
125  */
126 void TM::WordLinker::start()
127 {
128         if(!m_current_link) m_current_link = WordLink::create();
129 }
130
131 /*!
132  * \brief リンクの編集を終了します。
133  */
134 void TM::WordLinker::commit()
135 {
136         if(!m_current_link) return;
137         if(m_current_link->is_valid()) m_links.append(m_current_link);
138         m_current_link.reset();
139 }
140
141 /*!
142  * \brief 現在のリンクへ単語を追加します。
143  */
144 void TM::WordLinker::append(int place, Text::pointer word)
145 {
146         assert(word);
147         if(!m_current_link) start();
148
149         WordLink::pointer p = find(place, word);
150         if(m_current_link->is_empty() && p)
151         {
152                 m_current_link = p;
153                 m_links.removeOne(p);
154         }
155         else
156         {
157                 if(p)
158                 {
159                         p->remove(place, word);
160                         if(p->size(place) == 0) m_links.removeOne(p);
161                 }
162                 m_current_link->append(place, word);
163         }
164 }
165
166 /*!
167  * \brief 現在のリンクから単語を削除します。
168  */
169 void TM::WordLinker::remove(int place, Text::pointer word)
170 {
171         assert(word);
172         assert(m_current_link);
173         m_current_link->remove(place, word);
174 }
175
176 /*!
177  * \brief 現在のリンクから単語の選択状態を反転させます。
178  */
179 void TM::WordLinker::toggle(int place, Text::pointer word)
180 {
181         assert(word);
182
183         bool contains = false;
184         if(m_current_link) contains = m_current_link->contains(place, word);
185         if(contains) remove(place, word);
186         else append(place, word);
187 }
188
189 /*!
190  * \brief 現在選択されているリンクを返します。
191  */
192 TM::WordLink::pointer TM::WordLinker::current() { return m_current_link; }
193
194 /*!
195  * \brief valueを含むWordLinkを検索します。
196  */
197 TM::WordLink::pointer TM::WordLinker::find(Text::pointer word)
198 {
199         WordLink::pointer p;
200         if(p = find(WordLink::Source, word)) return p;
201         if(p = find(WordLink::Target, word)) return p;
202         return p;
203 }
204
205 /*!
206  * \brief placeからvalueを含むWordLinkを検索します。
207  */
208 TM::WordLink::pointer TM::WordLinker::find(int place, Text::pointer word)
209 {
210         for(WordLink::pointer p : m_links) if(p->contains(place, word)) return p;
211         return WordLink::pointer();
212 }
213
214 int TM::WordLinker::index_of(WordLink::pointer link) const
215 {
216         if(m_current_link == link) return 0;
217         int i = m_links.indexOf(link);
218         assert(0 <= i);
219         return (i < 0) ? -1 : i + 1;
220 }
221
222 TM::WordLinker::iterator TM::WordLinker::begin() { return m_links.begin(); }
223
224 TM::WordLinker::iterator TM::WordLinker::end() { return m_links.end(); }
225
226 QJsonArray TM::WordLinker::to_json_array() const
227 {
228         QJsonArray ja;
229         if(m_current_link && m_current_link->is_valid()) ja.append(m_current_link->to_json());
230         for(WordLink::pointer const &p : m_links) ja.append(p->to_json());
231         return ja;
232 }
233
234 void TM::WordLinker::set_json_array(QJsonArray json)
235 {
236         for(QJsonValue jv : json)
237         {
238                 QJsonArray ja = jv.toArray();
239                 //for()
240         }
241         //m_links.append();
242 }
243
244 QString TM::WordLinker::debug_dump() const
245 {
246         QString result;
247         for(WordLink::pointer p : m_links) result += p->debug_dump() + "|";
248         return result;
249 }
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277