| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| '''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) |
|
|