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"))
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;
/*!
* \brief リンクボタンをグレーアウトします。
- *
- *
*/
void TM::EditorWidget::set_link_mode_disabled(bool disable)
{
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);
}
/*!
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)
: 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)
*/
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;
// リンクモードの解除。
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();
}
}
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);
}
}
#include "tmtext.h"
#include "textwidget.h"
+#include "tmsocket.h"
#include "html.h"
#include "language.h"
{
class Service;
-class SocketConnection;
+//class SocketConnection;
class Editor;
class TargetPanel;
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_);
public:
explicit SourcePanel(QWidget *parent);
+ int index() const;
+ void set_index(int index);
+
TargetPanel* target_panel();
void set_target_panel(TargetPanel *target);
void do_focusout();
private:
+ int m_index;
TargetPanel *m_target_panel;
WordLinker m_linker;
};
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_);
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_);
Settings *m_settings;
Service *m_service;
- Text::pointer m_sentences;
+ int m_segment_id;
bool m_edit_mode; /*!< 編集モードのときtrue */
bool m_link_mode; /*!< リンクモードのときtrue */
#include "tmsocket.h"
#include "tmeditorwidget.h"
+#include "tmservice.h"
#include "settings.h"
#include "html.h"
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,
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);
*/
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);
}
/*!
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 &)
#include <QString>
#include <QList>
+#include <QMap>
#include <QJsonArray>
#include <QThread>
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;
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
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);
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);
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
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;
iterator end();
QJsonArray to_json_array() const;
+ void set_json_array(QJsonArray json);
QString debug_dump() const;