# -*- coding: utf-8 -*-
# Copyright 2019 The ChromiumOS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Utilities for generating html."""


def GetPageHeader(page_title):
  return """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<style type="text/css">
table
{
border-collapse:collapse;
}
table, td, th
{
border:1px solid black;
}
</style>
<script type="text/javascript">
function displayRow(id){
  var row = document.getElementById("group_"+id);
  if (row.style.display == '')  row.style.display = 'none';
    else row.style.display = '';
  }
</script>
<title>%s</title>
</head>
<body>

""" % page_title


def GetListHeader():
  return '<ul>'


def GetListItem(text):
  return '<li>%s</li>' % text


def GetListFooter():
  return '</ul>'


def GetList(items):
  return '<ul>%s</ul>' % ''.join(['<li>%s</li>' % item for item in items])


def GetParagraph(text):
  return '<p>%s</p>' % text


def GetFooter():
  return '</body>\n</html>'


def GetHeader(text, h=1):
  return '<h%s>%s</h%s>' % (h, text, h)


def GetTableHeader(headers):
  row = ''.join(['<th>%s</th>' % header for header in headers])
  return '<table><tr>%s</tr>' % row


def GetTableFooter():
  return '</table>'


def FormatLineBreaks(text):
  return text.replace('\n', '<br/>')


def GetTableCell(text):
  return '<td>%s</td>' % FormatLineBreaks(str(text))


def GetTableRow(columns):
  return '<tr>%s</tr>' % '\n'.join([GetTableCell(column) for column in columns])


def GetTable(headers, rows):
  table = [GetTableHeader(headers)]
  table.extend([GetTableRow(row) for row in rows])
  table.append(GetTableFooter())
  return '\n'.join(table)


def GetLink(link, text):
  return "<a href='%s'>%s</a>" % (link, text)
