OSDN Git Service

URL入力欄から移動できなくなっていた問題を修正♪
authorwordring <kouichi_pm@users.osdn.me>
Thu, 27 Aug 2015 18:15:10 +0000 (03:15 +0900)
committerwordring <kouichi_pm@users.osdn.me>
Thu, 27 Aug 2015 18:15:10 +0000 (03:15 +0900)
13 files changed:
proxy/main.cpp
proxy/proxy.pro
proxy/tm-default.css [new file with mode: 0644]
proxy/tm-default.js [new file with mode: 0644]
proxy/tmeditorwidget.cpp
proxy/tmeditorwidget.h
proxy/tmhttp.cpp
proxy/tmhttp.h
proxy/tmsocket.cpp
proxy/tmsocket.h
third-party/katahiromz/wordring.ico [new file with mode: 0644]
third-party/katahiromz/wordring.png [new file with mode: 0644]
third-party/katahiromz/wordring.svg [new file with mode: 0644]

index 40eadf6..052a657 100644 (file)
 #include <windows.h>
 
 #include "debug.h"
-/*
-QFile s_debug_file;
 
-void debug_message(QtMsgType, QMessageLogContext const&, QString const &message)
-{
-       s_debug_file.write(message.toLocal8Bit().data());
-       s_debug_file.write("\r\n");
-       //fprintf(stdout, "%s\n", message.toLocal8Bit().data());
-}
-*/
 int main(int argc, char *argv[])
 {
        //SetDebugMemoryLeaks();
-/*
-       AllocConsole();
-       FILE* fp;
-       freopen_s(&fp, "CON","w",stdout);
-       freopen_s(&fp, "CON","r",stdin);
-*/
-/*     s_debug_file.setFileName("wordring_log.txt");
-       s_debug_file.open(QIODevice::ReadWrite);
-
-       qInstallMessageHandler(debug_message);
-*/
 
        QApplication a(argc, argv);
 
@@ -80,10 +60,13 @@ int main(int argc, char *argv[])
                settings.setValue("ProxyModule/prefix", "/?u=");
        // ProxyHandler
 #ifdef QT_DEBUG
-       settings.setValue("ProxyHandler/jscode", QString(PROXYSRCDIR) + "/tm.js");
+               settings.setValue("ProxyHandler/js_file", QString(PROXYSRCDIR) + "/tm-default.js");
+               settings.setValue("ProxyHandler/css_file", QString(PROXYSRCDIR) + "/tm-default.css");
 #else
-//     if(!settings.contains("ProxyHandler/jscode"))
-               settings.setValue("ProxyHandler/jscode", app_path + "/tm.js");
+//     if(!settings.contains("ProxyHandler/js_file"))
+               settings.setValue("ProxyHandler/js_file", app_path + "/tm-default.js");
+//     if(!settings.contains("ProxyHandler/css_file"))
+               settings.setValue("ProxyHandler/css_file", app_path + "/tm-default.css");
 #endif
        // DefaultHtmlModule
 #ifdef QT_DEBUG
index f8230ec..f091117 100644 (file)
@@ -38,7 +38,7 @@ DEFINES += PROXYSRCDIR=\\\"$$PWD\\\"
 RESOURCES += \
        proxy.qrc
 
-RC_FILE = wordring.rc
+#RC_FILE = wordring.rc
 RC_ICONS = wordring.ico
 
 #DISTFILES +=
diff --git a/proxy/tm-default.css b/proxy/tm-default.css
new file mode 100644 (file)
index 0000000..c99e0e9
--- /dev/null
@@ -0,0 +1,6 @@
+
+
+body {
+       font-family: 'ヒラギノ角ゴ ProN W3', 'Hiragino Kaku Gothic ProN', 'メイリオ', Meiryo, sans-serif;
+}
+
diff --git a/proxy/tm-default.js b/proxy/tm-default.js
new file mode 100644 (file)
index 0000000..7996a1b
--- /dev/null
@@ -0,0 +1,145 @@
+
+window.wordring = {
+       socket: null, // TMとの通信用ソケット。
+       port: 1, // ソケットのポート番号。
+       url: '',
+       edit_mode: false, // 編集モード判別フラグ。
+               
+       segments: null, // パラグラフの連想配列。
+       
+       // ページのセットアップを行う。
+       setup: function() {
+               if(!window.WebSocket) alert('Your browser does not support websocket.\r\nBecause wordring-tm needs it, you must use the latest browser.');
+               // 原文のコピーを取る。
+               wordring.segments = Array();
+               var elements = document.getElementsByTagName('span');
+               var element;
+               var i = 0;
+               for(; i < elements.length ; i++)
+               {
+                       element = elements.item(i);
+                       if(!element.hasAttribute('data-wordring-segment')) continue;
+                       
+                       var id = element.getAttribute('data-wordring-segment');
+                       var segment = {};
+                       segment.segment_id = id;
+                       segment.loaded = false;
+                       segment.element = element;
+                       segment.html = element.innerHTML;
+                       wordring.segments[id] = segment;
+               }
+               
+               wordring.socket = new WebSocket('ws://localhost:' + window.wordring.port + '/');
+               wordring.socket.onopen = wordring.onopen;
+               wordring.socket.onmessage = wordring.onmessage;
+               wordring.socket.onerror = wordring.onerror;
+               wordring.socket.onclose = wordring.onclose;
+       },
+       
+       onopen: function(ev) {
+               document.addEventListener('click', wordring.onclick);
+               window.addEventListener('focus', wordring.onfocus);
+               window.addEventListener('blur', wordring.onblur);
+               
+               wordring.socket.send(JSON.stringify({
+                       'cmd': 'load',
+                       'url': window.wordring.url
+               }));
+               
+               // 全てのセグメントの対して、セグメントの情報を送信する。
+               var length = wordring.segments.length;
+               var i = 0;
+               for(; i < length; i++) {
+                       var segment = wordring.segments[i];
+                       wordring.socket.send(JSON.stringify({
+                               'cmd': 'load_segment',
+                               'segment_id': segment.segment_id,
+                               'html': segment.html
+                       }));
+               }
+       },
+       
+       onmessage: function(ev) {
+               var json = JSON.parse(ev.data);
+               switch(json.cmd)
+               {
+               case 'set_segment': wordring.set_segment(json); break;
+               case 'set_edit_mode': wordring.set_edit_mode(json); break;
+               case 'segment_loaded': wordring.segment_loaded(json); break;
+               case 'reload': wordring.reload(); break;
+               }
+       },
+       
+       onerror: function(ev) {
+               //document.location.href = 'http://www.yahoo.co.jp/';
+       },
+       
+       onclose: function(ev) {
+               window.location.href = 'http://wordring.net/';
+       },
+       
+       onfocus: function(ev) {
+               wordring.socket.send(JSON.stringify({
+                       'cmd': 'focus'
+               }));
+       },
+       
+       onblur: function(e) {
+               wordring.socket.send(JSON.stringify({
+                       'cmd': 'blur'
+               }));
+
+       },
+       
+       onclick: function(ev) {
+               if(!wordring.edit_mode) return;
+               ev.preventDefault();
+               var node;
+               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 = wordring.segments[id];
+                               if(segment.loaded) break;
+                               wordring.socket.send(JSON.stringify({
+                                       'cmd': 'edit_segment',
+                                       'segment_id': segment.segment_id
+                               }));
+                               break;
+                       }
+               }
+       },
+       
+       set_segment: function(json) {
+               var segment_id = json.segment_id;
+               wordring.segments[segment_id].element.innerHTML = json.html;
+       },
+       
+       set_edit_mode: function(json) {
+               wordring.edit_mode = json.edit_mode;
+       },
+       
+       segment_loaded: function(json) {
+               var segment_id = json.segment_id;
+               var segment = wordring.segments[segment_id];
+               segment.loaded = true;
+               segment.element.className = '';
+       },
+       
+       reload: function() {
+               window.location.reload();
+       }
+};
+
+if(document.addEventListener)
+{
+       window.addEventListener('load', function(ev){ 
+               wordring.setup();
+       });     
+} else {
+       window.attachEvent('onload', function(ev){ 
+               wordring.setup();
+       });
+}
+
+
index b06d9d5..4ae065c 100644 (file)
@@ -94,6 +94,8 @@ void TM::EditorWidget::attach(SocketConnection *socket)
        m_socket = socket;
        connect(this, SIGNAL(editModeChanged(bool)), m_socket, SLOT(changeEditMode(bool)));
        set_link_mode_disabled(true);
