我们从Python开源项目中,提取了以下38个代码示例,用于说明如何使用docutils.nodes.thead()。
def visit_entry(self, node): atts = {'class': []} if isinstance(node.parent.parent, nodes.thead): atts['class'].append('head') if node.parent.parent.parent.stubs[node.parent.column]: # "stubs" list is an attribute of the tgroup element atts['class'].append('stub') if atts['class']: tagname = 'th' atts['class'] = ' '.join(atts['class']) else: tagname = 'td' del atts['class'] node.parent.column += 1 if 'morerows' in node: atts['rowspan'] = node['morerows'] + 1 if 'morecols' in node: atts['colspan'] = node['morecols'] + 1 node.parent.column += node['morecols'] self.body.append(self.starttag(node, tagname, '', **atts)) self.context.append('</%s>\n' % tagname.lower()) # TODO: why does the html4css1 writer insert an NBSP into empty cells? # if len(node) == 0: # empty cell # self.body.append(' ') # no-break space
def visit_entry(self, node): atts = {'class': []} if isinstance(node.parent.parent, nodes.thead): atts['class'].append('head') if node.parent.parent.parent.stubs[node.parent.column]: # "stubs" list is an attribute of the tgroup element atts['class'].append('stub') if atts['class']: tagname = 'th' atts['class'] = ' '.join(atts['class']) else: tagname = 'td' del atts['class'] node.parent.column += 1 if 'morerows' in node: atts['rowspan'] = node['morerows'] + 1 if 'morecols' in node: atts['colspan'] = node['morecols'] + 1 node.parent.column += node['morecols'] self.body.append(self.starttag(node, tagname, '', **atts)) self.context.append('</%s>\n' % tagname.lower()) if len(node) == 0: # empty cell self.body.append(' ') self.set_first_last(node)
def visit_entry(self, node): if self.table.col != 0: self.body.append('&') self.table.col += 1 context = '' if isinstance(node.parent.parent, nodes.thead): if len(node) == 1 and isinstance(node[0], nodes.paragraph) and node.astext() == '': pass else: self.body.append(' \\textbf{\\textsf ') context += '} ' if len(node.traverse(nodes.paragraph)) >= 2: self.table.has_problematic = True self.context.append(context)
def visit_thead(self, node): self.body.append(self.starttag(node, 'thead'))
def depart_thead(self, node): self.body.append('</thead>\n')
def build_table_from_list(self, table_data, widths, col_widths, header_rows, stub_columns): table = nodes.table() if widths: table['classes'] += ['colwidths-%s' % widths] tgroup = nodes.tgroup(cols=len(col_widths)) table += tgroup for col_width in col_widths: colspec = nodes.colspec() if col_width is not None: colspec.attributes['colwidth'] = col_width if stub_columns: colspec.attributes['stub'] = 1 stub_columns -= 1 tgroup += colspec rows = [] for row in table_data: row_node = nodes.row() for cell in row: entry = nodes.entry() entry += cell row_node += entry rows.append(row_node) if header_rows: thead = nodes.thead() thead.extend(rows[:header_rows]) tgroup += thead tbody = nodes.tbody() tbody.extend(rows[header_rows:]) tgroup += tbody return table
def build_table_from_list(self, table_data, col_widths, header_rows, stub_columns): table = nodes.table() if self.widths == 'auto': table['classes'] += ['colwidths-auto'] elif self.widths: # "grid" or list of integers table['classes'] += ['colwidths-given'] tgroup = nodes.tgroup(cols=len(col_widths)) table += tgroup for col_width in col_widths: colspec = nodes.colspec() if col_width is not None: colspec.attributes['colwidth'] = col_width if stub_columns: colspec.attributes['stub'] = 1 stub_columns -= 1 tgroup += colspec rows = [] for row in table_data: row_node = nodes.row() for cell in row: entry = nodes.entry() entry += cell row_node += entry rows.append(row_node) if header_rows: thead = nodes.thead() thead.extend(rows[:header_rows]) tgroup += thead tbody = nodes.tbody() tbody.extend(rows[header_rows:]) tgroup += tbody return table
def build_table(self): table = nodes.table() tgroup = nodes.tgroup(cols=len(self.headers)) table += tgroup # TODO(sdague): it would be really nice to figure out how not # to have this stanza, it kind of messes up all of the table # formatting because it doesn't let tables just be the right # size. tgroup.extend( nodes.colspec(colwidth=col_width, colname='c' + str(idx)) for idx, col_width in enumerate(self.col_widths) ) thead = nodes.thead() tgroup += thead row_node = nodes.row() thead += row_node row_node.extend(nodes.entry(h, nodes.paragraph(text=h)) for h in self.headers) tbody = nodes.tbody() tgroup += tbody rows, groups = self.collect_rows() tbody.extend(rows) table.extend(groups) return table
def visit_tgroup(self, node): # Mozilla needs <colgroup>: self.body.append(self.starttag(node, 'colgroup')) # Appended by thead or tbody: self.context.append('</colgroup>\n') node.stubs = []
def visit_thead(self, node): self.write_colspecs() self.body.append(self.context.pop()) # '</colgroup>\n' # There may or may not be a <thead>; this is for <tbody> to use: self.context.append('') self.body.append(self.starttag(node, 'thead', valign='bottom'))
def build_table_from_list(self, table_data, col_widths, header_rows, stub_columns): table = nodes.table() tgroup = nodes.tgroup(cols=len(col_widths)) table += tgroup for col_width in col_widths: colspec = nodes.colspec(colwidth=col_width) if stub_columns: colspec.attributes['stub'] = 1 stub_columns -= 1 tgroup += colspec rows = [] for row in table_data: row_node = nodes.row() for cell in row: entry = nodes.entry() entry += cell row_node += entry rows.append(row_node) if header_rows: thead = nodes.thead() thead.extend(rows[:header_rows]) tgroup += thead tbody = nodes.tbody() tbody.extend(rows[header_rows:]) tgroup += tbody return table
def build_table(self, table_data, col_widths): table = nodes.table() # Set up the column specifications # based on the widths. tgroup = nodes.tgroup(cols=len(self.HEADERS)) table += tgroup tgroup.extend(nodes.colspec(colwidth=col_width) for col_width in col_widths) # Set the headers thead = nodes.thead() tgroup += thead row_node = nodes.row() thead += row_node row_node.extend( nodes.entry(h, nodes.paragraph(text=h)) for h in self.HEADERS ) # The body of the table is made up of rows. # Each row contains a series of entries, # and each entry contains a paragraph of text. tbody = nodes.tbody() tgroup += tbody rows = [] for row in table_data: trow = nodes.row() # Iterate over the headers in the same order every time. for h in self.HEADERS: # Get the cell value from the row data, replacing None # in re match group with empty string. cell = row.get(self.HEADER_MAP[h]) or '' entry = nodes.entry() para = nodes.paragraph(text=str(cell)) entry += para trow += entry rows.append(trow) tbody.extend(rows) return table
def run(self): env = self.state.document.settings.env try: if self.arguments and self.content: raise self.warning('both argument and content. it is invalid') if self.arguments: dirname = os.path.dirname(env.doc2path(env.docname, base=None)) relpath = os.path.join(dirname, self.arguments[0]) abspath = os.path.join(env.srcdir, relpath) if not os.access(abspath, os.R_OK): raise self.warning('JSON Schema file not readable: %s' % self.arguments[0]) env.note_dependency(relpath) schema = JSONSchema.loadfromfile(abspath) else: schema = JSONSchema.loadfromfile(''.join(self.content)) except ValueError as exc: raise self.error('Failed to parse JSON Schema: %s' % exc) headers = ['Name', 'Type', 'Description', 'Validations'] widths = [1, 1, 1, 2] tgroup = nodes.tgroup(cols=len(headers)) for width in widths: tgroup += nodes.colspec(colwidth=width) table = nodes.table('', tgroup) header_row = nodes.row() for header in headers: entry = nodes.entry('', nodes.paragraph(text=header)) header_row += entry tgroup += nodes.thead('', header_row) tbody = nodes.tbody() tgroup += tbody for prop in schema: row = nodes.row() row += self.cell(prop.name) if prop.required: row += self.cell(prop.type + " (required)") else: row += self.cell(prop.type) row += self.cell(prop.description or '') row += self.cell('\n'.join(('* %s' % v for v in prop.validations))) tbody += row return [table]
def visit_entry(self, node): # cell separation if self.active_table.get_entry_number() == 0: self.insert_additional_table_colum_delimiters() else: self.out.append(' & ') # multirow, multicolumn if 'morerows' in node and 'morecols' in node: raise NotImplementedError('Cells that ' 'span multiple rows *and* columns currently not supported, sorry.') # TODO: should be possible with LaTeX, see e.g. # http://texblog.org/2012/12/21/multi-column-and-multi-row-cells-in-latex-tables/ # multirow in LaTeX simply will enlarge the cell over several rows # (the following n if n is positive, the former if negative). if 'morerows' in node: self.requirements['multirow'] = r'\usepackage{multirow}' mrows = node['morerows'] + 1 self.active_table.set_rowspan( self.active_table.get_entry_number(), mrows) self.out.append('\\multirow{%d}{%s}{' % (mrows, self.active_table.get_column_width())) self.context.append('}') elif 'morecols' in node: # the vertical bar before column is missing if it is the first # column. the one after always. if self.active_table.get_entry_number() == 0: bar1 = self.active_table.get_vertical_bar() else: bar1 = '' mcols = node['morecols'] + 1 self.out.append('\\multicolumn{%d}{%s%s%s}{' % (mcols, bar1, self.active_table.get_multicolumn_width( self.active_table.get_entry_number(), mcols), self.active_table.get_vertical_bar())) self.context.append('}') else: self.context.append('') # bold header/stub-column if len(node) and (isinstance(node.parent.parent, nodes.thead) or self.active_table.is_stub_column()): self.out.append('\\textbf{') self.context.append('}') else: self.context.append('') # if line ends with '{', mask line break to prevent spurious whitespace if not self.active_table.colwidths_auto and self.out[-1].endswith("{"): self.out.append("%") self.active_table.visit_entry() # increment cell count
def visit_entry(self, node): if self.table.col == 0: while self.remember_multirow.get(self.table.col + 1, 0): self.table.col += 1 self.remember_multirow[self.table.col] -= 1 if self.remember_multirowcol.get(self.table.col, 0): extracols = self.remember_multirowcol[self.table.col] self.body.append(' \multicolumn{') self.body.append(str(extracols + 1)) self.body.append('}{|l|}{}') self.table.col += extracols self.body.append(' & ') else: self.body.append(' & ') self.table.col += 1 context = '' if 'morecols' in node: self.body.append(' \multicolumn{') self.body.append(str(node.get('morecols') + 1)) if self.table.col == 1: self.body.append('}{|l|}{') else: self.body.append('}{l|}{') context += '}' if 'morerows' in node: self.body.append(' \multirow{') self.body.append(str(node.get('morerows') + 1)) self.body.append('}{*}{') context += '}' self.remember_multirow[self.table.col] = node.get('morerows') if 'morecols' in node: if 'morerows' in node: self.remember_multirowcol[self.table.col] = node.get('morecols') self.table.col += node.get('morecols') if (('morecols' in node or 'morerows' in node) and (len(node) > 2 or len(node.astext().split('\n')) > 2)): self.in_merged_cell = 1 self.literal_whitespace += 1 self.body.append('\\eqparbox{%d}{\\vspace{.5\\baselineskip}\n' % id(node)) self.pushbody([]) context += '}' if isinstance(node.parent.parent, nodes.thead): if len(node) == 1 and isinstance(node[0], nodes.paragraph) and node.astext() == '': pass else: self.body.append('\\textsf{\\relax ') context += '}' while self.remember_multirow.get(self.table.col + 1, 0): self.table.col += 1 self.remember_multirow[self.table.col] -= 1 context += ' & ' if self.remember_multirowcol.get(self.table.col, 0): extracols = self.remember_multirowcol[self.table.col] context += ' \multicolumn{' context += str(extracols + 1) context += '}{l|}{}' self.table.col += extracols if len(node.traverse(nodes.paragraph)) >= 2: self.table.has_problematic = True self.context.append(context)
def _build_markup(self, notifications): content = [] cols = ['Notification class', 'Payload class', 'Sample file link'] table = nodes.table() content.append(table) group = nodes.tgroup(cols=len(cols)) table.append(group) head = nodes.thead() group.append(head) for i in range(len(cols)): group.append(nodes.colspec(colwidth=1)) body = nodes.tbody() group.append(body) # fill the table header row = nodes.row() body.append(row) for col_name in cols: col = nodes.entry() row.append(col) text = nodes.strong(text=col_name) col.append(text) # fill the table content, one notification per row for name, payload, sample in notifications: row = nodes.row() body.append(row) col = nodes.entry() row.append(col) text = nodes.literal(text=name) col.append(text) col = nodes.entry() row.append(col) text = nodes.literal(text=payload) col.append(text) col = nodes.entry() row.append(col) ref = nodes.reference(refuri=self.LINK_PREFIX + self.SAMPLE_ROOT + sample) txt = nodes.inline() col.append(txt) txt.append(ref) ref.append(nodes.literal(text=sample)) return content