summaryrefslogtreecommitdiff
path: root/src/devices/grohtml/html-table.cpp
diff options
context:
space:
mode:
authorwl <wl>2007-09-19 14:55:54 +0000
committerwl <wl>2007-09-19 14:55:54 +0000
commite4f206b8a3104ee734b913a2d50980bf5bdf3634 (patch)
tree814cb9652b873192c9648453480aa48f37c41271 /src/devices/grohtml/html-table.cpp
parente128c4d2011e4dce3bb8db70fdeb59816f839c40 (diff)
downloadgroff-e4f206b8a3104ee734b913a2d50980bf5bdf3634.tar.gz
* doc/groff.texinfo: Document new .O register and add cross
reference entries. * NEWS: Updated. * src/devices/grohtml/grohtml.man: Document new -V and -y options. * src/devices/grohtml/html-table.cpp: Add support for XHTML 1.1. (html_table:: emit_colspan, html_table::emit_td): New methods. (html_table::emit_col): Use html_table::emit_td. (html_table::emit_table_header): Use html_table::emit_colspan if dialect xhtml is specified. (html_table::finish_row): Updated. * src/devices/grohtml/html-table.h (html_table): Declare emit_colspan, emit_td. * src/devices/grohtml/html-text.cpp: Modified tags to comply with xhtml if this dialect was requested. * src/devices/grohtml/html-text.h (html_dialect): New enumeration. (html_text): Add new variable `dialect'. * src/devices/grohtml/post-html.cpp: Modify header tags to be XHTML compliant. (valid_flag, groff_sig, dialect): New global variables. (html_printer::handle_valid_flag, html_printer::do_math, html_printer::write_html_anchor, html_printer::write_xhtml_anchor, html_printer::do_math, html_printer::handle_valid_flag): New methods. (html_printer::emit_line, html_printer::emit_raw, html_printer::do_check_center, html_printer::write_title, write_rule, html_printer::writeHeadMetaStyle, generate_img_src, html_printer::begin_page): Altered to be XHTML compliant. (html_printer::write_header): Updated. (html_printer::troff_tag): Call do_math. (html_printer::insert_split_file, html_printer::do_file_components, html_printer::write_navigation): Create XHTML file components if necessary and also produces a groff signature if requested. (~html_printer): Call writeHeadMetaStyle at appropriate places depending upon html_dialect. (html_printer::special): Handle new tags `html<?p>' and `math<?p>'. (main): Added options -x, -V, and -y. (usage): Updated. * src/preproc/eqn/box.cpp: Create a distinction between the MathML device and the XHTML device. (do_text): Issue a newline at the end of the equation if XHTML was specified. (box::top_level): Prefix the output of an equation by the .MATHML macro. (output_string): Suppress \n if XHTML was specified. * src/preproc/eqn/main.cpp (xhtml): New global flag. (inline_equation): Skip leading spaces after inline equation for XHTML device. (main): Set `xhtml' flag if `-Tmathml:xhtml' is specified. * src/preproc/eqn/eqn.h (xhtml): New external flag. * src/preproc/eqn/text.cpp (entity_table): Fix typo. * src/preproc/html/pre-html.cpp (html_dialect): New enumeration. (dialect, eqn_flag): New global variables. (html_system): Improve debugging support. (alterDeviceTo): Test for -Txhtml when altering device to the image device and reset to -Txhtml. (addZ): Renamed to... (addArg): This. Introducea a general parameter. (print_args): New debugging function. (char_buffer::run_output_filter): Use print_args and addArg rather than addZ. (char_buffer::do_html, char_buffer::do_image): Add -rxhtml=1 command line parameter as an argument to the html generation of text when xhtml is needed. Include -e on the command line if mathml is required. (scanArguments): Allow -e, -V, -y and -x options. -V, -y are handled by the back end. -e sets `eqn_flag'. -x determines HTML dialect. * src/roff/groff/groff.cpp (possible_command): New method `clear_name'. (main): Set eflag if -e is present on command line. Set is_xhtml if -Txhtml is present. Pass `-x x' to the HTML pre and post processors. Pass `-e' to the HTML pre processor if required. Pass `-Tmathml:xhtml' to eqn if XHTML is requested. * src/roff/troff/input.cpp (init_input_requests): Introduce new number register `\n[.O]'. * tmac/s.tmac: (LP): Use .nop for semantic sugar. (cov*ab-init) reformat. (@EQ): Use EQN-HTML-IMAGE and friends rather than HTML-IMAGE. (CHECK-FOOTER-AND-KEEP): Define FS, FE such that they use <cite></cite> for the html device rather than generate images for footnotes. * tmac/troffrc-end: Define EQN-HTML-IMAGE, EQN-HTML-IMAGE-END, EQN-HTML-IMAGE-RIGHT, EQN-HTML-IMAGE-LEFT, EQN-HTML-IMAGE-INLINE, EQN-HTML-DO-IMAGE, EQN-HTML-IMAGE-END as null strings. * tmac/www.tmac: (HTML<?p>): New macro. (MATH<?p>): New macro. (IMG, PIMG, MPIMG, HR): Use XHTML compliant syntax. (www-emit-ltag): New macro. (www-push-li): Updated. (ULS): Ensure that tags are balanced in order by use of www-emit-ltag. (ULE): Likewise: Use www-emit-ltag and shut down paragraphs in order. (OLS, OLE, DLS, DLE): Ditto. <global>: Define EQ and EN to EQN-HTML-IMAGE and EQN-HTML-IMAGE-END respectively. (www-li-ul, www-li-ol, www-li-dl): Updated. (EQN-HTML-IMAGE, EQN-HTML-IMAGE-RIGHT, EQN-HTML-IMAGE-LEFT, EQN-HTML-IMAGE-INLINE, EQN-HTML-DO-IMAGE, EQN-HTML-IMAGE-END, MATHML): New macros.
Diffstat (limited to 'src/devices/grohtml/html-table.cpp')
-rw-r--r--src/devices/grohtml/html-table.cpp128
1 files changed, 97 insertions, 31 deletions
diff --git a/src/devices/grohtml/html-table.cpp b/src/devices/grohtml/html-table.cpp
index 7e5b2dc5..c752b766 100644
--- a/src/devices/grohtml/html-table.cpp
+++ b/src/devices/grohtml/html-table.cpp
@@ -1,5 +1,5 @@
// -*- C++ -*-
-/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
*
* Gaius Mulley (gaius@glam.ac.uk) wrote html-table.cpp
*
@@ -41,6 +41,9 @@ Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
# define FALSE (1==0)
#endif
+extern html_dialect dialect;
+
+
tabs::tabs ()
: tab(NULL)
{
@@ -294,7 +297,7 @@ void html_table::set_linelength (int linelen)
}
p = c;
}
- if (p != NULL && p->right > 0)
+ if (p != NULL && p->right > 0 && linelength > p->right)
add_column(p->no+1, p->right, linelength, 'L');
}
@@ -337,10 +340,12 @@ void html_table::emit_table_header (int space)
out->nl();
out->put_string("<table width=\"100%\"")
- .put_string(" border=0 rules=\"none\" frame=\"void\"\n")
+ .put_string(" border=\"0\" rules=\"none\" frame=\"void\"\n")
.put_string(" cellspacing=\"0\" cellpadding=\"0\"");
out->put_string(">")
.nl();
+ if (dialect == xhtml)
+ emit_colspan();
out->put_string("<tr valign=\"top\" align=\"left\"");
if (space) {
out->put_string(" style=\"margin-top: ");
@@ -375,6 +380,82 @@ void html_table::set_space (int space)
}
/*
+ * emit_colspan - emits a series of colspan entries defining the
+ * table columns.
+ */
+
+void html_table::emit_colspan (void)
+{
+ cols *b = columns;
+ cols *c = columns;
+ int width = 0;
+
+ out->put_string("<colgroup>");
+ while (c != NULL) {
+ if (b != NULL && b != c && is_gap(b))
+ /*
+ * blank column for gap
+ */
+ out->put_string("<col width=\"")
+ .put_number(is_gap(b))
+ .put_string("%\" class=\"center\"></col>")
+ .nl();
+
+ width = (get_right(c)*100 + get_effective_linelength()/2)
+ / get_effective_linelength()
+ - (c->left*100 + get_effective_linelength()/2)
+ /get_effective_linelength();
+ switch (c->alignment) {
+ case 'C':
+ out->put_string("<col width=\"")
+ .put_number(width)
+ .put_string("%\" class=\"center\"></col>")
+ .nl();
+ break;
+ case 'R':
+ out->put_string("<col width=\"")
+ .put_number(width)
+ .put_string("%\" class=\"right\"></col>")
+ .nl();
+ break;
+ default:
+ out->put_string("<col width=\"")
+ .put_number(width)
+ .put_string("%\"></col>")
+ .nl();
+ }
+ b = c;
+ c = c->next;
+ }
+ out->put_string("</colgroup>").nl();
+}
+
+/*
+ * emit_td - writes out a <td> tag with a corresponding width
+ * if the dialect is html4.
+ */
+
+void html_table::emit_td (int percentage, const char *s)
+{
+ if (percentage) {
+ if (dialect == html4) {
+ out->put_string("<td width=\"")
+ .put_number(percentage)
+ .put_string("%\"");
+ if (s != NULL)
+ out->put_string(s);
+ out->nl();
+ }
+ else {
+ out->put_string("<td");
+ if (s != NULL)
+ out->put_string(s);
+ out->nl();
+ }
+ }
+}
+
+/*
* emit_col - moves onto column, n.
*/
@@ -405,11 +486,7 @@ void html_table::emit_col (int n)
// have we a gap?
if (last_col != NULL) {
- if (is_gap(b))
- out->put_string("<td width=\"")
- .put_number(is_gap(b))
- .put_string("%\"></td>")
- .nl();
+ emit_td(is_gap(b), "></td>");
b = b->next;
}
@@ -421,17 +498,9 @@ void html_table::emit_col (int n)
/ get_effective_linelength()
- (b->left*100 + get_effective_linelength()/2)
/get_effective_linelength();
- if (width)
- out->put_string("<td width=\"")
- .put_number(width)
- .put_string("%\"></td>")
- .nl();
+ emit_td(width, "></td>");
// have we a gap?
- if (is_gap(b))
- out->put_string("<td width=\"")
- .put_number(is_gap(b))
- .put_string("%\"></td>")
- .nl();
+ emit_td(is_gap(b), "></td>");
b = b->next;
}
width = (get_right(b)*100 + get_effective_linelength()/2)
@@ -440,22 +509,13 @@ void html_table::emit_col (int n)
/get_effective_linelength();
switch (b->alignment) {
case 'C':
- out->put_string("<td width=\"")
- .put_number(width)
- .put_string("%\" align=center>")
- .nl();
+ emit_td(width, " align=center>");
break;
case 'R':
- out->put_string("<td width=\"")
- .put_number(width)
- .put_string("%\" align=right>")
- .nl();
+ emit_td(width, " align=right>");
break;
default:
- out->put_string("<td width=\"")
- .put_number(width)
- .put_string("%\">")
- .nl();
+ emit_td(width);
}
// remember column, b
last_col = b;
@@ -477,7 +537,13 @@ void html_table::finish_row (void)
if (n > 0)
emit_col(n);
- out->put_string("</td>").nl();
+#if 1
+ if (last_col != NULL) {
+ out->put_string("</td>");
+ last_col = NULL;
+ }
+#endif
+ out->put_string("</tr>").nl();
}
}