mirror of https://github.com/KLayout/klayout.git
Some doc fixes as preparation for PDF generation (#1044)
* Some doc fixes as preparation for PDF generation * Some doc bug fixes and enhancements for PDF manual generation
This commit is contained in:
parent
5929ea3bc6
commit
779c2392e7
|
|
@ -600,22 +600,22 @@ delete shapes on layer 6 of cell TOP
|
|||
</tr>
|
||||
<tr>
|
||||
<td>bbox</td>
|
||||
<td><class_ref href="Box"/></td>
|
||||
<td><class_doc href="Box"/></td>
|
||||
<td>The cell's bounding box.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>dbbox</td>
|
||||
<td><class_ref href="DBox"/></td>
|
||||
<td><class_doc href="DBox"/></td>
|
||||
<td>The cell's bounding box in micrometer units.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>cell_bbox</td>
|
||||
<td><class_ref href="Box"/></td>
|
||||
<td><class_doc href="Box"/></td>
|
||||
<td>Same as "bbox" (disambiguator from shape and instance bounding boxes).</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>cell_dbbox</td>
|
||||
<td><class_ref href="DBox"/></td>
|
||||
<td><class_doc href="DBox"/></td>
|
||||
<td>Same as "dbbox" (disambiguator from shape and instance bounding boxes).</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
|||
|
|
@ -22,10 +22,10 @@
|
|||
sequence of symbolic names separated by a dot. For example:
|
||||
</p>
|
||||
|
||||
<li>
|
||||
<ul><tt>edit_menu.end</tt> is the end of the "Edit" menu </ul>
|
||||
<ul><tt>edit_menu.undo</tt> is the "Undo" entry in the "Edit" menu</ul>
|
||||
</li>
|
||||
<ul>
|
||||
<li><tt>edit_menu.end</tt> is the end of the "Edit" menu </li>
|
||||
<li><tt>edit_menu.undo</tt> is the "Undo" entry in the "Edit" menu</li>
|
||||
</ul>
|
||||
|
||||
<p>To obtain
|
||||
a list of the paths available, have a look at the "Key Bindings" page in the "Application"
|
||||
|
|
|
|||
|
|
@ -425,7 +425,7 @@ M$2 2 1 4 6 NMOS L=0.25U W=0.9U AS=0.405P AD=0.405P PS=2.7U PD=2.7U
|
|||
</p>
|
||||
|
||||
<p>
|
||||
<img src="inv_with_diodes.png"/>
|
||||
<img src="/manual/inv_with_diodes.png"/>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
|
|
@ -433,7 +433,7 @@ M$2 2 1 4 6 NMOS L=0.25U W=0.9U AS=0.405P AD=0.405P PS=2.7U PD=2.7U
|
|||
</p>
|
||||
|
||||
<p>
|
||||
<img src="inv_schematic2.png"/>
|
||||
<img src="/manual/inv_schematic2.png"/>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
|
|
|
|||
|
|
@ -226,7 +226,7 @@ schematic.blank_circuit("CIRCUIT_NAME")</pre>
|
|||
</p>
|
||||
|
||||
<p>
|
||||
<img src="lvs_symm_nodes.png"/>
|
||||
<img src="/manual/lvs_symm_nodes.png"/>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
|
|
|
|||
|
|
@ -54,9 +54,9 @@
|
|||
</p>
|
||||
|
||||
<table>
|
||||
<tr valign="top"><td><p>Default:</p></td><td width="5%"/><td><img src="/manual/fill_default.png"/></td></tr>
|
||||
<tr valign="top"><td><p>Enhanced:</p></td><td width="5%"/><td><img src="/manual/fill_enhanced.png"/></td></tr>
|
||||
<tr valign="top"><td><p>Enhanced plus<br/>second order:</p></td><td width="5%"/><td><img src="/manual/fill_second_order.png"/></td></tr>
|
||||
<tr valign="top"><td width="10%"><b>Default:</b></td><td width="5%"/><td><img src="/manual/fill_default.png"/></td></tr>
|
||||
<tr valign="top"><td width="10%"><b>Enhanced:</b></td><td width="5%"/><td><img src="/manual/fill_enhanced.png"/></td></tr>
|
||||
<tr valign="top"><td width="10%"><b>Enhanced plus<br/>second order:</b></td><td width="5%"/><td><img src="/manual/fill_second_order.png"/></td></tr>
|
||||
</table>
|
||||
|
||||
</doc>
|
||||
|
|
|
|||
|
|
@ -1139,9 +1139,9 @@ end</pre>
|
|||
|
||||
<p>A Shape object represents a box if it returns true on <class_doc href="Shape#is_box?"/>.
|
||||
The only specific methods that are provided for box type shapes are the <class_doc href="Shape#box"/>
|
||||
getter and <class_doc href="Shape#box="/> setter. <class_box href="Shape#box_center"/>,
|
||||
<class_box href="Shape#box_center="/>, <class_box href="Shape#box_p1"/>, <class_box href="Shape#box_p1="/>,
|
||||
<class_box href="Shape#box_p2"/> and <class_box href="Shape#box_p2="/> get or modify individual aspects of the
|
||||
getter and <class_doc href="Shape#box="/> setter. <class_doc href="Shape#box_center"/>,
|
||||
<class_doc href="Shape#box_center="/>, <class_doc href="Shape#box_p1"/>, <class_doc href="Shape#box_p1="/>,
|
||||
<class_doc href="Shape#box_p2"/> and <class_doc href="Shape#box_p2="/> get or modify individual aspects of the
|
||||
box.
|
||||
</p>
|
||||
|
||||
|
|
|
|||
|
|
@ -84,10 +84,19 @@ Class<lay::HelpDialog> decl_HelpDialog (QT_EXTERNAL_BASE (QDialog) "lay", "HelpD
|
|||
|
||||
LAYBASIC_PUBLIC Class<lay::BrowserSource> &laybasicdecl_BrowserSource ();
|
||||
|
||||
static lay::HelpSource *plain_help_source ()
|
||||
{
|
||||
return new lay::HelpSource (false);
|
||||
}
|
||||
|
||||
Class<lay::HelpSource> decl_HelpSource (laybasicdecl_BrowserSource (), "lay", "HelpSource",
|
||||
gsi::constructor ("plain", &plain_help_source, "@brief Reserved for internal use") +
|
||||
gsi::method ("scan", static_cast<void (lay::HelpSource::*) ()> (&lay::HelpSource::scan), "@brief Reserved internal use") +
|
||||
#if defined(HAVE_QTBINDINGS) && defined(HAVE_QT_XML)
|
||||
gsi::method ("get_dom", &lay::HelpSource::get_dom, "@brief For internal use") +
|
||||
gsi::method ("get_dom", &lay::HelpSource::get_dom, gsi::arg ("path"), "@brief Reserved for internal use") +
|
||||
#endif
|
||||
gsi::method ("set_option", &lay::HelpSource::set_option, gsi::arg ("key"), gsi::arg ("value"), "@brief Reserved for internal use") +
|
||||
gsi::method ("get_option", &lay::HelpSource::get_option, gsi::arg ("key"), "@brief Reserved for internal use") +
|
||||
gsi::method ("urls", &lay::HelpSource::urls, "@brief Reserved for internal use") +
|
||||
gsi::method ("title_for", &lay::HelpSource::title_for, gsi::arg ("path"), "@brief Reserved internal use") +
|
||||
gsi::method ("parent_of", &lay::HelpSource::parent_of, gsi::arg ("path"), "@brief Reserved internal use") +
|
||||
|
|
|
|||
|
|
@ -460,14 +460,19 @@ replace_references (const std::string &t, const gsi::ClassBase *cls_base)
|
|||
// --------------------------------------------------------------------------------------
|
||||
// Implementation
|
||||
|
||||
GSIHelpProvider::GSIHelpProvider ()
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
std::string
|
||||
GSIHelpProvider::folder () const
|
||||
GSIHelpProvider::folder (lay::HelpSource * /*src*/) const
|
||||
{
|
||||
return "code";
|
||||
}
|
||||
|
||||
std::string
|
||||
GSIHelpProvider::title () const
|
||||
GSIHelpProvider::title (lay::HelpSource * /*src*/) const
|
||||
{
|
||||
return tl::to_string (QObject::tr ("API Reference"));
|
||||
}
|
||||
|
|
@ -485,7 +490,7 @@ void produce_toc (const gsi::ClassBase *cls, std::vector <std::string> &toc)
|
|||
}
|
||||
|
||||
void
|
||||
GSIHelpProvider::toc (std::vector<std::string> &t)
|
||||
GSIHelpProvider::toc (lay::HelpSource * /*src*/, std::vector<std::string> &t)
|
||||
{
|
||||
std::set<std::string> mod_names;
|
||||
for (gsi::ClassBase::class_iterator c = gsi::ClassBase::begin_classes (); c != gsi::ClassBase::end_classes (); ++c) {
|
||||
|
|
@ -499,7 +504,7 @@ GSIHelpProvider::toc (std::vector<std::string> &t)
|
|||
}
|
||||
|
||||
QDomDocument
|
||||
GSIHelpProvider::get (const std::string &path) const
|
||||
GSIHelpProvider::get (lay::HelpSource *src, const std::string &path) const
|
||||
{
|
||||
QUrl url = QUrl::fromEncoded (path.c_str ());
|
||||
QString url_path = url.path ();
|
||||
|
|
@ -508,9 +513,9 @@ GSIHelpProvider::get (const std::string &path) const
|
|||
|
||||
std::string text;
|
||||
if (url_path == QString::fromUtf8 ("/code/index.xml")) {
|
||||
text = produce_class_index (0);
|
||||
text = produce_class_index (src, 0);
|
||||
} else if (module_index_url.indexIn (url_path) == 0) {
|
||||
text = produce_class_index (from_encoded_class_name (tl::to_string (module_index_url.cap (1))).c_str ());
|
||||
text = produce_class_index (src, from_encoded_class_name (tl::to_string (module_index_url.cap (1))).c_str ());
|
||||
} else if (class_doc_url.indexIn (url_path) == 0) {
|
||||
text = produce_class_doc (from_encoded_class_name (tl::to_string (class_doc_url.cap (1))));
|
||||
} else {
|
||||
|
|
@ -539,23 +544,6 @@ GSIHelpProvider::get (const std::string &path) const
|
|||
return doc;
|
||||
}
|
||||
|
||||
static
|
||||
void produce_doc_index (const gsi::ClassBase *cls, std::ostringstream &os)
|
||||
{
|
||||
DocumentationParser &doc = cls_documentation (cls);
|
||||
std::string qname = make_qualified_name (cls);
|
||||
|
||||
// Only list the name if the class is not hidden, it's a top-level class or the path is an expanded one
|
||||
// (the last criterion avoids generating classes such as A::B_C)
|
||||
if (! doc.hidden) {
|
||||
os << "<topic-ref href=\"" << escape_xml (class_doc_url (qname)) << "\"/>" << std::endl;
|
||||
}
|
||||
|
||||
for (tl::weak_collection<gsi::ClassBase>::const_iterator cc = cls->begin_child_classes (); cc != cls->end_child_classes (); ++cc) {
|
||||
produce_doc_index (cc.operator-> (), os);
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void collect_class_info (const gsi::ClassBase *cls, const std::string &module, std::vector <std::pair <std::string, std::pair<std::string, std::string> > > &class_names, std::vector <std::pair <std::string, std::pair<std::string, std::string> > > &qt_class_names)
|
||||
{
|
||||
|
|
@ -578,8 +566,9 @@ void collect_class_info (const gsi::ClassBase *cls, const std::string &module, s
|
|||
}
|
||||
|
||||
std::string
|
||||
GSIHelpProvider::produce_class_index (const char *module_name) const
|
||||
GSIHelpProvider::produce_class_index (lay::HelpSource *src, const char *module_name) const
|
||||
{
|
||||
bool skip_qt_classes = src->get_option ("skip-qt-classes").to_bool ();
|
||||
std::ostringstream os;
|
||||
|
||||
os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << std::endl
|
||||
|
|
@ -605,10 +594,17 @@ GSIHelpProvider::produce_class_index (const char *module_name) const
|
|||
}
|
||||
}
|
||||
|
||||
if (skip_qt_classes) {
|
||||
qt_class_names.clear ();
|
||||
}
|
||||
|
||||
if (! module_name) {
|
||||
|
||||
for (gsi::ClassBase::class_iterator c = gsi::ClassBase::begin_classes (); c != gsi::ClassBase::end_classes (); ++c) {
|
||||
produce_doc_index (c.operator-> (), os);
|
||||
for (class_index_t::const_iterator i = class_names.begin (); i != class_names.end (); ++i) {
|
||||
os << "<topic-ref href=\"" << escape_xml (class_doc_url (i->first)) << "\"/>" << std::endl;
|
||||
}
|
||||
for (class_index_t::const_iterator i = qt_class_names.begin (); i != qt_class_names.end (); ++i) {
|
||||
os << "<topic-ref href=\"" << escape_xml (class_doc_url (i->first)) << "\"/>" << std::endl;
|
||||
}
|
||||
|
||||
std::set<std::string> mod_names;
|
||||
|
|
@ -643,7 +639,7 @@ GSIHelpProvider::produce_class_index (const char *module_name) const
|
|||
}
|
||||
|
||||
if (! qt_class_names.empty ()) {
|
||||
os << tl::to_string (QObject::tr ("Find Qt class documentation")) << " <a href=\"#qtclasses\">" << tl::to_string (QObject::tr ("here")) << "</a>" << std::endl;
|
||||
os << "<p>" << tl::to_string (QObject::tr ("Find Qt class documentation")) << " <a href=\"#qtclasses\">" << tl::to_string (QObject::tr ("here")) << "</a></p>" << std::endl;
|
||||
}
|
||||
|
||||
if (! class_names.empty ()) {
|
||||
|
|
@ -657,9 +653,9 @@ GSIHelpProvider::produce_class_index (const char *module_name) const
|
|||
os << "<tr class=\"row" << (n % 2) << "\">" << std::endl;
|
||||
os << "<td><a href=\"" << escape_xml (class_doc_url (cc->first)) << "\">" << escape_xml (cc->first) << "</a></td>";
|
||||
if (! module_name) {
|
||||
os << "<td> <nobr><a href=\"" << module_doc_url (cc->second.first) << "\">" << escape_xml (cc->second.first) << "</a></nobr></td>";
|
||||
os << "<td><a href=\"" << module_doc_url (cc->second.first) << "\">" << escape_xml (cc->second.first) << "</a></td>";
|
||||
}
|
||||
os << "<td> <nobr>" << escape_xml (cc->second.second) << "</nobr></td></tr>" << std::endl;
|
||||
os << "<td>" << escape_xml (cc->second.second) << "</td></tr>" << std::endl;
|
||||
}
|
||||
os << "</table>" << std::endl;
|
||||
|
||||
|
|
@ -676,9 +672,9 @@ GSIHelpProvider::produce_class_index (const char *module_name) const
|
|||
os << "<tr class=\"row" << (n % 2) << "\">" << std::endl;
|
||||
os << "<td><a href=\"" << escape_xml (class_doc_url (cc->first)) << "\">" << escape_xml (cc->first) << "</a></td>";
|
||||
if (! module_name) {
|
||||
os << "<td> <nobr><a href=\"" << module_doc_url (cc->second.first) << "\">" << escape_xml (cc->second.first) << "</a></nobr></td>";
|
||||
os << "<td><a href=\"" << module_doc_url (cc->second.first) << "\">" << escape_xml (cc->second.first) << "</a></td>";
|
||||
}
|
||||
os << "<td> <nobr>" << escape_xml (cc->second.second) << "</nobr></td></tr>" << std::endl;
|
||||
os << "<td>" << escape_xml (cc->second.second) << "</td></tr>" << std::endl;
|
||||
}
|
||||
os << "</table>" << std::endl;
|
||||
|
||||
|
|
@ -992,6 +988,7 @@ GSIHelpProvider::produce_class_doc (const std::string &cls) const
|
|||
<< std::endl;
|
||||
|
||||
os << "<doc><title>" << tl::to_string (QObject::tr ("API reference - Class")) << " " << escape_xml (cls) << "</title>" << std::endl;
|
||||
os << "<property name=\"module\" value=\"" << escape_xml (cls_obj->module ()) << "\"/>" << std::endl;
|
||||
|
||||
os << "<keyword name=\"" << escape_xml (cls) << "\"/>" << std::endl;
|
||||
|
||||
|
|
@ -1328,6 +1325,9 @@ GSIHelpProvider::produce_class_doc (const std::string &cls) const
|
|||
|
||||
os << "<table>";
|
||||
|
||||
int rowindex = -1;
|
||||
int sigindex = -1;
|
||||
|
||||
for (std::multimap <std::string, std::pair<const gsi::MethodBase *, size_t> >::const_iterator i = mm.begin (); i != mm.end (); ++i, ++n) {
|
||||
|
||||
const gsi::MethodBase::MethodSynonym &syn = i->second.first->begin_synonyms () [i->second.second];
|
||||
|
|
@ -1335,13 +1335,23 @@ GSIHelpProvider::produce_class_doc (const std::string &cls) const
|
|||
DocumentationParser method_doc (i->second.first);
|
||||
std::string pydoc = pya::PythonInterpreter::python_doc (i->second.first);
|
||||
|
||||
os << "<tr>";
|
||||
if (i->first != prev_title) {
|
||||
rowindex += 1;
|
||||
}
|
||||
os << "<tr class=\"bigrow" << (rowindex % 2) << "\">";
|
||||
|
||||
if (i->first != prev_title) {
|
||||
int rows = 0;
|
||||
for (std::multimap <std::string, std::pair<const gsi::MethodBase *, size_t> >::const_iterator j = i; j != mm.end () && j->first == i->first; ++j) {
|
||||
++rows;
|
||||
}
|
||||
os << "<td rowspan=\"" << rows << "\">";
|
||||
if (rows > 1) {
|
||||
os << "<td rowspan=\"" << rows << "\">";
|
||||
sigindex = 0;
|
||||
} else {
|
||||
os << "<td>";
|
||||
sigindex = -1;
|
||||
}
|
||||
os << "<h3>" << escape_xml (i->first) << "</h3>" << std::endl;
|
||||
prev_title = i->first;
|
||||
os << "</td>";
|
||||
|
|
@ -1352,7 +1362,12 @@ GSIHelpProvider::produce_class_doc (const std::string &cls) const
|
|||
<< "<a name=\"m_" << escape_xml (i->first) << "\"/>"
|
||||
<< "<keyword title=\"" << tl::to_string (QObject::tr ("API reference - Class")) << " " << escape_xml (cls) << ", " << tl::to_string (QObject::tr ("Method")) << " " << escape_xml (i->first) << "\" name=\"" << escape_xml (cls) << "#" << escape_xml (i->first) << "\"/>" << std::endl;
|
||||
|
||||
os << "<p><b>" << tl::to_string (QObject::tr ("Signature")) << "</b>: ";
|
||||
os << "<p><b>";
|
||||
if (sigindex >= 0) {
|
||||
++sigindex;
|
||||
os << "(" << sigindex << ") ";
|
||||
}
|
||||
os << tl::to_string (QObject::tr ("Signature")) << "</b>: ";
|
||||
std::string attr = method_attributes (i->second.first, method_doc);
|
||||
if (! attr.empty ()) {
|
||||
os << "<i>[" << escape_xml (attr) << "] </i>";
|
||||
|
|
@ -1395,7 +1410,7 @@ GSIHelpProvider::produce_class_doc (const std::string &cls) const
|
|||
|
||||
if (! pydoc.empty ()) {
|
||||
os << "<p><b>";
|
||||
os << tl::to_string (QObject::tr ("Python specific notes:"));
|
||||
os << tl::to_string (QObject::tr ("Python specific notes: "));
|
||||
os << "</b><br/>" << escape_xml (pydoc) << "</p>" << std::endl;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,14 +38,16 @@ class GSIHelpProvider
|
|||
: public HelpProvider
|
||||
{
|
||||
public:
|
||||
virtual std::string folder () const;
|
||||
virtual std::string title () const;
|
||||
virtual void toc (std::vector<std::string> &t);
|
||||
virtual QDomDocument get (const std::string &u) const;
|
||||
GSIHelpProvider ();
|
||||
|
||||
virtual std::string folder (lay::HelpSource *src) const;
|
||||
virtual std::string title (lay::HelpSource *src) const;
|
||||
virtual void toc (lay::HelpSource *src, std::vector<std::string> &t);
|
||||
virtual QDomDocument get (lay::HelpSource *src, const std::string &u) const;
|
||||
|
||||
private:
|
||||
std::string produce_class_doc (const std::string &cls) const;
|
||||
std::string produce_class_index (const char *module_name) const;
|
||||
std::string produce_class_index (HelpSource *src, const char *module_name) const;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,8 @@
|
|||
namespace lay
|
||||
{
|
||||
|
||||
class HelpSource;
|
||||
|
||||
/**
|
||||
* @brief A provider for documentation in the help system
|
||||
*
|
||||
|
|
@ -58,9 +60,9 @@ public:
|
|||
*
|
||||
* @return The documentation path for the main entry point for this provider.
|
||||
*/
|
||||
virtual std::string index () const
|
||||
virtual std::string index (lay::HelpSource *src) const
|
||||
{
|
||||
return "/" + folder () + "/index.xml";
|
||||
return "/" + folder (src) + "/index.xml";
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -69,7 +71,7 @@ public:
|
|||
* The DOM is the document in XML form which can be converted to HTML form for example
|
||||
* or scanned for keywords.
|
||||
*/
|
||||
virtual QDomDocument get (const std::string & /*path*/) const
|
||||
virtual QDomDocument get (lay::HelpSource * /*src*/, const std::string & /*path*/) const
|
||||
{
|
||||
return QDomDocument ();
|
||||
}
|
||||
|
|
@ -80,12 +82,12 @@ public:
|
|||
* If this string is "doc" for example, all help documents will be looked up under
|
||||
* "doc/...".
|
||||
*/
|
||||
virtual std::string folder () const = 0;
|
||||
virtual std::string folder (lay::HelpSource * /*src*/) const = 0;
|
||||
|
||||
/**
|
||||
* @brief Gets the title for this category
|
||||
*/
|
||||
virtual std::string title () const = 0;
|
||||
virtual std::string title (lay::HelpSource * /*src*/) const = 0;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,6 +54,9 @@
|
|||
namespace lay
|
||||
{
|
||||
|
||||
static const std::string index_url ("/index.xml");
|
||||
static const std::string search_url ("/search.xml");
|
||||
|
||||
// --------------------------------------------------------------------------------------
|
||||
// Some utilities
|
||||
|
||||
|
|
@ -285,7 +288,14 @@ HelpSource::initialize_index ()
|
|||
tl::XMLFileSource in (*c);
|
||||
help_index_structure.parse (in, *this);
|
||||
if (m_klayout_version == lay::ApplicationBase::version ()) {
|
||||
if (tl::verbosity () >= 10) {
|
||||
tl::info << tl::to_string (tr ("Help index initialized from ")) << *c;
|
||||
}
|
||||
ok = true;
|
||||
} else {
|
||||
if (tl::verbosity () >= 10) {
|
||||
tl::warn << tl::to_string (tr ("Help index ignored (wrong version) from ")) << *c;
|
||||
}
|
||||
}
|
||||
} catch (tl::Exception &ex) {
|
||||
tl::warn << ex.msg ();
|
||||
|
|
@ -322,13 +332,8 @@ HelpSource::~HelpSource()
|
|||
void
|
||||
HelpSource::produce_index_file (const std::string &path)
|
||||
{
|
||||
m_index.clear ();
|
||||
m_titles.clear ();
|
||||
m_title_map.clear ();
|
||||
m_parent_of.clear ();
|
||||
scan ();
|
||||
|
||||
tl::AbsoluteProgress progress (tl::to_string (QObject::tr ("Initializing help index")), 1, false /*can't cancel*/);
|
||||
scan ("/index.xml", progress);
|
||||
try {
|
||||
|
||||
tl::OutputStream os (path, tl::OutputStream::OM_Plain);
|
||||
|
|
@ -350,6 +355,18 @@ HelpSource::create_index_file (const std::string &path)
|
|||
source.produce_index_file (path);
|
||||
}
|
||||
|
||||
void
|
||||
HelpSource::scan ()
|
||||
{
|
||||
m_index.clear ();
|
||||
m_titles.clear ();
|
||||
m_title_map.clear ();
|
||||
m_parent_of.clear ();
|
||||
|
||||
tl::AbsoluteProgress progress (tl::to_string (QObject::tr ("Initializing help index")), 1);
|
||||
scan (index_url, progress);
|
||||
}
|
||||
|
||||
std::string
|
||||
HelpSource::klayout_version () const
|
||||
{
|
||||
|
|
@ -461,21 +478,21 @@ HelpSource::get_dom (const std::string &u)
|
|||
QString path = url.path ();
|
||||
|
||||
for (tl::Registrar<lay::HelpProvider>::iterator cls = tl::Registrar<lay::HelpProvider>::begin (); cls != tl::Registrar<lay::HelpProvider>::end (); ++cls) {
|
||||
if (path.startsWith (tl::to_qstring ("/" + cls->folder () + "/"))) {
|
||||
if (path.startsWith (tl::to_qstring ("/" + cls->folder (this) + "/"))) {
|
||||
if (tl::verbosity () >= 20) {
|
||||
tl::info << "Help provider: create content for " << u;
|
||||
}
|
||||
return cls->get (u);
|
||||
return cls->get (this, u);
|
||||
}
|
||||
}
|
||||
|
||||
if (path == QString::fromUtf8 ("/search.xml")) {
|
||||
if (path == tl::to_qstring (search_url)) {
|
||||
#if QT_VERSION >= 0x050000
|
||||
return produce_search (tl::to_string (QUrlQuery (url.query ()).queryItemValue (QString::fromUtf8 ("string")).toLower ()));
|
||||
#else
|
||||
return produce_search (tl::to_string (url.queryItemValue (QString::fromUtf8 ("string")).toLower ()));
|
||||
#endif
|
||||
} else if (path == QString::fromUtf8 ("/index.xml")) {
|
||||
} else if (path == tl::to_qstring (index_url)) {
|
||||
if (tl::verbosity () >= 20) {
|
||||
tl::info << "Help provider: create content for " << u;
|
||||
}
|
||||
|
|
@ -581,9 +598,14 @@ std::string
|
|||
HelpSource::next_topic (const std::string &url)
|
||||
{
|
||||
std::string u = tl::to_string (QUrl::fromEncoded (url.c_str ()).path ());
|
||||
for (size_t t = 0; t + 1 < m_titles.size (); ++t) {
|
||||
for (size_t t = m_titles.size (); t > 0; ) {
|
||||
--t;
|
||||
if (m_titles [t].first == u) {
|
||||
return "int:" + m_titles [t + 1].first;
|
||||
if (t + 1 >= m_titles.size ()) {
|
||||
return std::string ();
|
||||
} else {
|
||||
return "int:" + m_titles [t + 1].first;
|
||||
}
|
||||
}
|
||||
}
|
||||
return std::string ();
|
||||
|
|
@ -618,7 +640,7 @@ HelpSource::produce_main_index ()
|
|||
|
||||
os << "<topics>" << std::endl;
|
||||
for (tl::Registrar<lay::HelpProvider>::iterator cls = tl::Registrar<lay::HelpProvider>::begin (); cls != tl::Registrar<lay::HelpProvider>::end (); ++cls) {
|
||||
os << "<topic href=\"" << cls->index () << "\"/>" << std::endl;
|
||||
os << "<topic href=\"" << cls->index (this) << "\"/>" << std::endl;
|
||||
}
|
||||
os << "</topics>" << std::endl;
|
||||
|
||||
|
|
@ -1056,12 +1078,30 @@ std::vector<std::string>
|
|||
HelpSource::urls ()
|
||||
{
|
||||
std::vector<std::string> u;
|
||||
u.push_back ("/index.xml");
|
||||
u.push_back (index_url);
|
||||
for (std::map<std::string, std::string>::const_iterator p = m_parent_of.begin (); p != m_parent_of.end (); ++p) {
|
||||
u.push_back (p->first);
|
||||
}
|
||||
return u;
|
||||
}
|
||||
|
||||
void
|
||||
HelpSource::set_option (const std::string &key, const tl::Variant &value)
|
||||
{
|
||||
s_global_options[key] = value;
|
||||
}
|
||||
|
||||
const tl::Variant &
|
||||
HelpSource::get_option (const std::string &key) const
|
||||
{
|
||||
auto i = s_global_options.find (key);
|
||||
if (i != s_global_options.end ()) {
|
||||
return i->second;
|
||||
} else {
|
||||
static tl::Variant nil;
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -75,6 +75,8 @@ class HelpSource
|
|||
{
|
||||
public:
|
||||
HelpSource ();
|
||||
HelpSource (bool make_index);
|
||||
|
||||
~HelpSource();
|
||||
|
||||
virtual std::string get (const std::string &url);
|
||||
|
|
@ -152,6 +154,22 @@ public:
|
|||
*/
|
||||
static void create_index_file (const std::string &path);
|
||||
|
||||
/**
|
||||
* @brief Scans the help providers and produce the index
|
||||
*/
|
||||
void scan ();
|
||||
|
||||
/**
|
||||
* @brief Sets a global options for tailoring the help output
|
||||
*/
|
||||
void set_option (const std::string &key, const tl::Variant &value);
|
||||
|
||||
/**
|
||||
* @brief Sets a global options for tailoring the help output
|
||||
* A null variant is returned if the option is not present.
|
||||
*/
|
||||
const tl::Variant &get_option (const std::string &key) const;
|
||||
|
||||
private:
|
||||
std::vector<IndexEntry> m_index;
|
||||
std::map<std::string, std::string> m_parent_of;
|
||||
|
|
@ -159,8 +177,8 @@ private:
|
|||
std::map<std::string, std::string> m_title_map;
|
||||
std::string m_klayout_version;
|
||||
int m_kindex;
|
||||
std::map<std::string, tl::Variant> s_global_options;
|
||||
|
||||
HelpSource (bool make_index);
|
||||
QDomDocument produce_search (const std::string &index);
|
||||
QDomDocument produce_main_index ();
|
||||
void produce_index_file (const std::string &path);
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ ResourceHelpProvider::ResourceHelpProvider (const char *folder, const std::strin
|
|||
}
|
||||
|
||||
QDomDocument
|
||||
ResourceHelpProvider::get (const std::string &path) const
|
||||
ResourceHelpProvider::get (lay::HelpSource * /*src*/, const std::string &path) const
|
||||
{
|
||||
QString qpath = tl::to_qstring (path);
|
||||
QResource res (resource_url (qpath));
|
||||
|
|
|
|||
|
|
@ -40,17 +40,17 @@ class ResourceHelpProvider
|
|||
public:
|
||||
ResourceHelpProvider (const char *folder, const std::string &title);
|
||||
|
||||
std::string folder () const
|
||||
std::string folder (lay::HelpSource * /*src*/) const
|
||||
{
|
||||
return m_folder;
|
||||
}
|
||||
|
||||
std::string title () const
|
||||
std::string title (lay::HelpSource * /*src*/) const
|
||||
{
|
||||
return m_title;
|
||||
}
|
||||
|
||||
virtual QDomDocument get (const std::string &path) const;
|
||||
virtual QDomDocument get (lay::HelpSource *src, const std::string &path) const;
|
||||
|
||||
private:
|
||||
std::string m_folder, m_title;
|
||||
|
|
|
|||
|
|
@ -379,6 +379,11 @@ static BrowserSource_Stub *new_html (const std::string &html)
|
|||
}
|
||||
|
||||
Class<lay::BrowserSource> decl_BrowserSource ("lay", "BrowserSource_Native",
|
||||
#if defined(HAVE_QTBINDINGS)
|
||||
gsi::method ("get_image", &lay::BrowserSource::get_image, gsi::arg ("url")) +
|
||||
#endif
|
||||
gsi::method ("next_topic", &lay::BrowserSource::next_topic, gsi::arg ("url")) +
|
||||
gsi::method ("prev_topic", &lay::BrowserSource::prev_topic, gsi::arg ("url")) +
|
||||
gsi::method ("get", &lay::BrowserSource::get),
|
||||
"@hide\n@alias BrowserSource"
|
||||
);
|
||||
|
|
@ -391,12 +396,31 @@ Class<lay::BrowserSource> &laybasicdecl_BrowserSource ()
|
|||
|
||||
Class<BrowserSource_Stub> decl_BrowserSourceStub ("lay", "BrowserSource",
|
||||
gsi::constructor ("new|#new_html", &new_html,
|
||||
"@brief construct a BrowserSource object with a default HTML string\n"
|
||||
"@brief Constructs a BrowserSource object with a default HTML string\n"
|
||||
"\n"
|
||||
"The default HTML string is sent when no specific implementation is provided.\n"
|
||||
) +
|
||||
#if defined(HAVE_QTBINDINGS)
|
||||
gsi::method ("get_image", &lay::BrowserSource::get_image, gsi::arg ("url"),
|
||||
"@brief Gets the image object for a specific URL\n"
|
||||
"\n"
|
||||
"This method has been introduced in version 0.28."
|
||||
) +
|
||||
#endif
|
||||
gsi::method ("next_topic", &lay::BrowserSource::next_topic, gsi::arg ("url"),
|
||||
"@brief Gets the next topic URL from a given URL\n"
|
||||
"An empty string will be returned if no next topic is available.\n"
|
||||
"\n"
|
||||
"This method has been introduced in version 0.28."
|
||||
) +
|
||||
gsi::method ("prev_topic", &lay::BrowserSource::prev_topic, gsi::arg ("url"),
|
||||
"@brief Gets the previous topic URL from a given URL\n"
|
||||
"An empty string will be returned if no previous topic is available.\n"
|
||||
"\n"
|
||||
"This method has been introduced in version 0.28."
|
||||
) +
|
||||
gsi::callback ("get", &BrowserSource_Stub::get, &BrowserSource_Stub::get_cb, gsi::arg ("url"),
|
||||
"@brief Get the HTML code for a given \"int\" URL.\n"
|
||||
"@brief Gets the HTML code for a given \"int\" URL.\n"
|
||||
"\n"
|
||||
"If this method returns an empty string, the browser will not be set to \n"
|
||||
"a new location. This allows implementing any functionality behind such links.\n"
|
||||
|
|
|
|||
|
|
@ -262,13 +262,13 @@ gsi::Class<db::LEFDEFReaderOptions> decl_lefdef_config ("db", "LEFDEFReaderConfi
|
|||
"\n"
|
||||
"For example: the via layer is 'V1', \\via_geometry_suffix is 'GEO' and \\via_geometry_datatype is 1. Then:\n"
|
||||
"\n"
|
||||
"@li\n"
|
||||
"@ul If there is a mapping for 'V1.GEO', the layer and datatype will be taken from there. @/ul\n"
|
||||
"@ul If there is a mapping for 'V1', the layer will be taken from there and the datatype will be taken from \\via_geometry_datatype. "
|
||||
" The name of the produced layer will be 'V1.GEO'. @/ul\n"
|
||||
"@ul If there is no mapping for both, the layer number will be a unique value, the datatype will be taken from \\via_geometry_datatype "
|
||||
" and the layer name will be 'V1.GEO'. @/ul"
|
||||
"@/li\n"
|
||||
"@ul\n"
|
||||
"@li If there is a mapping for 'V1.GEO', the layer and datatype will be taken from there. @/li\n"
|
||||
"@li If there is a mapping for 'V1', the layer will be taken from there and the datatype will be taken from \\via_geometry_datatype. "
|
||||
" The name of the produced layer will be 'V1.GEO'. @/li\n"
|
||||
"@li If there is no mapping for both, the layer number will be a unique value, the datatype will be taken from \\via_geometry_datatype "
|
||||
" and the layer name will be 'V1.GEO'. @/li"
|
||||
"@/ul\n"
|
||||
) +
|
||||
gsi::method ("produce_via_geometry=", &db::LEFDEFReaderOptions::set_produce_via_geometry, gsi::arg ("produce"),
|
||||
"@brief Sets a value indicating whether via geometries shall be produced.\n"
|
||||
|
|
|
|||
|
|
@ -1558,7 +1558,7 @@ public:
|
|||
if (as_static) {
|
||||
|
||||
if (tl::verbosity () >= 20) {
|
||||
tl::log << tl::to_string (tr ("Registering class as Ruby module:) ")) << cls->name ();
|
||||
tl::log << tl::to_string (tr ("Registering class as Ruby module: ")) << cls->name ();
|
||||
}
|
||||
|
||||
std::string mixin_name = cls->name () + "_Mixin";
|
||||
|
|
|
|||
Loading…
Reference in New Issue