OSDN Git Service

Editorのデータ構造変更前、一時保存。
authorwordring <kouichi_pm@users.osdn.me>
Sun, 16 Aug 2015 12:38:23 +0000 (21:38 +0900)
committerwordring <kouichi_pm@users.osdn.me>
Sun, 16 Aug 2015 12:38:23 +0000 (21:38 +0900)
proxy/main.cpp
proxy/tm.js
proxy/tmeditorwidget.cpp
proxy/tmeditorwidget.h
proxy/tmsocket.cpp
proxy/tmsocket.h
proxy/tmtext.cpp
proxy/tmtext.h

index f6f09e9..2ea1875 100644 (file)
@@ -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"))
index 4869f50..ef42bbd 100644 (file)
@@ -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;
index c281604..d1fd421 100644 (file)
@@ -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<SourcePanel>();
                TargetPanel *tp = ta->append<TargetPanel>();
+               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);
        }
 }
index ab4218b..c847740 100644 (file)
@@ -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 */
 
index b2850ae..e48c657 100644 (file)
@@ -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 &)
index 48cdbbc..16e189e 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <QString>
 #include <QList>
+#include <QMap>
 #include <QJsonArray>
 
 #include <QThread>
@@ -66,6 +67,22 @@ private:
 
 class TextSentence
 {
+public:
+       typedef std::shared_ptr<TextSentence> 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<TextSegment> pointer;
+       typedef QList<TextSentence::pointer> 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<int, TextSegment::pointer> 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<int, TextSegment::pointer> m_segments;
+       TextSegment::pointer m_current_segment;
 };
 
 class SocketServer : public QObject
index c73e9b3..352203c 100644 (file)
@@ -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;
index 028b071..1f68d1b 100644 (file)
@@ -95,6 +95,7 @@ public:
        iterator end();
 
        QJsonArray to_json_array() const;
+       void set_json_array(QJsonArray json);
 
        QString debug_dump() const;