1*760c253cSXin Li# -*- coding: utf-8 -*- 2*760c253cSXin Li# Copyright 2019 The ChromiumOS Authors 3*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be 4*760c253cSXin Li# found in the LICENSE file. 5*760c253cSXin Li 6*760c253cSXin Li"""Utilities for generating html.""" 7*760c253cSXin Li 8*760c253cSXin Li 9*760c253cSXin Lidef GetPageHeader(page_title): 10*760c253cSXin Li return ( 11*760c253cSXin Li """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 12*760c253cSXin Li"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 13*760c253cSXin Li<html> 14*760c253cSXin Li<head> 15*760c253cSXin Li<style type="text/css"> 16*760c253cSXin Litable 17*760c253cSXin Li{ 18*760c253cSXin Liborder-collapse:collapse; 19*760c253cSXin Li} 20*760c253cSXin Litable, td, th 21*760c253cSXin Li{ 22*760c253cSXin Liborder:1px solid black; 23*760c253cSXin Li} 24*760c253cSXin Li</style> 25*760c253cSXin Li<script type="text/javascript"> 26*760c253cSXin Lifunction displayRow(id){ 27*760c253cSXin Li var row = document.getElementById("group_"+id); 28*760c253cSXin Li if (row.style.display == '') row.style.display = 'none'; 29*760c253cSXin Li else row.style.display = ''; 30*760c253cSXin Li } 31*760c253cSXin Li</script> 32*760c253cSXin Li<title>%s</title> 33*760c253cSXin Li</head> 34*760c253cSXin Li<body> 35*760c253cSXin Li 36*760c253cSXin Li""" 37*760c253cSXin Li % page_title 38*760c253cSXin Li ) 39*760c253cSXin Li 40*760c253cSXin Li 41*760c253cSXin Lidef GetListHeader(): 42*760c253cSXin Li return "<ul>" 43*760c253cSXin Li 44*760c253cSXin Li 45*760c253cSXin Lidef GetListItem(text): 46*760c253cSXin Li return "<li>%s</li>" % text 47*760c253cSXin Li 48*760c253cSXin Li 49*760c253cSXin Lidef GetListFooter(): 50*760c253cSXin Li return "</ul>" 51*760c253cSXin Li 52*760c253cSXin Li 53*760c253cSXin Lidef GetList(items): 54*760c253cSXin Li return "<ul>%s</ul>" % "".join(["<li>%s</li>" % item for item in items]) 55*760c253cSXin Li 56*760c253cSXin Li 57*760c253cSXin Lidef GetParagraph(text): 58*760c253cSXin Li return "<p>%s</p>" % text 59*760c253cSXin Li 60*760c253cSXin Li 61*760c253cSXin Lidef GetFooter(): 62*760c253cSXin Li return "</body>\n</html>" 63*760c253cSXin Li 64*760c253cSXin Li 65*760c253cSXin Lidef GetHeader(text, h=1): 66*760c253cSXin Li return "<h%s>%s</h%s>" % (h, text, h) 67*760c253cSXin Li 68*760c253cSXin Li 69*760c253cSXin Lidef GetTableHeader(headers): 70*760c253cSXin Li row = "".join(["<th>%s</th>" % header for header in headers]) 71*760c253cSXin Li return "<table><tr>%s</tr>" % row 72*760c253cSXin Li 73*760c253cSXin Li 74*760c253cSXin Lidef GetTableFooter(): 75*760c253cSXin Li return "</table>" 76*760c253cSXin Li 77*760c253cSXin Li 78*760c253cSXin Lidef FormatLineBreaks(text): 79*760c253cSXin Li return text.replace("\n", "<br/>") 80*760c253cSXin Li 81*760c253cSXin Li 82*760c253cSXin Lidef GetTableCell(text): 83*760c253cSXin Li return "<td>%s</td>" % FormatLineBreaks(str(text)) 84*760c253cSXin Li 85*760c253cSXin Li 86*760c253cSXin Lidef GetTableRow(columns): 87*760c253cSXin Li return "<tr>%s</tr>" % "\n".join( 88*760c253cSXin Li [GetTableCell(column) for column in columns] 89*760c253cSXin Li ) 90*760c253cSXin Li 91*760c253cSXin Li 92*760c253cSXin Lidef GetTable(headers, rows): 93*760c253cSXin Li table = [GetTableHeader(headers)] 94*760c253cSXin Li table.extend([GetTableRow(row) for row in rows]) 95*760c253cSXin Li table.append(GetTableFooter()) 96*760c253cSXin Li return "\n".join(table) 97*760c253cSXin Li 98*760c253cSXin Li 99*760c253cSXin Lidef GetLink(link, text): 100*760c253cSXin Li return "<a href='%s'>%s</a>" % (link, text) 101