From 82ad98e302c9c5077b6ee68e1229db7a791d8ad5 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Sat, 26 Dec 2015 14:59:13 +0300 Subject: [PATCH] Replace artlebedev typograph with mdash --- Typograph.py | 57 +++++++++++++----------- lib/artlebedev.py | 111 ---------------------------------------------- lib/mdash.py | 65 +++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 136 deletions(-) delete mode 100644 lib/artlebedev.py create mode 100644 lib/mdash.py diff --git a/Typograph.py b/Typograph.py index 0119b40..acadcb6 100644 --- a/Typograph.py +++ b/Typograph.py @@ -1,7 +1,7 @@ import sublime import sublime_plugin -from .lib.artlebedev import RemoteTypograf +from .lib.mdash import Typograph __author__ = 'Anton Vakhrushev' @@ -11,48 +11,55 @@ __email__ = 'anwinged@ya.ru' PLUGIN_NAME = 'Typograph' DEFAULT_SETTINGS = { - 'type': 'html', - 'breaks': False, - 'paragraphs': False, - 'max_no_break': 3, + 'rules' = {} } class TypographSelectionCommand(sublime_plugin.TextCommand): - """ - Process selections of html text - """ + """Process selections of html text""" def run(self, edit): + """Executes command""" + settings = self.__get_settings() + rules = settings.get('rules', {}) - settings = self.get_settings() - - typograf = RemoteTypograf() - typograf.htmlEntities() - typograf.br(settings['breaks']) - typograf.p(settings['paragraphs']) - typograf.nobr(settings['max_no_break']) + typograph = Typograph(rules) for region in self.view.sel(): - processed = typograf.processText(self.view.substr(region)) - self.view.replace(edit, region, processed.strip()) + regionText = self.view.substr(region) + processed = typograph.process(regionText).strip() + self.view.replace(edit, region, processed) + def __get_settings(self): + """Loads plugin settings""" + local_settings = self.__get_local_settings() + project_settings = self.__get_project_settings() + self.__merge_settings(local_settings, project_settings) + return local_settings - def get_settings(self): - """ - Load plugin settings - """ - settings = sublime.load_settings('{}.sublime-settings'.format(PLUGIN_NAME)) - project_settings = self.view.settings().get(PLUGIN_NAME, {}) + def __get_local_settings(self): + """Returns local settings""" + filename = self.__get_settings_filename() + settings = sublime.load_settings(filename) local_settings = DEFAULT_SETTINGS.copy() for key in DEFAULT_SETTINGS: local_settings[key] = settings.get(key) + return local_settings + + def __get_project_settings(self): + """Return project settings""" + return self.view.settings().get(PLUGIN_NAME, {}) + + def __get_settings_filename(self): + """Returns plugin settings filename""" + return '{}.sublime-settings'.format(PLUGIN_NAME) + + def __merge_settings(self, local_settings, project_settings): + """Overrides local settings with project settings""" for key in project_settings: if key in DEFAULT_SETTINGS: local_settings[key] = project_settings[key] else: print('{}: invalid key "{}" in project settings'.format(PLUGIN_NAME, key)) - - return local_settings diff --git a/lib/artlebedev.py b/lib/artlebedev.py deleted file mode 100644 index d2102dc..0000000 --- a/lib/artlebedev.py +++ /dev/null @@ -1,111 +0,0 @@ -""" -remotetypograf.py -python-implementation of ArtLebedevStudio.RemoteTypograf class (web-service client) - -Copyright (c) Art. Lebedev Studio | http://www.artlebedev.ru/ - -Typograf homepage: http://typograf.artlebedev.ru/ -Web-service address: http://typograf.artlebedev.ru/webservices/typograf.asmx -WSDL-description: http://typograf.artlebedev.ru/webservices/typograf.asmx?WSDL - -Default charset: UTF-8 - -Python version -Author: Sergey Lavrinenko (s.lavrinenko@gmail.com) -Version: 1.0 (2007-05-18) based on script by Andrew Shitov (ash@design.ru) - -Example: - from RemoteTypograf import RemoteTypograf - rt = RemoteTypograf() - # rt = RemoteTypograf('windows-1251') - print rt.processText ('"Вы все еще кое-как верстаете в "Ворде"? - Тогда мы идем к вам!"'); -""" - - -import socket - - -class RemoteTypograf: - - _entityType = 4 - _useBr = 1 - _useP = 1 - _maxNobr = 3 - _encoding = 'UTF-8' - - def __init__(self, encoding='UTF-8'): - self._encoding = encoding - - def htmlEntities(self): - self._entityType = 1 - - def xmlEntities(self): - self._entityType = 2 - - def mixedEntities(self): - self._entityType = 4 - - def noEntities(self): - self._entityType = 3 - - def br(self, value): - self._useBr = 1 if value else 0 - - - def p(self, value): - self._useP = 1 if value else 0 - - def nobr(self, value): - self._maxNobr = int(value) if value else 0 - - def processText(self, text): - - text = text.replace('&', '&') - text = text.replace('<', '<') - text = text.replace ('>', '>') - - SOAPBody = '\n' - SOAPBody += '\n' - SOAPBody += '\r\n' - SOAPBody += ' \n' - SOAPBody += ' %s\n' % text - SOAPBody += ' %s\n' % self._entityType - SOAPBody += ' %s\n' % self._useBr - SOAPBody += ' %s\n' % self._useP - SOAPBody += ' %s\n' % self._maxNobr - SOAPBody += ' \n' - SOAPBody += ' \n' - SOAPBody += '\n' - - host = 'typograf.artlebedev.ru'; - SOAPRequest = 'POST /webservices/typograf.asmx HTTP/1.1\n' - SOAPRequest += 'Host: typograf.artlebedev.ru\n' - SOAPRequest += 'Content-Type: text/xml\n' - SOAPRequest += 'Content-Length: %d\n' % len(bytearray(SOAPBody, 'utf-8')) - SOAPRequest += 'SOAPAction: "http://typograf.artlebedev.ru/webservices/ProcessText"\n\n' - - SOAPRequest += SOAPBody - - remoteTypograf = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - remoteTypograf.connect((host, 80)) - remoteTypograf.sendall(bytearray(SOAPRequest, 'utf-8')) - - typografResponse = bytearray() - while 1: - buf = remoteTypograf.recv(8192) - if len(buf) == 0: break - typografResponse += buf - - remoteTypograf.close() - - typografResponse = typografResponse.decode(encoding='utf-8') - - startsAt = typografResponse.find('') + 19 - endsAt = typografResponse.find('') - typografResponse = typografResponse[startsAt:endsAt] - - typografResponse = typografResponse.replace('&', '&' ) - typografResponse = typografResponse.replace('<', '<') - typografResponse = typografResponse.replace ('>', '>') - - return typografResponse diff --git a/lib/mdash.py b/lib/mdash.py new file mode 100644 index 0000000..d57ddc9 --- /dev/null +++ b/lib/mdash.py @@ -0,0 +1,65 @@ +import json +import urllib.request + + +__author__ = 'Anton Vakhrushev' +__email__ = 'anwinged@ya.ru' + + +MDASH_URL = 'http://mdash.ru/api.v1.php' + + +class TypographError(RuntimeError): + pass + + +class Typograph(object): + + def __init__(self, rules = None): + self.rules = self.__prepare_rules(rules) + + def process(self, text): + data = self.__prepare_data(text) + answer = self.__request(data) + answer = json.loads(answer) + self.__ensure_answer_is_correct(answer) + return answer['result'] + + def __prepare_data(self, text): + data = {} + data.update(self.rules) + data.update({'text': text}) + return data + + def __request(self, data): + data = urllib.parse.urlencode(data) + data = data.encode('utf-8') + request = urllib.request.Request(MDASH_URL, data) + responce = urllib.request.urlopen(request) + return responce.read().decode('utf-8') + + def __ensure_answer_is_correct(self, answer): + if answer.get('status') == 'error': + raise TypographError() + + def __prepare_rules(self, params): + + def convert(v): + return 'on' if v == 'on' or v == True else 'off' + + result = {} + params = params or {} + + for k in params: + result[k] = convert(params[k]) + + return result + + +if __name__ == '__main__': + params = { + 'Text.paragraphs': False, + 'Text.breakline': 'off', + } + t = Typograph(params) + print(t.process('"Вы все еще кое-как верстаете в "Ворде"? - Тогда мы идем к вам!"'))