def extras(self) -> List["Flattenable"]: r = super().extras() sourceHref = util.srclink(self.ob) source: "Flattenable" if sourceHref: source = (" ", tags.a("(source)", href=sourceHref, class_="sourceLink")) else: source = tags.transparent r.append( tags.p( tags.code(tags.span("class", class_='py-keyword'), " ", tags.span(self.ob.name, class_='py-defname'), self.classSignature(), ":", source))) scs = sorted(self.ob.subclasses, key=objects_order) if not scs: return r p = assembleList(self.ob.system, "Known subclasses: ", [o.fullName() for o in scs], "moreSubclasses", self.page_url) if p is not None: r.append(tags.p(p)) return r
def format_docstring(obj: model.Documentable) -> Tag: """Generate an HTML representation of a docstring""" doc, source = get_docstring(obj) # Use cached or split version if possible. pdoc = obj.parsed_docstring if source is None: if pdoc is None: # We don't use 'source' if pdoc is None, but mypy is not that # sophisticated, so we fool it by assigning a dummy object. source = obj else: # A split field is documented by its parent. source = obj.parent assert source is not None if pdoc is None and doc is not None: pdoc = parse_docstring(obj, doc, source) obj.parsed_docstring = pdoc ret: Tag = tags.div if pdoc is None: ret(tags.p(class_='undocumented')("Undocumented")) else: try: stan = pdoc.to_stan(_EpydocLinker(source)) except Exception as e: errs = [ParseError(f'{e.__class__.__name__}: {e}', 1)] if doc is None: stan = tags.p(class_="undocumented")('Broken description') else: pdoc_plain = pydoctor.epydoc.markup.plaintext.parse_docstring( doc, errs) stan = pdoc_plain.to_stan(_EpydocLinker(source)) reportErrors(source, errs) if stan.tagName: ret(stan) else: ret(*stan.children) fh = FieldHandler(obj) if isinstance(obj, model.Function): fh.set_param_types_from_annotations(obj.annotations) if pdoc is not None: for field in pdoc.fields: fh.handle(Field.from_epydoc(field, source)) if isinstance(obj, model.Function): fh.resolve_types() ret(fh.format()) return ret
def generateTabsAndContent(results): """ results is a dictionary whose keys are normalized ASCII chars and whose values are the original (possible unicode) chars that map to the ASCII ones. """ tabs = [] contents = [] for asciiLetter in sorted(results.keys()): if not asciiLetter: continue for letter in sorted(results[asciiLetter]): tab = tags.li( tags.a( letter.upper(), href="#l%s" % letter, **{"data-toggle": "tab"}) ) tabs.append(tab) content = tags.div( tags.p("holding content"), class_="tab-pane", id="l%s" % letter) contents.append(content) return tags.div( tags.ul(tabs, class_="nav nav-tabs"), tags.div(contents, class_="tab-content"), class_="tabbable tabs-left")
def generateTabsAndContent(results): """ results is a dictionary whose keys are normalized ASCII chars and whose values are the original (possible unicode) chars that map to the ASCII ones. """ tabs = [] contents = [] for asciiLetter in sorted(results.keys()): if not asciiLetter: continue for letter in sorted(results[asciiLetter]): tab = tags.li( tags.a(letter.upper(), href="#l%s" % letter, **{"data-toggle": "tab"})) tabs.append(tab) content = tags.div(tags.p("holding content"), class_="tab-pane", id="l%s" % letter) contents.append(content) return tags.div(tags.ul(tabs, class_="nav nav-tabs"), tags.div(contents, class_="tab-content"), class_="tabbable tabs-left")
def render_POST(self, request): uri = request.args.get('uri', []) if not uri or not tahoeRegex.match(uri[0]): return self.render_GET(request) ext = request.args.get('ext', []) b64uri = base64.urlsafe_b64encode(uri[0]) extension = '' if ext and ext[0]: extension = '.' + ext[0].lstrip('.') if uri[0] not in self.shortdb: while True: short = crockford.b32encode(os.urandom(9)).lower() if short not in self.shortdb: break self.shortdb[short] = uri[0] self.shortdb[uri[0]] = short self.shortdb.sync() else: short = self.shortdb[uri[0]] if request.args.get('api', []): return '/' + short + extension body = tags.p(tags.a('long url', href=b64uri + extension), '; ', tags.a('medium url', href='/' + uri[0] + extension), '; ', tags.a('short url', href=short + extension)) return renderElement(request, body)
def render_POST(self, request): uri = request.args.get('uri', []) if not uri or not tahoeRegex.match(uri[0]): return self.render_GET(request) ext = request.args.get('ext', []) b64uri = base64.urlsafe_b64encode(uri[0]) extension = '' if ext and ext[0]: extension = '.' + ext[0].lstrip('.') if uri[0] not in self.shortdb: while True: short = crockford.b32encode(os.urandom(9)).lower() if short not in self.shortdb: break self.shortdb[short] = uri[0] self.shortdb[uri[0]] = short self.shortdb.sync() else: short = self.shortdb[uri[0]] if request.args.get('api', []): return '/' + short + extension body = tags.p( tags.a('long url', href=b64uri + extension), '; ', tags.a('medium url', href='/' + uri[0] + extension), '; ', tags.a('short url', href=short + extension)) return renderElement(request, body)
def extras(self): r = [super(ZopeInterfaceClassPage, self).extras()] system = self.ob.system def tl(s): if s in system.allobjects: return taglink(system.allobjects[s]) else: return s if self.ob.isinterface: namelist = sorted( [o.fullName() for o in self.ob.implementedby_directly], key=lambda x: x.lower()) label = 'Known implementations: ' else: namelist = sorted(self.ob.implements_directly, key=lambda x: x.lower()) label = 'Implements interfaces: ' if namelist: l = maybeShortenList(self.ob.system, label, namelist, "moreInterface") if l is not None: r.append(tags.p(l)) return r
def render(ign, ored: object) -> Tag: return tags.p( "hello, ", tags.transparent(render="test"), " - ", tags.transparent(render="test"), )
def render(ign, ored): return tags.p( "hello, ", tags.transparent(render="test"), " - ", tags.transparent(render="test"), )
def test_serializeDeferredSlots(self): """ Test that a slot with a deferred as its value will be flattened using the value from the deferred. """ t = tags.p(slot('test')) t.fillSlots(test=succeed(tags.em('four>'))) return self.assertFlattensTo(t, '<p><em>four></em></p>')
def test_serializeDeferredSlots(self): """ Test that a slot with a deferred as its value will be flattened using the value from the deferred. """ t = tags.p(slot("test")) t.fillSlots(test=succeed(tags.em("four>"))) return self.assertFlattensTo(t, b"<p><em>four></em></p>")
def test_serializeSlots(self): """ Test that flattening a slot will use the slot value from the tag. """ t1 = tags.p(slot("test")) t2 = t1.clone() t2.fillSlots(test="hello, world") self.assertFlatteningRaises(t1, UnfilledSlot) self.assertFlattensImmediately(t2, b"<p>hello, world</p>")
def extras(self): r = super(ClassPage, self).extras() scs = sorted(self.ob.subclasses, key=lambda o: o.fullName().lower()) if not scs: return r p = assembleList(self.ob.system, "Known subclasses: ", [o.fullName() for o in scs], "moreSubclasses") if p is not None: r.append(tags.p(p)) return r
def test_serializeSlots(self): """ Test that flattening a slot will use the slot value from the tag. """ t1 = tags.p(slot("test")) t2 = t1.clone() t2.fillSlots(test="hello, world") return gatherResults( [self.assertFlatteningRaises(t1, UnfilledSlot), self.assertFlattensTo(t2, "<p>hello, world</p>")] )
def packageInitTable(self): init = self.ob.contents['__init__'] children = sorted( [o for o in init.orderedcontents if o.isVisible], key=lambda o2:(-o2.privacyClass, o2.fullName())) if children: return [tags.p("From the __init__.py module:"), ChildTable(self.docgetter, init, self.usesorttable, children)] else: return ()
def packageInitTable(self): init = self.ob.contents['__init__'] children = sorted([o for o in init.orderedcontents if o.isVisible], key=lambda o2: (-o2.privacyClass, o2.fullName())) if children: return [ tags.p("From the __init__.py module:"), ChildTable(self.docgetter, init, self.usesorttable, children) ] else: return ()
def render_GET(self, request): applications = [] for app in self.registry.applications.values(): link = tags.a(tags.tt(app.name), ' at ', tags.tt(app.path.path), href=app.name) applications.append(tags.li(link)) body = tags.body( tags.p('Here are your applications:'), tags.ul(*applications)) return renderElement(request, body)
def test_serializeSlots(self): """ Test that flattening a slot will use the slot value from the tag. """ t1 = tags.p(slot('test')) t2 = t1.clone() t2.fillSlots(test='hello, world') return gatherResults([ self.assertFlatteningRaises(t1, UnfilledSlot), self.assertFlattensTo(t2, '<p>hello, world</p>'), ])
def packageInitTable(self): init = self.ob.contents['__init__'] children = sorted( [o for o in init.orderedcontents if o.isVisible], key=lambda o2:(-o2.privacyClass.value, o2.fullName())) if children: return [tags.p("From the ", tags.code("__init__.py"), " module:", class_="fromInitPy"), ChildTable(self.docgetter, init, children)] else: return ()
def packageInitTable(self): init = self.ob.contents["__init__"] children = sorted( [o for o in init.orderedcontents if o.isVisible], key=lambda o2: (-o2.privacyClass, o2.fullName()) ) if children: return [ tags.p("From the ", tags.code("__init__.py"), " module:", class_="fromInitPy"), ChildTable(self.docgetter, init, children), ] else: return ()
def extras(self): r = super().extras() sourceHref = util.srclink(self.ob) if sourceHref: source = (" ", tags.a("(source)", href=sourceHref)) else: source = tags.transparent r.append(tags.p(tags.code( tags.span("class", class_='py-keyword'), " ", self.mediumName(self.ob), ":", source ))) scs = sorted(self.ob.subclasses, key=lambda o:o.fullName().lower()) if not scs: return r p = assembleList(self.ob.system, "Known subclasses: ", [o.fullName() for o in scs], "moreSubclasses") if p is not None: r.append(tags.p(p)) return r
def render_GET(self, request): applications = [] for app in self.registry.applications.values(): link = tags.a(tags.tt(app.name), ' at ', tags.tt(app.path.path), href=app.name) applications.append(tags.li(link)) body = tags.body(tags.p('Here are your applications:'), tags.ul(*applications)) return renderElement(request, body)
def extras(self): r = [super(ZopeInterfaceClassPage, self).extras()] if self.ob.isinterface: namelist = sorted([o.fullName() for o in self.ob.implementedby_directly], key=lambda x:x.lower()) label = 'Known implementations: ' else: namelist = sorted(self.ob.implements_directly, key=lambda x:x.lower()) label = 'Implements interfaces: ' if namelist: l = assembleList(self.ob.system, label, namelist, "moreInterface") if l is not None: r.append(tags.p(l)) return r
def preview(self, request, tag): docstring = parse_str(self.docstring) stan, errors = epydoc2stan.doc2stan( self.ob, docstring=docstring) if self.isPreview or errors: if errors: #print stan, errors #assert isinstance(stan, tags.pre) [text] = stan.children lines = text.replace('\r\n', '\n').split('\n') line2err = {} for err in errors: if isinstance(err, str): ln = None else: ln = err.linenum() line2err.setdefault(ln, []).append(err) w = len(str(len(lines))) for i, line in enumerate(lines): i += 1 cls = "preview" if i in line2err: cls += " error" tag(tags.pre(class_=cls)("%*s"%(w, i), ' ', line)) for err in line2err.get(i, []): tag(tags.p(class_="errormessage")(err.descr())) i += 1 for err in line2err.get(i, []): tag(tags.p(class_="errormessage")(err.descr())) items = [] for err in line2err.get(None, []): items.append(tags.li(str(err))) if items: tag(tags.ul(items)) else: tag = tag(stan) return tag(tags.h2("Edit")) else: return ()
def extras(self): r = [super(ZopeInterfaceClassPage, self).extras()] if self.ob.isinterface: namelist = sorted([o.fullName() for o in self.ob.implementedby_directly], key=lambda x: x.lower()) label = "Known implementations: " else: namelist = sorted(self.ob.implements_directly, key=lambda x: x.lower()) label = "Implements interfaces: " if namelist: l = assembleList(self.ob.system, label, namelist, "moreInterface") if l is not None: r.append(tags.p(l)) return r
def footer_right(self, request, tag): """ '(c) 2014-2016 ', tags.a('Open Hive', href='http://open-hive.org/'), ' and ', tags.a('Hiveeyes', href='https://hiveeyes.org/docs/system/'), '. ', """ return tag(tags.p( 'Powered by ', tags.a('Kotori', href='https://getkotori.org/'), ', ', tags.a('InfluxDB', href='https://github.com/influxdata/influxdb'), ', ', tags.a('dygraphs', href='http://dygraphs.com/'), ' and ', tags.a('DataTables', href='https://datatables.net/'), '.' ))
def test_serializeUnicode(self): """ Test that unicode is encoded correctly in the appropriate places, and raises an error when it occurs in inappropriate place. """ snowman = "\N{SNOWMAN}" self.assertFlattensImmediately(snowman, b"\xe2\x98\x83") self.assertFlattensImmediately(tags.p(snowman), b"<p>\xe2\x98\x83</p>") self.assertFlattensImmediately(Comment(snowman), b"<!--\xe2\x98\x83-->") self.assertFlattensImmediately(CDATA(snowman), b"<![CDATA[\xe2\x98\x83]]>") self.assertFlatteningRaises(Tag(snowman), UnicodeEncodeError) self.assertFlatteningRaises( Tag("p", attributes={snowman: ""}), UnicodeEncodeError )
def packageInitTable(self) -> "Flattenable": children = sorted((o for o in self.ob.contents.values() if not isinstance(o, model.Module) and o.isVisible), key=objects_order) if children: loader = ChildTable.lookup_loader(self.template_lookup) return [ tags.p("From ", tags.code("__init__.py"), ":", class_="fromInitPy"), ChildTable(self.docgetter, self.ob, children, loader) ] else: return ()
def test_serializeUnicode(self): """ Test that unicode is encoded correctly in the appropriate places, and raises an error when it occurs in inappropriate place. """ snowman = u'\N{SNOWMAN}' return gatherResults([ self.assertFlattensTo(snowman, '\xe2\x98\x83'), self.assertFlattensTo(tags.p(snowman), '<p>\xe2\x98\x83</p>'), self.assertFlattensTo(Comment(snowman), '<!--\xe2\x98\x83-->'), self.assertFlattensTo(CDATA(snowman), '<![CDATA[\xe2\x98\x83]]>'), self.assertFlatteningRaises(Tag(snowman), UnicodeEncodeError), self.assertFlatteningRaises(Tag('p', attributes={snowman: ''}), UnicodeEncodeError), ])
def test_serializeUnicode(self): """ Test that unicode is encoded correctly in the appropriate places, and raises an error when it occurs in inappropriate place. """ snowman = u'\N{SNOWMAN}' return gatherResults([ self.assertFlattensTo(snowman, '\xe2\x98\x83'), self.assertFlattensTo(tags.p(snowman), '<p>\xe2\x98\x83</p>'), self.assertFlattensTo(Comment(snowman), '<!--\xe2\x98\x83-->'), self.assertFlattensTo(CDATA(snowman), '<![CDATA[\xe2\x98\x83]]>'), self.assertFlatteningRaises( Tag(snowman), UnicodeEncodeError), self.assertFlatteningRaises( Tag('p', attributes={snowman: ''}), UnicodeEncodeError), ])
def extras(self) -> List["Flattenable"]: r = super().extras() if self.ob.isinterface: namelist = [ o.fullName() for o in sorted(self.ob.implementedby_directly, key=objects_order) ] label = 'Known implementations: ' else: namelist = sorted(self.ob.implements_directly, key=lambda x: x.lower()) label = 'Implements interfaces: ' if namelist: l = assembleList(self.ob.system, label, namelist, "moreInterface", self.page_url) if l is not None: r.append(tags.p(l)) return r
def extras(self): r = [super(ZopeInterfaceClassPage, self).extras()] system = self.ob.system def tl(s): if s in system.allobjects: return taglink(system.allobjects[s]) else: return s if self.ob.isinterface: namelist = sorted([o.fullName() for o in self.ob.implementedby_directly], key=lambda x:x.lower()) label = 'Known implementations: ' else: namelist = sorted(self.ob.implements_directly, key=lambda x:x.lower()) label = 'Implements interfaces: ' if namelist: l = maybeShortenList(self.ob.system, label, namelist, "moreInterface") if l is not None: r.append(tags.p(l)) return r
def format_docstring(obj): """Generate an HTML representation of a docstring""" doc, source = get_docstring(obj) # Use cached or split version if possible. pdoc = getattr(obj, 'parsed_docstring', None) if pdoc is None: if doc is None: return tags.div(class_='undocumented')("Undocumented") pdoc = parse_docstring(obj, doc, source) obj.parsed_docstring = pdoc elif source is None: # A split field is documented by its parent. source = obj.parent try: stan = pdoc.to_stan(_EpydocLinker(source)) except Exception as e: errs = ['%s: %s' % (e.__class__.__name__, e)] if doc is None: stan = tags.p(class_="undocumented")('Broken description') else: pdoc_plain = pydoctor.epydoc.markup.plaintext.parse_docstring( doc, errs) stan = pdoc_plain.to_stan(_EpydocLinker(source)) reportErrors(source, errs) content = [stan] if stan.tagName else stan.children fields = pdoc.fields s = tags.div(*content) if fields: fh = FieldHandler(obj) for field in fields: fh.handle(Field(field, obj)) fh.resolve_types() s(fh.format()) return s
def render(ign, ored): return tags.p("hello, ", tags.transparent(render="test"), " - ", tags.transparent(render="test"))
def header(self, request, tag): return tag(tags.p('Templated content.'), id='content')
def render(ign,ored): return tags.p( 'hello, ', tags.transparent(render='test'), ' - ', tags.transparent(render='test'))
def tags(self, tag): author = tags.span(self.author, class_="author") timestamp = self.timestamp.asDatetime().strftime("%m/%d/%y(%a)%H:%M") number = "No. %d" % self.number comment = tags.p(self.comment) return tag(author, timestamp, number, comment)
def footer(self, request, tag): return tag(tags.p('[1, 2, 3, 4, 5, 6].'), id='extra_info')
def header(self, request, tag): return tag(tags.p('Header'), id='header')
def header(self, request, tag): return tag(tags.p(tags.b("Header")), id="header")
def render(ign, ored): return tags.p('hello, ', tags.transparent(render='test'), ' - ', tags.transparent(render='test'))
def header(self, request, tag): return tag(tags.p('Header.'), id='header')
def footer(self, request, tag): return tag(tags.p('Footer.'), id='footer')
def header(self, request, tag): return tag(tags.p('This is very different'), id='more_info')
def to_stan(self, docstring_linker): return tags.p(self._text, class_='pre')
def footer(self, request, tag): return tag(tags.p("Footer."), id="footer")
def body(self, request, tag): return tag(tags.p('So very different'), id='content')
def footer_left(self, request, tag): return tag(tags.p('Query expression (times are UTC): ', self.bucket.tdata.expression))