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
+
+
+
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
+
+