#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);
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
RESOURCES += \
proxy.qrc
-RC_FILE = wordring.rc
+#RC_FILE = wordring.rc
RC_ICONS = wordring.ico
#DISTFILES +=
--- /dev/null
+
+
+body {
+ font-family: 'ヒラギノ角ゴ ProN W3', 'Hiragino Kaku Gothic ProN', 'メイリオ', Meiryo, sans-serif;
+}
+
--- /dev/null
+
+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();
+ });
+}
+
+
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()));
}
/*!
{
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;
assert(saction);
m_slang->setIcon(saction->icon());
m_slang->setData(saction->data());
+
+ emit sourceLanguageChanged();
}
/*!
assert(taction);
m_tlang->setIcon(taction->icon());
m_tlang->setData(taction->data());
+
+ emit targetLanguageChanged();
}
/*!
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);
, 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()
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 ----------------------------------------------------------------
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()));
// 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";
, m_html(html_)
{
QString path = settings->value("DefaultHtmlModule/file").toString();
- QString prefix = settings->value("ProxyModule/prefix").toString();
QFile file(path);
file.open(QIODevice::ReadOnly);
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();
}
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;
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
set_edit_mode(edit_mode);
}
+void TM::SocketConnection::changeLanguage()
+{
+ QJsonObject json;
+ json["cmd"] = "reload";
+ send_message(json);
+}
+
/*!
* \brief ブラウザに編集モードを反映します。
*
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,
public slots:
void changeEditMode(bool edit_mode);
+ void changeLanguage();
private:
void set_segment(int segment_id, QString html);
--- /dev/null
+<?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>