5 // WordLink -------------------------------------------------------------------
7 TM::WordLink::WordLink() { }
9 TM::WordLink::WordLink(QJsonObject json)
11 QJsonArray ja = json["s"].toArray();
16 void TM::WordLink::clear()
22 void TM::WordLink::append(int place, Text::pointer word)
27 if(!m_sources.contains(word)) m_sources.push_back(word);
31 if(!m_targets.contains(word)) m_targets.push_back(word);
35 void TM::WordLink::remove(int place, Text::pointer word)
38 if(place == Source) m_sources.removeOne(word);
39 if(place == Target) m_targets.removeAll(word);
42 bool TM::WordLink::is_valid() const
44 return (!m_sources.isEmpty()) && (!m_targets.isEmpty());
47 bool TM::WordLink::is_empty() const
49 if(!m_sources.isEmpty()) return false;
50 if(!m_targets.isEmpty()) return false;
54 bool TM::WordLink::contains(int place, Text::pointer word)
56 if(place == Source) return m_sources.contains(word);
57 if(place == Target) return m_targets.contains(word);
61 int TM::WordLink::size(int place) const
63 if(place == Source) return m_sources.size();
64 if(place == Target) return m_targets.size();
68 TM::WordLink::storage_type* TM::WordLink::sources() { return &m_sources; }
70 TM::WordLink::storage_type* TM::WordLink::targets() { return &m_targets; }
72 QJsonObject TM::WordLink::to_json() const
74 QJsonArray sources, targets;
75 for(Text::pointer const &p : m_sources)
77 RangeData const *rd = static_cast<RangeData const*>(p->data().get());
79 ja.append(rd->begin());
80 ja.append(rd->tail());
83 for(Text::pointer const &p : m_targets)
85 RangeData const *rd = static_cast<RangeData const*>(p->data().get());
87 ja.append(rd->begin());
88 ja.append(rd->tail());
93 result["s"] = sources;
94 result["t"] = targets;
99 QString TM::WordLink::debug_dump() const
102 for(Text::pointer p : m_sources) result += p->string() + ",";
104 for(Text::pointer p : m_targets) result += p->string() + ",";
108 TM::WordLink::pointer TM::WordLink::create() { return pointer(new WordLink()); }
110 TM::WordLink::pointer TM::WordLink::create(QJsonObject json)
112 return pointer(new WordLink(json));
115 // WordLinker -----------------------------------------------------------------
117 void TM::WordLinker::clear()
119 m_current_link.reset();
124 * \brief リンクの編集を開始します。
126 void TM::WordLinker::start()
128 if(!m_current_link) m_current_link = WordLink::create();
132 * \brief リンクの編集を終了します。
134 void TM::WordLinker::commit()
136 if(!m_current_link) return;
137 if(m_current_link->is_valid()) m_links.append(m_current_link);
138 m_current_link.reset();
142 * \brief 現在のリンクへ単語を追加します。
144 void TM::WordLinker::append(int place, Text::pointer word)
147 if(!m_current_link) start();
149 WordLink::pointer p = find(place, word);
150 if(m_current_link->is_empty() && p)
153 m_links.removeOne(p);
159 p->remove(place, word);
160 if(p->size(place) == 0) m_links.removeOne(p);
162 m_current_link->append(place, word);
167 * \brief 現在のリンクから単語を削除します。
169 void TM::WordLinker::remove(int place, Text::pointer word)
172 assert(m_current_link);
173 m_current_link->remove(place, word);
177 * \brief 現在のリンクから単語の選択状態を反転させます。
179 void TM::WordLinker::toggle(int place, Text::pointer word)
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);
190 * \brief 現在選択されているリンクを返します。
192 TM::WordLink::pointer TM::WordLinker::current() { return m_current_link; }
195 * \brief valueを含むWordLinkを検索します。
197 TM::WordLink::pointer TM::WordLinker::find(Text::pointer word)
200 if(p = find(WordLink::Source, word)) return p;
201 if(p = find(WordLink::Target, word)) return p;
206 * \brief placeからvalueを含むWordLinkを検索します。
208 TM::WordLink::pointer TM::WordLinker::find(int place, Text::pointer word)
210 for(WordLink::pointer p : m_links) if(p->contains(place, word)) return p;
211 return WordLink::pointer();
214 int TM::WordLinker::index_of(WordLink::pointer link) const
216 if(m_current_link == link) return 0;
217 int i = m_links.indexOf(link);
219 return (i < 0) ? -1 : i + 1;
222 TM::WordLinker::iterator TM::WordLinker::begin() { return m_links.begin(); }
224 TM::WordLinker::iterator TM::WordLinker::end() { return m_links.end(); }
226 QJsonArray TM::WordLinker::to_json_array() const
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());
234 QString TM::WordLinker::debug_dump() const
237 for(WordLink::pointer p : m_links) result += p->debug_dump() + "|";