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