From: wordring Date: Sun, 16 Aug 2015 12:38:23 +0000 (+0900) Subject: Editorのデータ構造変更前、一時保存。 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=e7fbf539a151cef4fb5c5103dcde69d8f42f6ff4;hp=fc5c863e3c8872841801073eb5afe2918ac327e6;p=wordring-tm%2Fwordring-tm.git Editorのデータ構造変更前、一時保存。 --- diff --git a/proxy/main.cpp b/proxy/main.cpp index f6f09e9..2ea1875 100644 --- a/proxy/main.cpp +++ b/proxy/main.cpp @@ -51,7 +51,7 @@ int main(int argc, char *argv[]) if(!settings.contains("ProxyModule/prefix")) settings.setValue("ProxyModule/prefix", "/?"); // ProxyHandler if(!settings.contains("ProxyHandler/jscode")) - settings.setValue("ProxyHandler/jscode", "C:/Users/Kouichi/Documents/OSDN/wordring-tm/proxy/tm.js"); + settings.setValue("ProxyHandler/jscode", QString(PROXYSRCDIR) + "/tm.js"); // Database if(!settings.contains("Database/root")) diff --git a/proxy/tm.js b/proxy/tm.js index 4869f50..ef42bbd 100644 --- a/proxy/tm.js +++ b/proxy/tm.js @@ -91,11 +91,11 @@ window.wordring = { for(node = ev.target; node.nodeType == Node.ELEMENT_NODE; node = node.parentNode) { if(node.hasAttribute('data-wordring-segment')) { - var id = node.getAttribute('data-wordring-segment'); + var segment_id = node.getAttribute('data-wordring-segment'); wordring.socket.send(JSON.stringify({ 'cmd': 'edit', - 'id': id, - 'source': wordring.segments[id].html, + 'segment_id': segment_id, + 'source': wordring.segments[segment_id].html, 'target': node.innerHtml, })); break; diff --git a/proxy/tmeditorwidget.cpp b/proxy/tmeditorwidget.cpp index c281604..d1fd421 100644 --- a/proxy/tmeditorwidget.cpp +++ b/proxy/tmeditorwidget.cpp @@ -158,8 +158,6 @@ bool TM::EditorWidget::link_mode() /*! * \brief リンクボタンをグレーアウトします。 - * - * */ void TM::EditorWidget::set_link_mode_disabled(bool disable) { @@ -185,19 +183,17 @@ int TM::EditorWidget::target_language() return m_tlang->data().toInt(); } -void TM::EditorWidget::set_string(QString source_, QString target_) +void TM::EditorWidget::set_segment(TextSegment::pointer segment) { QMutexLocker lock(&m_mutex); - int code = m_slang->data().toInt(); + m_edit->set_segment(segment); +} - Text::pointer result = Text::create(); - Text::pointer sentences = m_service->divide_into_sentences(code, source_); - for(Text::pointer s = sentences->begin(); s; s = s->next()) - { - Text::pointer words = m_service->divide_into_words(code, s); - result->append(words); - } - m_edit->set_sentences(result); +void TM::EditorWidget::save_sentence(int segment_id, int index, + Text::pointer target_sentence, QJsonArray link) +{ + qDebug() << "save: " << link; + m_socket->save_sentence(segment_id, index, target_sentence, link); } /*! @@ -399,12 +395,17 @@ QColor TM::EditorPanel::color(int index) const TM::SourcePanel::SourcePanel(QWidget *parent) : EditorPanel(parent) + , m_index(-1) , m_target_panel(nullptr) { setUndoRedoEnabled(false); setContextMenuPolicy(Qt::NoContextMenu); } +int TM::SourcePanel::index() const { return m_index; } + +void TM::SourcePanel::set_index(int index) { m_index = index; } + TM::TargetPanel* TM::SourcePanel::target_panel() { return m_target_panel; } void TM::SourcePanel::set_target_panel(TargetPanel *target) @@ -653,6 +654,7 @@ TM::Editor::Editor(Settings *settings, Service *service, QWidget *parent) : TextWidget(parent) , m_settings(settings) , m_service(service) + , m_segment_id(-1) , m_edit_mode(false) , m_link_mode(false) , m_current_source_panel(nullptr) @@ -666,9 +668,8 @@ TM::Editor::Editor(Settings *settings, Service *service, QWidget *parent) */ void TM::Editor::clear() { - if(!m_sentences) return; // 文を保持していない場合、何もしない。 + if(m_segment_id < 0) return; // 文を保持していない場合、何もしない。 - m_sentences.reset(); // 保持している文のメモリーを開放する。 // パネルの終了処理。 if(m_current_source_panel) do_panel_leave(m_current_source_panel); m_current_source_panel = nullptr; @@ -678,27 +679,32 @@ void TM::Editor::clear() // リンクモードの解除。 set_link_mode(false); parent_editor_widget()->set_link_mode_disabled(true); + + m_segment_id = -1; } -/*! - * \brief エディタに文を設定します。 - * - * 文は複数の場合があります。 - */ -void TM::Editor::set_sentences(Text::pointer sentences) +void TM::Editor::set_segment(TextSegment::pointer segment) { clear(); - m_sentences = sentences; + m_segment_id = segment->segment_id(); TextArea *ta = text_area(); - for(Text::pointer s = sentences->begin(); s; s = s->next()) // s: sentence + int i = 0; + for(TextSentence::pointer p : *segment) { + Text::pointer s = p->source_sentence(); + Text::pointer t = p->target_sentence(); + SourcePanel *sp = ta->append(); TargetPanel *tp = ta->append(); + sp->set_index(i++); sp->set_target_panel(tp); sp->set_editor(this); tp->set_source_panel(sp); tp->set_editor(this); + sp->set_sentence(s); + if(t) tp->set_sentence(t); + sp->show(); } } @@ -794,7 +800,22 @@ void TM::Editor::do_panel_leave(SourcePanel *panel) if(!tp->is_text_saved()) { - //qDebug() << m_service->si + int tcode = parent_editor_widget()->target_language(); + + if(tp->is_text_dirty()) + { + panel->linker()->clear(); + QString string = tp->toPlainText(); + Text::pointer sentences = m_service->divide_into_sentences(tcode, string); + if(sentences->size()) + { + Text::pointer words = m_service->divide_into_words(tcode, sentences->begin()); + tp->set_sentence(words); // ココで、text_dirtyがfalseになる。 + } + } + + parent_editor_widget()->save_sentence(m_segment_id, panel->index(), + tp->sentence(), panel->linker()->to_json_array()); tp->set_text_saved(true); } } diff --git a/proxy/tmeditorwidget.h b/proxy/tmeditorwidget.h index ab4218b..c847740 100644 --- a/proxy/tmeditorwidget.h +++ b/proxy/tmeditorwidget.h @@ -3,6 +3,7 @@ #include "tmtext.h" #include "textwidget.h" +#include "tmsocket.h" #include "html.h" #include "language.h" @@ -40,7 +41,7 @@ namespace TM { class Service; -class SocketConnection; +//class SocketConnection; class Editor; class TargetPanel; @@ -64,9 +65,9 @@ public: int source_language(); int target_language(); - void set_string(QString source_, QString target_); - void append_sentence(); - void save_sentence(); + void set_segment(TextSegment::pointer segment); + void save_sentence(int segment_id, int index, + Text::pointer target_sentence, QJsonArray link); signals: void editModeChanged(bool mode_); @@ -132,6 +133,9 @@ class SourcePanel : public EditorPanel public: explicit SourcePanel(QWidget *parent); + int index() const; + void set_index(int index); + TargetPanel* target_panel(); void set_target_panel(TargetPanel *target); @@ -155,6 +159,7 @@ protected: void do_focusout(); private: + int m_index; TargetPanel *m_target_panel; WordLinker m_linker; }; @@ -205,7 +210,7 @@ public: Editor(Settings *settings, Service *service, QWidget *parent); void clear(); - void set_sentences(Text::pointer sentences); + void set_segment(TextSegment::pointer segment); bool edit_mode() const; void set_edit_mode(bool mode_); @@ -218,8 +223,6 @@ public: TargetPanel* current_target_panel(); TargetPanel const* current_target_panel() const; - //bool is_panel_changed(TextPanel *new_) const; - protected slots: void onFocusInChild(TextPanel *new_, TextPanel *old_); @@ -235,7 +238,7 @@ private: Settings *m_settings; Service *m_service; - Text::pointer m_sentences; + int m_segment_id; bool m_edit_mode; /*!< 編集モードのときtrue */ bool m_link_mode; /*!< リンクモードのときtrue */ diff --git a/proxy/tmsocket.cpp b/proxy/tmsocket.cpp index b2850ae..e48c657 100644 --- a/proxy/tmsocket.cpp +++ b/proxy/tmsocket.cpp @@ -1,5 +1,6 @@ #include "tmsocket.h" #include "tmeditorwidget.h" +#include "tmservice.h" #include "settings.h" #include "html.h" @@ -113,6 +114,67 @@ bool TM::TextConverter::is_white_space(QChar const &ch) return false; } +// TextSentence --------------------------------------------------------------- + +TM::TextSentence::TextSentence(Text::pointer source_sentence) + : m_source_sentence(source_sentence) +{ +} + +Text::pointer TM::TextSentence::source_sentence() { return m_source_sentence; } + +Text::pointer TM::TextSentence::target_sentence() { return m_target_sentence; } + +void TM::TextSentence::set_terget_sentence(Text::pointer target_sentence) +{ + m_target_sentence = target_sentence; +} + +QJsonArray TM::TextSentence::link_data() { return m_link_data; } + +void TM::TextSentence::set_link_data(QJsonArray json) { m_link_data = json; } + +TM::TextSentence::pointer TM::TextSentence::create(Text::pointer source_sentence) +{ + return pointer(new TextSentence(source_sentence)); +} + +// TextSegment ---------------------------------------------------------------- + +TM::TextSegment::TextSegment( + Service *service, int scode, int segment_id, QString source) + : m_segment_id(segment_id) + , m_document(source.toUtf8()) +{ + HtmlNode body = m_document.first("html").first("body"); + TextConverter tc; + m_text = tc.to_text(HtmlRange(body, body)); + + Text::pointer sentences = service->divide_into_sentences(scode, m_text->to_string()); + for(Text::pointer s = sentences->begin(); s; s = s->next()) // s: sentence + { + Text::pointer words = service->divide_into_words(scode, s); + m_sentences.append(TextSentence::create(words)); + } +} + +int TM::TextSegment::segment_id() const { return m_segment_id; } + +TM::TextSentence::pointer TM::TextSegment::at(int index) +{ + return m_sentences.at(index); +} + +TM::TextSegment::iterator TM::TextSegment::begin() { return m_sentences.begin(); } + +TM::TextSegment::iterator TM::TextSegment::end() { return m_sentences.end(); } + +TM::TextSegment::pointer TM::TextSegment::create( + Service *service, int scode, int segment_id, QString source) +{ + return pointer(new TextSegment(service, scode, segment_id, source)); +} + // SocketConnection ----------------------------------------------------------- TM::SocketConnection::SocketConnection(Settings *settings, Service *service, @@ -154,6 +216,16 @@ void TM::SocketConnection::send_message(QJsonObject const &json) send_message(doc.toJson().data()); } +void TM::SocketConnection::save_sentence(int segment_id, int index, + Text::pointer target_sentence, QJsonArray link) +{ + segment_map_iterator it = m_segments.find(segment_id); + assert(it != m_segments.end()); + TextSentence::pointer sentence = it.value()->at(index); + sentence->set_terget_sentence(target_sentence); + sentence->set_link_data(link); +} + void TM::SocketConnection::changeEditMode(bool edit_mode) { set_edit_mode(edit_mode); @@ -176,22 +248,22 @@ void TM::SocketConnection::set_edit_mode(bool edit_mode) */ void TM::SocketConnection::do_edit(QJsonObject const &json) { - m_document.set_content(json["source"].toString().toUtf8()); - HtmlNode body = m_document.first("html").first("body"); + int scode = m_editor_widget->source_language(); - TextConverter tc; - m_text = tc.to_text(HtmlRange(body, body)); - m_editor_widget->set_string(m_text->to_string(), json["target"].toString()); - //emit editCmd(json["id"].toInt(), m_document.to_string()); - /* - QJsonObject reply; - reply["cmd"] = "doedit"; - reply["id"] = json["id"].toString(); - reply["html"] = "test2"; - QJsonDocument doc; - doc.setObject(reply); - send_message(doc.toJson().data()); - */ + assert(json.contains("segment_id")); + int segment_id = json["segment_id"].toString().toInt(); + + segment_map_iterator it = m_segments.find(segment_id); + if(it == m_segments.end()) + { + assert(json.contains("source")); + QString source = json["source"].toString(); + m_current_segment = TextSegment::create(m_service, scode, segment_id, source); + m_segments.insert(segment_id, m_current_segment); + } + else m_current_segment = it.value(); + + m_editor_widget->set_segment(m_current_segment); } /*! @@ -205,7 +277,7 @@ void TM::SocketConnection::do_focus(QJsonObject const &json) m_edit_mode = edit_mode; m_editor_widget->set_edit_mode(edit_mode); - if(m_text) m_editor_widget->set_string(m_text->to_string(), ""); + if(m_current_segment) m_editor_widget->set_segment(m_current_segment); } void TM::SocketConnection::do_blur(QJsonObject const &) diff --git a/proxy/tmsocket.h b/proxy/tmsocket.h index 48cdbbc..16e189e 100644 --- a/proxy/tmsocket.h +++ b/proxy/tmsocket.h @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -66,6 +67,22 @@ private: class TextSentence { +public: + typedef std::shared_ptr pointer; + +private: + TextSentence(Text::pointer source_sentence); +public: + Text::pointer source_sentence(); + Text::pointer target_sentence(); + void set_terget_sentence(Text::pointer target_sentence); + + QJsonArray link_data(); + void set_link_data(QJsonArray json); + + static pointer create(Text::pointer source_sentence); + + QString debug_dump(); private: Text::pointer m_source_sentence; @@ -75,7 +92,30 @@ private: class TextSegment { +public: + typedef std::shared_ptr pointer; + typedef QList storage_type; + typedef storage_type::iterator iterator; +private: + TextSegment(Service *service, int scode, int segment_id, QString source); +public: + + int segment_id() const; + + TextSentence::pointer at(int index); + iterator begin(); + iterator end(); + + static pointer create( + Service *service, int scode, int segment_id, QString source); + +private: + int m_segment_id; /*!< data-wordring-segmentの値によるセグメントのID。 */ + HtmlDocument m_document; /*!< セグメントのHtmlDocument。 */ + Text::pointer m_text; /*!< セグメントのHtmlData付テキスト。 */ + + storage_type m_sentences; /*!< 編集用センテンスのリスト。 */ }; class SocketConnection : public QObject @@ -83,18 +123,22 @@ class SocketConnection : public QObject Q_OBJECT public: + typedef QMap segment_map_type; + typedef segment_map_type::iterator segment_map_iterator; + +public: SocketConnection(Settings *settings, Service *service, EditorWidget *editor_widget, QWebSocket *socket); virtual ~SocketConnection(); - //quint16 port() const; QWebSocket* socket(); void send_message(QString const &message); void send_message(QJsonObject const &json); void set_edit_mode(bool edit_mode); - //void set_source_language(int code); - //void set_target_language(int code); + + void save_sentence(int segment_id, int index, + Text::pointer target_sentence, QJsonArray link); signals: void editCmd(int id, QString html); @@ -109,6 +153,8 @@ private: void do_load(QJsonObject const &json); Text::pointer to_text(HtmlRange range) const; + TextSegment::pointer find_segment(int segment_id); + void insert_segment(int segment_id, TextSegment::pointer segment); private slots: void onTextMessageReceived(QString const &message); @@ -126,9 +172,8 @@ private: EditorWidget *m_editor_widget; - HtmlDocument m_document; /*!< 現在処理中のHTML文書パラグラフを保持 */ - Text::pointer m_text; /*!< HtmlData付のパラグラフをテキストとして保持 */ - //QJsonArray m_json; /*!< */ + QMap m_segments; + TextSegment::pointer m_current_segment; }; class SocketServer : public QObject diff --git a/proxy/tmtext.cpp b/proxy/tmtext.cpp index c73e9b3..352203c 100644 --- a/proxy/tmtext.cpp +++ b/proxy/tmtext.cpp @@ -231,6 +231,16 @@ QJsonArray TM::WordLinker::to_json_array() const return ja; } +void TM::WordLinker::set_json_array(QJsonArray json) +{ + for(QJsonValue jv : json) + { + QJsonArray ja = jv.toArray(); + //for() + } + //m_links.append(); +} + QString TM::WordLinker::debug_dump() const { QString result; diff --git a/proxy/tmtext.h b/proxy/tmtext.h index 028b071..1f68d1b 100644 --- a/proxy/tmtext.h +++ b/proxy/tmtext.h @@ -95,6 +95,7 @@ public: iterator end(); QJsonArray to_json_array() const; + void set_json_array(QJsonArray json); QString debug_dump() const;