1 | """ |
---|
2 | documentation module provides a simple means to add help throughout the |
---|
3 | application. It checks for the existence of html2 package needed to support |
---|
4 | fully html panel which supports css. The class defined here takes a title for |
---|
5 | the particular help panel, a pointer to the html documentation file of interest |
---|
6 | within the documentation tree along with a 'command' string such as a page |
---|
7 | anchor or a query string etc. The path to the doc directory is retrieved |
---|
8 | automatically by the class itself. Thus with these three pieces of information |
---|
9 | the class generates a panel with the appropriate title bar and help file |
---|
10 | formatted according the style sheets called in the html file. Finally, if an |
---|
11 | old version of Python is running and the html2 package is not available the |
---|
12 | class brings up the default browser and passes the file:/// string to it. In |
---|
13 | this case however the instruction portion is usually not passed for security |
---|
14 | reasons. |
---|
15 | """ |
---|
16 | import os |
---|
17 | import logging |
---|
18 | import wx |
---|
19 | import webbrowser |
---|
20 | import urllib |
---|
21 | import sys |
---|
22 | |
---|
23 | logger = logging.getLogger(__name__) |
---|
24 | |
---|
25 | SPHINX_DOC_ENV = "SASVIEW_DOC_PATH" |
---|
26 | WX_SUPPORTS_HTML2 = True |
---|
27 | try: |
---|
28 | import wx.html2 as html |
---|
29 | except: |
---|
30 | WX_SUPPORTS_HTML2 = False |
---|
31 | |
---|
32 | |
---|
33 | from gui_manager import get_app_dir |
---|
34 | |
---|
35 | |
---|
36 | class DocumentationWindow(wx.Frame): |
---|
37 | """ |
---|
38 | DocumentationWindow inherits from wx.Frame and provides a centralized |
---|
39 | coherent framework for all help documentation. Help files must be html |
---|
40 | files stored in an properly organized tree below the top 'doc' folder. In |
---|
41 | order to display the appropriate help file from anywhere in the gui, the |
---|
42 | code simply needs to know the location below the top level where the |
---|
43 | help file resides along with the name of the help file. |
---|
44 | called |
---|
45 | (self, parent, dummy_id, path, url_instruction, title, size=(850, 540)) |
---|
46 | |
---|
47 | :param path: path to html file beginning AFTER /doc/ and ending in the\ |
---|
48 | file.html. |
---|
49 | :param url_instructions: anchor string or other query e.g. '#MyAnchor' |
---|
50 | :param title: text to place in the title bar of the help panel |
---|
51 | """ |
---|
52 | def __init__(self, parent, dummy_id, path, url_instruction, title, size=(850, 540)): |
---|
53 | wx.Frame.__init__(self, parent, dummy_id, title, size=size) |
---|
54 | |
---|
55 | if SPHINX_DOC_ENV in os.environ: |
---|
56 | docs_path = os.path.join(os.environ[SPHINX_DOC_ENV]) |
---|
57 | else: |
---|
58 | # For the installer, docs are in a top-level directory. We're not |
---|
59 | # bothering to worry about docs when running using the old |
---|
60 | # (non - run.py) way. |
---|
61 | docs_path = os.path.join(get_app_dir(), "doc") |
---|
62 | |
---|
63 | #note that filepath for mac OS, at least in bundle starts with a |
---|
64 | #forward slash as /Application, while the PC string begins C:\ |
---|
65 | #It seems that mac OS is happy with four slashes as in file:////App... |
---|
66 | #Two slashes is not sufficient to indicate path from root. Thus for now |
---|
67 | #we use "file:///" +... If the mac behavior changes may need to make the |
---|
68 | #file:/// be another constant at the beginning that yields // for Mac |
---|
69 | #and /// for PC. |
---|
70 | #Note added June 21, 2015 PDB |
---|
71 | file_path = os.path.join(docs_path, path) |
---|
72 | url = "file:///" + urllib.quote(file_path, r'/\:')+ url_instruction |
---|
73 | |
---|
74 | if not os.path.exists(file_path): |
---|
75 | logger.error("Could not find Sphinx documentation at %s \ |
---|
76 | -- has it been built?", file_path) |
---|
77 | elif WX_SUPPORTS_HTML2: |
---|
78 | # Complete HTML/CSS support! |
---|
79 | self.view = html.WebView.New(self) |
---|
80 | self.view.LoadURL(url) |
---|
81 | self.Show() |
---|
82 | else: |
---|
83 | logger.error("No html2 support, popping up a web browser") |
---|
84 | #For cases that do not build against current version dependency |
---|
85 | # Wx 3.0 we provide a webbrowser call - this is particularly for |
---|
86 | #Red hat used at SNS for which Wx 3.0 is not available. This |
---|
87 | #does not deal with issue of math in docs of course. |
---|
88 | webbrowser.open_new_tab(url) |
---|
89 | |
---|
90 | def main(): |
---|
91 | """ |
---|
92 | main loop function if running alone for testing. |
---|
93 | """ |
---|
94 | app = wx.App() |
---|
95 | DocumentationWindow(None, -1, "index.html", "", "Documentation",) |
---|
96 | app.MainLoop() |
---|
97 | |
---|
98 | if __name__ == '__main__': |
---|
99 | main() |
---|