diff --git a/TODO.txt b/TODO.txt index 878e9cc7..e2a060bf 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,3 +1,2 @@ - [GUI] Store checked links in urldata list; display in a QTreeWidget; columns result (as icon), URL, name; doubleclick opens property popup -- [GUI] Integrate sphinx documentation diff --git a/doc/Makefile b/doc/Makefile index ada3687c..c15d655a 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -11,17 +11,52 @@ PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source -.PHONY: help clean html web pickle htmlhelp latex changes linkcheck homepage test po4a api +.PHONY: help clean html web pickle htmlhelp latex changes linkcheck -all: clean html compress +all: + @echo "Available targets: build-html build-htmlhelp" + +build-html: clean html + +build-htmlhelp: clean htmlhelp helpfiles html: mkdir -p build/html build/doctrees - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) build/html - rm build/html/_static/Makefile build/html/_static/favicon*.png + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) build/html + rm build/html/_static/Makefile + rm build/html/_static/default.css + rm build/html/_static/*.js + rm build/html/_static/contents.png + rm build/html/_static/plus.png + rm build/html/_static/file.png + rm build/html/_static/minus.png + rm build/html/_static/navigation.png + rm build/html/_static/rightsidebar.css + rm build/html/_static/stickysidebar.css + rm build/html/_static/sphinxdoc.css + rm build/html/_static/traditional.css @echo @echo "Build finished. The HTML pages are in build/html." +htmlhelp: + mkdir -p build/htmlhelp build/doctrees + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) build/htmlhelp + rm build/htmlhelp/LinkChecker* + rm build/htmlhelp/_static/Makefile + rm build/htmlhelp/_static/default.css + rm build/htmlhelp/_static/*.js + rm build/htmlhelp/_static/contents.png + rm build/htmlhelp/_static/plus.png + rm build/htmlhelp/_static/file.png + rm build/htmlhelp/_static/minus.png + rm build/htmlhelp/_static/navigation.png + rm build/htmlhelp/_static/rightsidebar.css + rm build/htmlhelp/_static/stickysidebar.css + rm build/htmlhelp/_static/sphinxdoc.css + rm build/htmlhelp/_static/traditional.css + @echo + @echo "Build finished. The HTML pages are in build/htmlhelp." + pickle: mkdir -p build/pickle build/doctrees $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) build/pickle @@ -36,13 +71,6 @@ json: @echo @echo "Build finished; now you can process the JSON files." -htmlhelp: - mkdir -p build/htmlhelp build/doctrees - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) build/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in build/htmlhelp." - latex: mkdir -p build/latex build/doctrees $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) build/latex @@ -66,24 +94,33 @@ linkcheck: clean: -rm -rf build/* - -homepage: clean html compress - cp -r build/html/* $(HOME)/public_html/linkchecker.sf.net/htdocs + -rm -f *.qhc *.qch test: html xmllint --valid --noout build/html/*.html -po4a: - po4a --localized-charset=UTF-8 po4a.conf - -api: - epydoc --html -o api --name "LinkChecker source documentation" --url ../index.html ../linkcheck/ - - YUICOMP_VERSION=2.4.2 YUICOMP=$(HOME)/src/yuicompressor-$(YUICOMP_VERSION)/build compress: python mediacompress.py --overwrite=png,jpg,gif,js,css \ --js-compressor=$(YUICOMP)/yuicompressor-$(YUICOMP_VERSION).jar \ - build/html + build + + +HELPFILES = lccollection.qhc + +helpfiles: $(HELPFILES) + +%.qhc: %.qhcp lcdoc.qhp + qcollectiongenerator $< -o $@ + + +homepage: build-html compress + cp -r build/html/* $(HOME)/public_html/linkchecker.sf.net/htdocs + +po4a: + po4a --localized-charset=UTF-8 po4a.conf + +api: + epydoc --html -o api --name "LinkChecker source documentation" --url ../index.html ../linkcheck/ diff --git a/doc/lccollection.qhc b/doc/lccollection.qhc new file mode 100644 index 00000000..e2f41775 Binary files /dev/null and b/doc/lccollection.qhc differ diff --git a/doc/lccollection.qhcp b/doc/lccollection.qhcp new file mode 100644 index 00000000..9cee08bf --- /dev/null +++ b/doc/lccollection.qhcp @@ -0,0 +1,23 @@ + + + + LinkChecker + build/htmlhelp/_static/favicon16x16.png + bfk/LinkChecker + qthelp://bfk.app.linkchecker/doc/documentation.html + false + false + false + + + + + lcdoc.qhp + lcdoc.qch + + + + lcdoc.qch + + + diff --git a/doc/lcdoc.qch b/doc/lcdoc.qch new file mode 100644 index 00000000..c3544d80 Binary files /dev/null and b/doc/lcdoc.qch differ diff --git a/doc/lcdoc.qhp b/doc/lcdoc.qhp new file mode 100644 index 00000000..e000a9f4 --- /dev/null +++ b/doc/lcdoc.qhp @@ -0,0 +1,13 @@ + + + bfk.app.linkchecker + doc + + +
+ + + build/htmlhelp/documentation.html + + + diff --git a/linkcheck/gui/__init__.py b/linkcheck/gui/__init__.py index 0e13e82b..8d3ab242 100644 --- a/linkcheck/gui/__init__.py +++ b/linkcheck/gui/__init__.py @@ -16,13 +16,14 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import os -from PyQt4 import QtCore, QtGui +from PyQt4 import QtCore, QtGui, QtHelp from .linkchecker_ui_main import Ui_MainWindow from .linkchecker_ui_options import Ui_Options from .. import configuration, checker, director, add_intern_pattern, \ strformat from ..containers import enum +DocBaseUrl = "qthelp://bfk.app.linkchecker/doc/build/htmlhelp/" Status = enum('idle', 'checking', 'stopping') @@ -40,15 +41,14 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): else: self.output.setFontFamily("mono") self.checker = Checker() - settings = QtCore.QSettings('bfk', configuration.AppName) settings.beginGroup('mainwindow') - if settings.contains('size'): self.resize(settings.value('size').toSize()) self.move(settings.value('pos').toPoint()) settings.endGroup() - + # Note: we can't use QT assistant here because of the .exe packaging + self.assistant = HelpWindow(self, "doc/lccollection.qhc") self.connect(self.checker, QtCore.SIGNAL("finished()"), self.set_status_idle) self.connect(self.checker, QtCore.SIGNAL("terminated()"), self.set_status_idle) self.connect(self.checker, QtCore.SIGNAL("add_message(QString)"), self.add_message) @@ -57,6 +57,7 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): self.connect(self.optionsButton, QtCore.SIGNAL("clicked()"), self.options.exec_) self.connect(self.actionQuit, QtCore.SIGNAL("triggered()"), self.close) self.connect(self.actionAbout, QtCore.SIGNAL("triggered()"), self.about) + self.connect(self.actionHelp, QtCore.SIGNAL("triggered()"), self.showDocumentation) self.status = Status.idle def get_status (self): @@ -94,6 +95,11 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): """Set idle status. Helper function for signal connections.""" self.status = Status.idle + def showDocumentation (self): + """Show help page.""" + url = QtCore.QUrl("%sindex.html" % DocBaseUrl) + self.assistant.showDocumentation(url) + def closeEvent (self, e=None): """Save settings on close.""" settings = QtCore.QSettings('bfk', configuration.AppName) @@ -187,6 +193,63 @@ Version 2 or later.

self.statusBar.showMessage(msg) +class HelpWindow (QtGui.QDialog): + """A custom help display dialog.""" + + def __init__ (self, parent, qhcpath): + """Initialize dialog and load qhc help project from given path.""" + super(HelpWindow, self).__init__(parent) + self.engine = QtHelp.QHelpEngine(qhcpath, self) + self.engine.setupData() + self.setWindowTitle(u"%s Help" % configuration.AppName) + self.build_ui() + + def build_ui (self): + """Build UI for the help window.""" + splitter = QtGui.QSplitter() + splitter.setOrientation(QtCore.Qt.Vertical) + self.browser = HelpBrowser(splitter, self.engine) + tree = self.engine.contentWidget() + tree.setExpandsOnDoubleClick(False) + splitter.addWidget(tree) + splitter.addWidget(self.browser) + splitter.setSizes((70, 530)) + hlayout = QtGui.QHBoxLayout() + hlayout.addWidget(splitter) + self.setLayout(hlayout) + self.resize(800, 600) + self.connect(self.engine.contentWidget(), + QtCore.SIGNAL("linkActivated(QUrl)"), + self.browser, QtCore.SLOT("setSource(QUrl)")) + + def showDocumentation (self, url): + """Show given URL in help browser.""" + self.browser.setSource(url) + self.show() + + +class HelpBrowser (QtGui.QTextBrowser): + """A QTextBrowser that can handle qthelp:// URLs.""" + + def __init__ (self, parent, engine): + """Initialize and store given HelpEngine instance.""" + super(HelpBrowser, self).__init__(parent) + self.engine = engine + + def setSource (self, url): + if url.scheme() == "http": + import webbrowser + webbrowser.open(str(url.toString())) + else: + QtGui.QTextBrowser.setSource(self, url) + + def loadResource (self, rtype, url): + """Handle qthelp:// URLs, load content from help engine.""" + if url.scheme() == "qthelp": + return QtCore.QVariant(self.engine.fileData(url)) + return QtGui.QTextBrowser.loadResource(self, rtype, url) + + class LinkCheckerOptions (QtGui.QDialog, Ui_Options): """Hold options for current URL to check.""" diff --git a/linkcheck/gui/linkchecker_ui_main.py b/linkcheck/gui/linkchecker_ui_main.py index 1fc38fc3..3e072527 100644 --- a/linkcheck/gui/linkchecker_ui_main.py +++ b/linkcheck/gui/linkchecker_ui_main.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'ui/main.ui' # -# Created: Sat Jan 24 19:15:50 2009 +# Created: Wed Feb 18 19:58:39 2009 # by: PyQt4 UI code generator 4.4.4 # # WARNING! All changes made in this file will be lost! @@ -72,8 +72,11 @@ class Ui_MainWindow(object): self.actionQuit.setObjectName("actionQuit") self.actionAbout = QtGui.QAction(MainWindow) self.actionAbout.setObjectName("actionAbout") + self.actionHelp = QtGui.QAction(MainWindow) + self.actionHelp.setObjectName("actionHelp") self.menuLinkChecka.addAction(self.actionQuit) self.menuHelp.addAction(self.actionAbout) + self.menuHelp.addAction(self.actionHelp) self.menubar.addAction(self.menuLinkChecka.menuAction()) self.menubar.addAction(self.menuHelp.menuAction()) self.label.setBuddy(self.urlinput) @@ -91,5 +94,6 @@ class Ui_MainWindow(object): self.menuHelp.setTitle(QtGui.QApplication.translate("MainWindow", "Help", None, QtGui.QApplication.UnicodeUTF8)) self.actionQuit.setText(QtGui.QApplication.translate("MainWindow", "Quit", None, QtGui.QApplication.UnicodeUTF8)) self.actionAbout.setText(QtGui.QApplication.translate("MainWindow", "About", None, QtGui.QApplication.UnicodeUTF8)) + self.actionHelp.setText(QtGui.QApplication.translate("MainWindow", "Help", None, QtGui.QApplication.UnicodeUTF8)) import linkchecker_rc diff --git a/linkcheck/gui/ui/main.ui b/linkcheck/gui/ui/main.ui index 8c2ba822..7145da5f 100644 --- a/linkcheck/gui/ui/main.ui +++ b/linkcheck/gui/ui/main.ui @@ -123,6 +123,7 @@ Help + @@ -138,6 +139,11 @@ About + + + Help + +