+       connect(this, SIGNAL(sourceLanguageChanged()), m_socket, SLOT(changeLanguage()));
+       connect(this, SIGNAL(targetLanguageChanged()), m_socket, SLOT(changeLanguage()));
 }
 
 /*!
@@ -104,6 +106,8 @@ void TM::EditorWidget::detach(SocketConnection *)
 {
        QMutexLocker lock(&m_mutex);
        disconnect(this, SIGNAL(editModeChanged(bool)), m_socket, SLOT(changeEditMode(bool)));
+       disconnect(this, SIGNAL(sourceLanguageChanged()), m_socket, SLOT(changeLanguage()));
+       disconnect(this, SIGNAL(targetLanguageChanged()), m_socket, SLOT(changeLanguage()));
 
        m_edit->clear();
        m_socket = nullptr;
@@ -273,6 +277,8 @@ void TM::EditorWidget::onSourceLanguageTriggered(bool)
        assert(saction);
        m_slang->setIcon(saction->icon());
        m_slang->setData(saction->data());
+
+       emit sourceLanguageChanged();
 }
 
 /*!
@@ -284,6 +290,8 @@ void TM::EditorWidget::onTargetLanguageTriggered(bool)
        assert(taction);
        m_tlang->setIcon(taction->icon());
        m_tlang->setData(taction->data());
+
+       emit targetLanguageChanged();
 }
 
 /*!
index f485050..e4a3efe 100644 (file)
@@ -72,8 +72,8 @@ public:
 signals:
        void editModeChanged(bool mode_);
        void linkModeChanged(bool mode_);
-
-       void contentsEdited();
+       void sourceLanguageChanged();
+       void targetLanguageChanged();
 
 public slots:
        void onLanguageLoaded(int code, QString name, QIcon icon);
index 4074626..85d720f 100644 (file)
@@ -26,10 +26,15 @@ TM::ProxyContext::ProxyContext(Settings *settings, quint16 http, quint16 socket)
        , m_socket_port(socket)
 {
        m_manager->setCookieJar(m_cookie);
+
        assert(settings->contains("ProxyModule/prefix"));
        m_prefix = settings->value("ProxyModule/prefix").toString();
-       assert(settings->contains("ProxyHandler/jscode"));
-       m_jscode = settings->value("ProxyHandler/jscode").toString();
+
+       assert(settings->contains("ProxyHandler/js_file"));
+       m_js_file = settings->value("ProxyHandler/js_file").toString();
+
+       assert(settings->contains("ProxyHandler/css_file"));
+       m_css_file = settings->value("ProxyHandler/css_file").toString();
 }
 
 QNetworkAccessManager* TM::ProxyContext::network_access_manager()
@@ -43,7 +48,9 @@ quint16 TM::ProxyContext::socket_port() const { return m_socket_port; }
 
 QString TM::ProxyContext::prefix() const { return m_prefix; }
 
-QString TM::ProxyContext::jscode() const { return m_jscode; }
+QString TM::ProxyContext::js_file() const { return m_js_file; }
+
+QString TM::ProxyContext::css_file() const { return m_css_file; }
 
 // ProxyModule ----------------------------------------------------------------
 
@@ -96,8 +103,12 @@ TM::ProxyHandler::~ProxyHandler()
 
 int TM::ProxyHandler::run()
 {
-       m_targetUrl = QUrl::fromUserInput(
-                       m_request->url().remove(0, m_context->prefix().toUtf8().length()));
+       QByteArray url_string =
+               m_request->url().remove(0, m_context->prefix().toUtf8().length());
+       url_string = QUrl::fromPercentEncoding(url_string).toUtf8();
+       m_targetUrl = QUrl::fromUserInput(url_string);
+       qDebug() << m_targetUrl;
+
        // HTML取得要求
        m_reply = m_context->network_access_manager()->get(QNetworkRequest(m_targetUrl));
        connect(m_reply, SIGNAL(finished()), this, SLOT(onNetworkReplyFinished()));
@@ -175,15 +186,27 @@ int TM::ProxyHandler::response()
        // CSS書き込み
        node = head.insert("style", head.end());
        node.insert_text(" .wordring-segment:hover{ color:#ff0000; } ", node.end());
-       // JS書き込み
 
-       QFile file(m_context->jscode());
-       file.open(QIODevice::ReadOnly);
-       QByteArray js = file.readAll();
-       file.close();
+       // JS書き込み
+       QFile js_file(m_context->js_file());
+       js_file.open(QIODevice::ReadOnly);
+       assert(js_file.isOpen());
+       QByteArray js = js_file.readAll();
+       js_file.close();
        node = head.insert("script", head.end()).set_attribute("type", "text/javascript");
        node.insert_comment(QString::fromUtf8(js), node.end());
-       //
+
+       // css書き込み
+       QFile css_file(m_context->css_file());
+       css_file.open(QIODevice::ReadOnly);
+       assert(css_file.isOpen());
+       QByteArray css = css_file.readAll();
+       css_file.close();
+       node = head.insert("style", head.end()).set_attribute("type", "text/css");
+       node.insert_text(QString::fromUtf8(css), node.end());
+
+
+       // ポート、URL書き込み
        node = head.insert("script", head.end()).set_attribute("type", "text/javascript");
        QString str1 = "\nwindow.wordring.port=";
        str1 += QString::number(m_context->socket_port()) + ";\n";
@@ -400,7 +423,6 @@ TM::DefaultHtmlHandler::DefaultHtmlHandler(
        , m_html(html_)
 {
        QString path = settings->value("DefaultHtmlModule/file").toString();
-       QString prefix = settings->value("ProxyModule/prefix").toString();
 
        QFile file(path);
        file.open(QIODevice::ReadOnly);
@@ -412,20 +434,10 @@ TM::DefaultHtmlHandler::DefaultHtmlHandler(
 
        HtmlNode html = document.first("html");
        HtmlNode head = html.first("head");
-       HtmlNode node;
 
        // Tidyが書き込むmetaタグを除去
        head.remove(head.first("meta"));
 
-/*
-       node = head.insert("script", head.end()).set_attribute("type", "text/javascript");
-       QString js = "\nwindow.wordring.port=";
-       js += QString::number(port) + ";\n";
-       js += "window.wordring.prefix='";
-       js += prefix + "';\n";
-       node.insert_comment(js, node.end());
-*/
-
        m_html = document.to_byte_array();
 }
 
