14 мая, 2012

Habr2Pdf

Очередной раз нажав Ctrl-C в адресной строке браузера я вспомнил о существовании одной полезной программки на моем компьютере. Не уверен что в чистом виде она кому-нибудь понадобится, но ее идеи могут стать основой для ваших программ.

Я использую RSS для получения новых публикаций с Хабра. Большинство из них я даже не открываю - не мой круг интересов, но некоторые все таки привлекают внимание и я нажимаю на линк. Если статья короткая - я могу сразу ее прочитать, но если статья длинная или содержит много кода, в котором нужно вдумчиво разбираться - логично отложить ее прочтение на будущее, добавив в закладки. Все было бы хорошо, если бы не одно но... Статьи, особенно в хабе "Из песочницы" имеют свойство часто исчезать, еще до того как я нашел время на их прочтение.

Можно сохранять статьи в виде MHT, но забросить ее на телефон/планшет/букридер и прочитать на рыбалке уже не получится. Можно воспользоваться wkhtmltopdf, но это куча лишних телодвижений, которые лень совершать изо дня в день. Так родилась идея сделать программку, которая:

  1. Постоянно болтается в памяти и для превращения поста в pdf не требует никаких лишних телодвижений
  2. Убирает все лишнее со страницы, чтобы остался только интересный контент
  3. Легко могла быть модифицирована в случае изменения разметки страниц на сайте
Итак встречайте: 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_())


Комментариев нет: