Очередной раз нажав Ctrl-C в адресной строке браузера я вспомнил о существовании одной полезной программки на моем компьютере. Не уверен что в чистом виде она кому-нибудь понадобится, но ее идеи могут стать основой для ваших программ.
Я использую RSS для получения новых публикаций с Хабра. Большинство из них я даже не открываю - не мой круг интересов, но некоторые все таки привлекают внимание и я нажимаю на линк. Если статья короткая - я могу сразу ее прочитать, но если статья длинная или содержит много кода, в котором нужно вдумчиво разбираться - логично отложить ее прочтение на будущее, добавив в закладки. Все было бы хорошо, если бы не одно но... Статьи, особенно в хабе "Из песочницы" имеют свойство часто исчезать, еще до того как я нашел время на их прочтение.
Можно сохранять статьи в виде MHT, но забросить ее на телефон/планшет/букридер и прочитать на рыбалке уже не получится. Можно воспользоваться wkhtmltopdf, но это куча лишних телодвижений, которые лень совершать изо дня в день. Так родилась идея сделать программку, которая:
Я использую RSS для получения новых публикаций с Хабра. Большинство из них я даже не открываю - не мой круг интересов, но некоторые все таки привлекают внимание и я нажимаю на линк. Если статья короткая - я могу сразу ее прочитать, но если статья длинная или содержит много кода, в котором нужно вдумчиво разбираться - логично отложить ее прочтение на будущее, добавив в закладки. Все было бы хорошо, если бы не одно но... Статьи, особенно в хабе "Из песочницы" имеют свойство часто исчезать, еще до того как я нашел время на их прочтение.
Можно сохранять статьи в виде MHT, но забросить ее на телефон/планшет/букридер и прочитать на рыбалке уже не получится. Можно воспользоваться wkhtmltopdf, но это куча лишних телодвижений, которые лень совершать изо дня в день. Так родилась идея сделать программку, которая:
- Постоянно болтается в памяти и для превращения поста в pdf не требует никаких лишних телодвижений
- Убирает все лишнее со страницы, чтобы остался только интересный контент
- Легко могла быть модифицирована в случае изменения разметки страниц на сайте
Итак встречайте: habr2pdf
#!/usr/bin/python
import sys
import re
import os
from PyQt4 import QtCore, QtGui, QtNetwork, QtWebKit
outputpath="/home/ievgen/DocumentToIndex"
class httpWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(httpWidget, self).__init__(parent)
self.clipboard = QtGui.QApplication.clipboard()
QtCore.QObject.connect(self.clipboard,QtCore.SIGNAL("dataChanged()"), self.clipboardchanged)
self.webview = QtWebKit.QWebView()
QtCore.QObject.connect(self.webview,QtCore.SIGNAL("loadFinished(bool)"), self.gotpage)
def clipboardchanged(self):
mimedata = self.clipboard.mimeData()
if mimedata.hasUrls():
self.url=self.clipboard.text()
if re.search("^http://habrahabr.ru/post/",self.url):
self.webview.setUrl(QtCore.QUrl(self.url))
def gotpage(self,ready):
self.webview.page().mainFrame().evaluateJavaScript("name='"+unicode(self.url)+"""';
header = document.createElement("div");
header.textContent=name;
empty = document.createElement("div");
toremove=document.getElementById('header')
toremove.parentNode.replaceChild(empty,toremove);
toremove=document.getElementsByClassName('sidebar_right')[0];
toremove.parentNode.replaceChild(empty,toremove);
toremove=document.getElementById('comments')
toremove.parentNode.replaceChild(empty,toremove);
toremove=document.getElementById('footer');
toremove.parentNode.replaceChild(empty,toremove);
toremove=document.getElementById('topline');
toremove.parentNode.replaceChild(header,toremove);
div=document.getElementsByClassName("content_left")[0];
div.style.width="95%";
""");
outputName = re.search("^http://habrahabr.ru/post/(.*?)/$",unicode(self.url))
contentsSize = self.webview.page().mainFrame().contentsSize();
self.webview.page().setViewportSize ( contentsSize )
self.printer = QtGui.QPrinter ( QtGui.QPrinter.ScreenResolution )
self.printer.setOutputFormat ( QtGui.QPrinter.PdfFormat )
self.printer.setPaperSize ( QtGui.QPrinter.A4 )
self.printer.setOrientation ( QtGui.QPrinter.Portrait )
self.printer.setOutputFileName ( outputpath + "/" + outputName.group(1)+".pdf" )
self.printer.setPageMargins(10, 15, 10, 15, QtGui.QPrinter.Millimeter)
self.webview.page().mainFrame().print_ ( self.printer )
class SystemTrayIcon(QtGui.QSystemTrayIcon):
def __init__(self, icon, parent=None):
QtGui.QSystemTrayIcon.__init__(self, icon, parent)
self.parent = parent
self.menu = QtGui.QMenu(parent)
exitAction = self.menu.addAction("Exit")
self.setContextMenu(self.menu)
self.connect(exitAction, QtCore.SIGNAL('triggered()'), self.quit)
def quit(self):
del self.parent
QtGui.qApp.quit()
if __name__ == "__main__":
pid = os.fork()
if pid > 0:
sys.exit(0)
app = QtGui.QApplication(sys.argv)
myapp = httpWidget()
style = app.style()
icon = QtGui.QIcon(style.standardPixmap(QtGui.QStyle.SP_FileIcon))
trayIcon = SystemTrayIcon(icon,myapp)
trayIcon.show()
sys.exit(app.exec_())
Комментариев нет:
Отправить комментарий