index 2352e6d..a755634 100644 (file)
@@ -35,7 +35,8 @@ public:
        quint16 http_port() const;
        quint16 socket_port() const;
        QString prefix() const;
-       QString jscode() const;
+       QString js_file() const;
+       QString css_file() const;
 
 private:
        Settings *m_settings;
@@ -46,7 +47,8 @@ private:
        quint16 m_http_port;
        quint16 m_socket_port;
        QString m_prefix;
-       QString m_jscode;
+       QString m_js_file;
+       QString m_css_file;
 };
 
 class ProxyModule : public HttpModule
index 290f153..2143ea7 100644 (file)
@@ -503,6 +503,13 @@ void TM::SocketConnection::changeEditMode(bool edit_mode)
        set_edit_mode(edit_mode);
 }
 
+void TM::SocketConnection::changeLanguage()
+{
+       QJsonObject json;
+       json["cmd"] = "reload";
+       send_message(json);
+}
+
 /*!
  * \brief ブラウザに編集モードを反映します。
  *
index e833535..a190340 100644 (file)
@@ -142,8 +142,6 @@ public:
        void save_sentence(int segment_id, int index);
        void remove_sentence(int segment_id, int index);
 
-       void do_sentence_loaded();
-
        void sentence_found(
                        int segment_id, int index, sentence_data_type::pointer result);
        void sentence_inserted(int segment_id, int index,
@@ -154,6 +152,7 @@ signals:
 
 public slots:
        void changeEditMode(bool edit_mode);
+       void changeLanguage();
 
 private:
        void set_segment(int segment_id, QString html);
diff --git a/third-party/katahiromz/wordring.ico b/third-party/katahiromz/wordring.ico
new file mode 100644 (file)
index 0000000..9e61aef
Binary files /dev/null and b/third-party/katahiromz/wordring.ico differ
diff --git a/third-party/katahiromz/wordring.png b/third-party/katahiromz/wordring.png
new file mode 100644 (file)
index 0000000..7502609
Binary files /dev/null and b/third-party/katahiromz/wordring.png differ
diff --git a/third-party/katahiromz/wordring.svg b/third-party/katahiromz/wordring.svg
new file mode 100644 (file)
index 0000000..1a44c52
--- /dev/null
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="256"
+   height="256"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="wordring.svg"
+   inkscape:export-filename="C:\Users\katahiromz\Desktop\wordring.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3019">
+      <stop
+         style="stop-color:#ffff00;stop-opacity:1;"
+         offset="0"
+         id="stop3021" />
+      <stop
+         style="stop-color:#ffff00;stop-opacity:0;"
+         offset="1"
+         id="stop3023" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3019"
+       id="linearGradient3025"
+       x1="120.12196"
+       y1="1092.5084"
+       x2="120.12195"
+       y2="796.36218"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(3.0283356e-6,2.0715836e-5)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.82"
+     inkscape:cx="37.195121"
+     inkscape:cy="86.702902"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:snap-page="true"
+     inkscape:snap-bbox="true"
+     inkscape:window-width="1366"
+     inkscape:window-height="716"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="レイヤー 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-796.36218)">
+    <rect
+       y="797.99231"
+       x="1.6301203"
+       height="254.38026"
+       width="254.38026"
+       id="rect2989"
+       style="font-size:121.58960724px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.95999995;fill:#ffffff;fill-opacity:1;stroke:#00003d;stroke-width:3.26024055;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Sans" />
+    <rect
+       style="opacity:0.95999995;fill:url(#linearGradient3025);fill-opacity:1;stroke:#00003d;stroke-width:4.08758211;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="rect2991"
+       width="251.91241"
+       height="251.91241"
+       x="2.0437911"
+       y="798.40594" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3028"
+       style="font-size:218.86129761px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;font-family:'TT-JTCウインZ10';-inkscape-font-specification:'TT-JTCウインZ10'"
+       d="m 100.52056,833.92792 0,22.56057 -79.46437,0 0,-22.56057 z m 9.7546,30.24076 0,25.92065 -98.25982,0 0,-25.92065 z m -8.08918,32.44882 0,21.98452 -82.08146,0 0,-21.98452 z m 0,29.47276 0,22.08051 -82.08146,0 0,-22.08051 z m 3.68771,29.47272 0,59.04142 -87.43459,0 0,-59.04142 z m -36.520293,32.8328 0,-8.25615 -14.393997,0 0,8.25615 z M 233.04047,836.808 l 0,91.29833 -18.31963,0 29.26382,70.75373 -42.34927,15.74434 -32.95154,-86.49807 -5.82897,0 -7.73231,86.69007 -43.65782,-5.0882 8.56502,-97.34635 0,-75.55386 z m -45.08532,57.21743 0,-23.32858 -24.14861,0 0,23.32858 z" />
+  </g>
+</svg>