|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
'''HWP5 viewer (Experimental, gtk only) |
|
|
|
|
|
Usage:: |
|
|
|
|
|
hwp5view [options] <hwp5file> |
|
|
hwp5view -h | --help |
|
|
hwp5view --version |
|
|
|
|
|
Options:: |
|
|
|
|
|
-h --help Show this screen |
|
|
--version Show version |
|
|
--loglevel=<level> Set log level. |
|
|
--logfile=<file> Set log file. |
|
|
''' |
|
|
from __future__ import absolute_import |
|
|
from __future__ import unicode_literals |
|
|
from __future__ import print_function |
|
|
from argparse import ArgumentParser |
|
|
from contextlib import closing |
|
|
from contextlib import contextmanager |
|
|
from tempfile import mkdtemp |
|
|
import gettext |
|
|
import io |
|
|
import logging |
|
|
import os.path |
|
|
import shutil |
|
|
import sys |
|
|
import urllib |
|
|
|
|
|
from . import __version__ as version |
|
|
from .cli import init_logger |
|
|
from .xmlmodel import Hwp5File |
|
|
from .hwp5html import HTMLTransform |
|
|
|
|
|
|
|
|
PY3 = sys.version_info.major == 3 |
|
|
logger = logging.getLogger(__name__) |
|
|
locale_dir = os.path.join(os.path.dirname(__file__), 'locale') |
|
|
locale_dir = os.path.abspath(locale_dir) |
|
|
t = gettext.translation('hwp5view', locale_dir, fallback=True) |
|
|
_ = t.gettext |
|
|
|
|
|
|
|
|
def main(): |
|
|
argparser = main_argparser() |
|
|
args = argparser.parse_args() |
|
|
init_logger(args) |
|
|
|
|
|
runner = runner_factory() |
|
|
|
|
|
with make_temporary_directory() as out_dir: |
|
|
with hwp5html(args.hwp5file, out_dir) as index_path: |
|
|
runner(args, index_path, out_dir) |
|
|
|
|
|
|
|
|
def main_argparser(): |
|
|
parser = ArgumentParser( |
|
|
prog='hwp5view', |
|
|
description=_( |
|
|
'HWPv5 viewer (Experimental, gtk only)' |
|
|
) |
|
|
) |
|
|
parser.add_argument( |
|
|
'--version', |
|
|
action='version', |
|
|
version='%(prog)s {}'.format(version) |
|
|
) |
|
|
parser.add_argument( |
|
|
'--loglevel', |
|
|
help=_('Set log level.'), |
|
|
) |
|
|
parser.add_argument( |
|
|
'--logfile', |
|
|
help=_('Set log file.'), |
|
|
) |
|
|
parser.add_argument( |
|
|
'hwp5file', |
|
|
metavar='<hwp5file>', |
|
|
help=_('.hwp file to view'), |
|
|
) |
|
|
return parser |
|
|
|
|
|
|
|
|
def runner_factory(): |
|
|
try: |
|
|
return runner_factory_gi() |
|
|
except ImportError: |
|
|
pass |
|
|
|
|
|
try: |
|
|
return runner_factory_pyside() |
|
|
except ImportError: |
|
|
pass |
|
|
|
|
|
raise NotImplementedError( |
|
|
'Neither gi.repository.WebKit nor pyside is found' |
|
|
) |
|
|
|
|
|
|
|
|
def runner_factory_gi(): |
|
|
from gi.repository import Gtk |
|
|
from gi.repository import WebKit |
|
|
|
|
|
def runner(args, index_path, out_dir): |
|
|
base_uri = fspath2url(out_dir) + '/' |
|
|
|
|
|
with io.open(index_path, 'rb') as f: |
|
|
content = f.read() |
|
|
|
|
|
view = WebKit.WebView() |
|
|
|
|
|
view.load_string(content, 'text/html', 'utf-8', base_uri) |
|
|
|
|
|
def on_load(webview, webframe): |
|
|
script = ('window.location.href = "dimension:" ' |
|
|
'+ document.body.scrollWidth + "x"' |
|
|
'+ document.body.scrollHeight') |
|
|
webview.execute_script(script) |
|
|
|
|
|
MIN_WIDTH = 300 |
|
|
MIN_HEIGHT = 400 |
|
|
MAX_WIDTH = 1024 |
|
|
MAX_HEIGHT = 800 |
|
|
|
|
|
view.connect('load-finished', on_load) |
|
|
|
|
|
def on_navigation_requested(webview, frame, req, data=None): |
|
|
uri = req.get_uri() |
|
|
scheme, path = uri.split(':', 1) |
|
|
if scheme == 'dimension': |
|
|
width, height = path.split('x', 1) |
|
|
width = int(width) |
|
|
height = int(height) |
|
|
width = min(width, MAX_WIDTH) |
|
|
height = min(height, MAX_HEIGHT) |
|
|
width = max(width, MIN_WIDTH) |
|
|
height = max(height, MIN_HEIGHT) |
|
|
window.resize(width + 4, height) |
|
|
return True |
|
|
return False |
|
|
|
|
|
view.connect('navigation-requested', on_navigation_requested) |
|
|
|
|
|
scrolled_window = Gtk.ScrolledWindow() |
|
|
scrolled_window.add(view) |
|
|
|
|
|
vbox = Gtk.VBox() |
|
|
vbox.pack_start(scrolled_window, expand=True, fill=True, padding=0) |
|
|
|
|
|
window = Gtk.Window() |
|
|
window.add(vbox) |
|
|
window.connect('delete-event', Gtk.main_quit) |
|
|
window.set_default_size(600, 800) |
|
|
window.show_all() |
|
|
|
|
|
Gtk.main() |
|
|
|
|
|
return runner |
|
|
|
|
|
|
|
|
def runner_factory_pyside(): |
|
|
from PySide.QtCore import QUrl |
|
|
from PySide.QtGui import QApplication |
|
|
from PySide.QtGui import QMainWindow |
|
|
from PySide.QtWebKit import QWebView |
|
|
|
|
|
class MainWindow(QMainWindow): |
|
|
pass |
|
|
|
|
|
def runner(args, index_path, out_dir): |
|
|
app = QApplication(sys.argv) |
|
|
|
|
|
frame = MainWindow() |
|
|
frame.setWindowTitle('hwp5view') |
|
|
frame.setMinimumWidth(400) |
|
|
|
|
|
url = fspath2url(index_path) |
|
|
url = QUrl(url) |
|
|
view = QWebView(frame) |
|
|
|
|
|
logger.info('Loading...') |
|
|
view.load(url) |
|
|
|
|
|
@view.loadFinished.connect |
|
|
def onLoadFinished(): |
|
|
frame.show() |
|
|
|
|
|
frame.setCentralWidget(view) |
|
|
|
|
|
app.exec_() |
|
|
|
|
|
return runner |
|
|
|
|
|
|
|
|
@contextmanager |
|
|
def make_temporary_directory(*args, **kwargs): |
|
|
path = mkdtemp(*args, **kwargs) |
|
|
try: |
|
|
logger.warning('temporary directory for contents: %s', path) |
|
|
yield path |
|
|
finally: |
|
|
shutil.rmtree(path) |
|
|
|
|
|
|
|
|
@contextmanager |
|
|
def hwp5html(filename, out_dir): |
|
|
with closing(Hwp5File(filename)) as hwp5file: |
|
|
HTMLTransform().transform_hwp5_to_dir(hwp5file, out_dir) |
|
|
yield os.path.join(out_dir, 'index.xhtml') |
|
|
|
|
|
|
|
|
def fspath2url(path): |
|
|
path = os.path.abspath(path) |
|
|
return 'file://' + urllib.pathname2url(path) |
|
|
|