init
This commit is contained in:
commit
dd28efbae6
3
Default (Linux).sublime-keymap
Normal file
3
Default (Linux).sublime-keymap
Normal file
@ -0,0 +1,3 @@
|
||||
[
|
||||
{"keys": ["ctrl+shift+t"], "command": "typograph_selection"}
|
||||
]
|
3
Default (OSX).sublime-keymap
Normal file
3
Default (OSX).sublime-keymap
Normal file
@ -0,0 +1,3 @@
|
||||
[
|
||||
{"keys": ["ctrl+shift+t"], "command": "typograph_selection"}
|
||||
]
|
6
Default (Windows).sublime-keymap
Normal file
6
Default (Windows).sublime-keymap
Normal file
@ -0,0 +1,6 @@
|
||||
[
|
||||
{
|
||||
"keys": ["ctrl+shift+t"],
|
||||
"command": "typograph_selection"
|
||||
}
|
||||
]
|
6
Default.sublime-commands
Normal file
6
Default.sublime-commands
Normal file
@ -0,0 +1,6 @@
|
||||
[
|
||||
{
|
||||
"caption": "Typograph: typo selection",
|
||||
"command": "typograph_selection"
|
||||
}
|
||||
]
|
3
README.md
Normal file
3
README.md
Normal file
@ -0,0 +1,3 @@
|
||||
# Typograph
|
||||
|
||||
Плагин для Sublime Text 3, который позволяет типографировать html-текст.
|
77
Typograph.py
Normal file
77
Typograph.py
Normal file
@ -0,0 +1,77 @@
|
||||
import sublime
|
||||
import sublime_plugin
|
||||
|
||||
from .lib.artlebedev import RemoteTypograf
|
||||
|
||||
|
||||
__author__ = 'Anton Vakhrushev'
|
||||
__email__ = 'anwinged@ya.ru'
|
||||
|
||||
|
||||
PLUGIN_NAME = 'Typograph'
|
||||
|
||||
DEFAULT_SETTINGS = {
|
||||
'type': 'html',
|
||||
'breaks': False,
|
||||
'paragraphs': False,
|
||||
'max_no_break': 3,
|
||||
}
|
||||
|
||||
|
||||
class TypographSelectionCommand(sublime_plugin.TextCommand):
|
||||
"""
|
||||
Process selections of html text
|
||||
"""
|
||||
|
||||
def run(self, edit):
|
||||
|
||||
settings = self.get_settings()
|
||||
|
||||
typograf = RemoteTypograf()
|
||||
typograf.htmlEntities()
|
||||
typograf.br(settings['breaks'])
|
||||
typograf.p(settings['paragraphs'])
|
||||
typograf.nobr(settings['max_no_break'])
|
||||
|
||||
for region in self.view.sel():
|
||||
processed = typograf.processText(self.view.substr(region))
|
||||
self.view.replace(edit, region, processed)
|
||||
|
||||
|
||||
def get_settings(self):
|
||||
"""
|
||||
Load plugin settings
|
||||
"""
|
||||
settings = sublime.load_settings('{}.sublime-settings'.format(PLUGIN_NAME))
|
||||
project_settings = self.view.settings().get(PLUGIN_NAME, {})
|
||||
local_settings = DEFAULT_SETTINGS.copy()
|
||||
|
||||
for key in DEFAULT_SETTINGS:
|
||||
local_settings[key] = settings.get(key)
|
||||
|
||||
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
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# "Вы все еще кое-как верстаете в "Ворде"? - Тогда мы идем к вам!"
|
||||
|
||||
"""
|
||||
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
<header class="section_header">Как это работает?</header>
|
||||
<p class="section_brief">Вы подключаете модемы к своим приборам учета,
|
||||
и наши сервера производят сбор данных. Вам не надо покупать, устанавливать и настраивать
|
||||
на своем компьютере сложное и дорогое программное обеспечение и оборудование. Получать данные
|
||||
и просматривать отчеты можно из любой точки мира с помощью компьютера, планшета или смартфона.
|
||||
Работайте быстро, гибко и дешево!</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
"""
|
9
Typograph.sublime-settings
Normal file
9
Typograph.sublime-settings
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"type": "html",
|
||||
|
||||
"breaks": false,
|
||||
|
||||
"paragraphs": false,
|
||||
|
||||
"max_no_break": 3
|
||||
}
|
1
lib/__init__.py
Normal file
1
lib/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
__author__ = 'Anton Vakhrushev'
|
111
lib/artlebedev.py
Normal file
111
lib/artlebedev.py
Normal file
@ -0,0 +1,111 @@
|
||||
"""
|
||||
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 = '<?xml version="1.0" encoding="UTF-8"?>\n'
|
||||
SOAPBody += '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">\n'
|
||||
SOAPBody += '<soap:Body>\r\n'
|
||||
SOAPBody += ' <ProcessText xmlns="http://typograf.artlebedev.ru/webservices/">\n'
|
||||
SOAPBody += ' <text>%s</text>\n' % text
|
||||
SOAPBody += ' <entityType>%s</entityType>\n' % self._entityType
|
||||
SOAPBody += ' <useBr>%s</useBr>\n' % self._useBr
|
||||
SOAPBody += ' <useP>%s</useP>\n' % self._useP
|
||||
SOAPBody += ' <maxNobr>%s</maxNobr>\n' % self._maxNobr
|
||||
SOAPBody += ' </ProcessText>\n'
|
||||
SOAPBody += ' </soap:Body>\n'
|
||||
SOAPBody += '</soap:Envelope>\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('<ProcessTextResult>') + 19
|
||||
endsAt = typografResponse.find('</ProcessTextResult>')
|
||||
typografResponse = typografResponse[startsAt:endsAt]
|
||||
|
||||
typografResponse = typografResponse.replace('&', '&' )
|
||||
typografResponse = typografResponse.replace('<', '<')
|
||||
typografResponse = typografResponse.replace ('>', '>')
|
||||
|
||||
return typografResponse
|
Loading…
Reference in New Issue
Block a user