itextpdf 5.5 and xmlworker 5.5 jar giving Runtimeworker exception in Java - itext

I am getting the error below for itextpdf 5.5 jar in Chrome Version 79.0.3945.88 (Official Build) (64-bit) and IE browser.
html content that gives this error.
Caused by: com.itextpdf.tool.xml.exceptions.RuntimeWorkerException: Invalid nested tag span</td found, expected closing tag span.
at com.itextpdf.tool.xml.XMLWorker.endElement(XMLWorker.java:135)
at com.itextpdf.tool.xml.parser.XMLParser.endElement(XMLParser.java:396)
at com.itextpdf.tool.xml.parser.XMLParser.parse(XMLParser.java:175)
at com.app.bean.Main.createPDF(Main.java:1113)
... 36 more
html content:
<table ">
<tr>
<th style="font-weight:bold">Sl.No.</th>
..
</tr>
<tr>
..
<td width="65%" align="left">
<table border="0" cellspacing="0" cellpadding="3" align="left" style="border-collapse:collapse;" width="100%">
<tr>
..
<td width="65%" align="left">
<table border="0" cellspacing="0" cellpadding="3" align="left" style="border-collapse:collapse;" width="100%">
<tr>
<td align="left"><b>Missing in Comparison File : </b><span style="background-color:LIGHTCOROL;">IT1**1*EA*297**VC*5315114*N4*49502010102</span></td>
</tr>
<tr>
<td align="left"><b>Base File: </b>CTT*<span style="background-color:yellow;">2</span>*<span style="background-color:yellow;">1</span><br><br/><b>Comparison File: </b>CTT*<span style="background-color:yellow;">1</span>*<span style="background-color:yellow;">3</span><span style="background-color:yellow;">123</span</td>
</tr>
<tr>
<td align="left"><b>Base File: </b>SE*<span style="background-color:yellow;">9</span>*618600001<br><br/><b>Comparison File: </b>SE*<span style="background-color:yellow;">8</span>*618600000</td>
</tr>
</table>
</td>
</tr>
<tr>
<td width="65%" align="left">
<table border="0" cellspacing="0" cellpadding="3" align="left" style="border-collapse:collapse;" width="100%">
<tr>
</tr>
..
</table>
</td>
</tr>
</table>

In this line
<td align="left"><b>Base File: </b>CTT*[...]<span style="background-color:yellow;">123</span</td>
^^^^^^
you see that the last closing span is missing its final >.

Related

Issue with table side-by-side only on Outlook software

I'm creating a HTML email, it works fine on all the mail clients I tested except on Outlook 2016 software (works fine on Outlook website)
I tried to use td side-by-side instead of table but it's breaking my responsiveness. Tables are supposed to side-by-side splitting the email in 2 parts. In Outlook software, there is a big gap above the second table making if shifted and not aligned with the first one.
Here is my code:
<tr>
<td align="center" bgcolor="#EEEEEE">
<table align="center" bgcolor="#FFFFFF" border="0" cellpadding="0" cellspacing="0" class="ee_element ee_textelement" data-title="Text" style="width: 700px; table-layout: auto;" width="700">
<tbody>
<tr>
<td align="center" valign="top">
<table align="center" border="0" cellpadding="0" cellspacing="0" class="em_wrapper" style="width:700px;table-layout: auto;" width="100%">
<tbody>
<tr>
<td align="left" valign="top">
<table align="left" border="0" cellpadding="0" cellspacing="0" class="em_wrapper" style="width:350px;table-layout: auto;" width="350">
<tbody>
<tr>
<td align="center" class="em_pad_top" valign="top">
<table align="center" bgcolor="#FFFFFF" border="0" cellpadding="0" cellspacing="0" class="sbs_block h_auto" style="width: 350px; background-color: rgb(255, 255, 255);table-layout: auto;height:400px" width="350">
<tbody>
<tr>
<td bgcolor="#00865B" class="col" style="vertical-align: middle;" width="350">
<table cellpadding="0" cellspacing="0" role="presentation" width="100%">
<tr>
<td>
<p style="color: #FFFFFF; margin: 0;font-size:16px">Lorem Ipsum</p>
</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<table align="left" border="0" cellpadding="0" cellspacing="0" class="em_wrapper" style="width:350px;table-layout: auto;" width="350">
<tbody>
<tr>
<td align="center" class="em_pad_top" valign="top">
<table align="center" bgcolor="#FFFFFF" border="0" cellpadding="0" cellspacing="0" class="sbs_block h_auto" style="width: 350px; background-color: rgb(255, 255, 255);table-layout: auto;height:400px" width="350">
<tbody>
<tr>
<td bgcolor="#00865B" class="col" style="vertical-align: middle;" width="350">
<table cellpadding="0" cellspacing="0" role="presentation" width="100%">
<tr>
<td>
<p style="color: #FFFFFF; margin: 0;font-size:16px">Lorem Ipsum</p>
</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</table>
I'm expecting to have my 2 tables properly aligned side-by-side like I have them on all other email clients.
welcome to SO!
To do this - you will need to place the following snippet between your 2 left aligned tables:
<!--[if mso]>
</td>
<td valign="top" align="center">
<![endif]-->
Due to the nature of MSO - it doesn't support table floating, so this effectively lies to MSO and turns them into 2 columns.
<td align="center" bgcolor="#EEEEEE">
<table align="center" bgcolor="#FFFFFF" border="0" cellpadding="0" cellspacing="0" class="ee_element ee_textelement" data-title="Text" style="width: 700px; table-layout: auto;" width="700">
<tbody>
<tr>
<td align="center" valign="top">
<table align="center" border="0" cellpadding="0" cellspacing="0" class="em_wrapper" style="width:700px;table-layout: auto;" width="100%">
<tbody>
<tr>
<td align="left" valign="top">
<table align="left" border="0" cellpadding="0" cellspacing="0" class="em_wrapper" style="width:350px;table-layout: auto;" width="350">
<tbody>
<tr>
<td align="center" class="em_pad_top" valign="top">
<table align="center" bgcolor="#FFFFFF" border="0" cellpadding="0" cellspacing="0" class="sbs_block h_auto" style="width: 350px; background-color: rgb(255, 255, 255);table-layout: auto;height:400px" width="350">
<tbody>
<tr>
<td bgcolor="#00865B" class="col" style="vertical-align: middle;" width="350">
<table cellpadding="0" cellspacing="0" role="presentation" width="100%">
<tr>
<td>
<p style="color: #FFFFFF; margin: 0;font-size:16px">Lorem Ipsum</p>
</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<!--[if mso]>
</td>
<td valign="top" align="center">
<![endif]-->
<table align="left" border="0" cellpadding="0" cellspacing="0" class="em_wrapper" style="width:350px;table-layout: auto;" width="350">
<tbody>
<tr>
<td align="center" class="em_pad_top" valign="top">
<table align="center" bgcolor="#FFFFFF" border="0" cellpadding="0" cellspacing="0" class="sbs_block h_auto" style="width: 350px; background-color: rgb(255, 255, 255);table-layout: auto;height:400px" width="350">
<tbody>
<tr>
<td bgcolor="#00865B" class="col" style="vertical-align: middle;" width="350">
<table cellpadding="0" cellspacing="0" role="presentation" width="100%">
<tr>
<td>
<p style="color: #FFFFFF; margin: 0;font-size:16px">Lorem Ipsum</p>
</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
Just one of the many quirks with mso :)

Perl XML::LibXML XPath 2.0 to XPath 1.0

I have the following XPath that works fine in XPath 2.0 (as tested in OxygenXML):
//h2[a[#id='start']]/following-sibling::*[not(preceding-sibling::*[self::div[#id='end']])]
but I'm getting different results when I use it with LibXML findnodes():
my #nodes = $source_doc->findnodes('//h2[a[#id="start"]]/following-sibling::*[not(preceding-sibling::*[self::div[#id="end"]])]');
After checking the LibXML documentation, it seems that LibXML supports XPath 1.0 only. How would I go about changing my XPath to something that works with XPath 1.0? Is it even possible to create a compatible path like this in XPath 1.0?
Since I've been asked to provide, I'm updating the post to include my sample data and the output I'm getting when I run the XPath I entered above:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="insn.css" />
<meta name="generator" content="encodingindex.xsl" />
<title>Index by Encoding</title>
</head>
<body><hr /><h1 class="topleveltable"><a name="top" id="top"></a>Top-level encodings</h1><div
class="regdiagram-32"></div><hr /><h2><a name="dp" id="start"></a>Data-processing and
miscellaneous instructions</h2><div class="decode_navigation">
<p>These instructions are under the top-level.</p>
</div><div class="regdiagram-32">
<table class="regdiagram">
<thead>
<tr>
<td>31</td>
<td>0</td>
</tr>
</thead>
<tbody>
<tr class="firstrow">
<td colspan="4" class="lr">!= 1111</td>
<td colspan="2" class="lr">00</td>
<td class="lr">op0</td>
<td colspan="5" class="lr">op1</td>
<td colspan="12" class="lr"></td>
<td class="lr">op2</td>
<td colspan="2" class="lr">op3</td>
<td class="lr">op4</td>
<td colspan="4" class="lr"></td>
</tr>
</tbody>
</table>
</div><div class="instructiontable">
<table class="instructiontable">
<tr>
<th colspan="5">Decode fields</th>
<th rowspan="2"> Instruction details </th>
</tr>
<tr>
<th class="bitfields">op0</th>
<th class="bitfields">op1</th>
<th class="bitfields">op2</th>
<th class="bitfields">op3</th>
<th class="bitfields">op4</th>
</tr>
<tr class="instructiontable">
<td class="bitfield"> 0 </td>
<td class="bitfield"> </td>
<td class="bitfield"> 1 </td>
<td class="bitfield"> != 00 </td>
<td class="bitfield"> 1 </td>
<td class="iformname">Extra load/store</td>
</tr>
<tr class="instructiontable">
<td class="bitfield"> 0 </td>
<td class="bitfield"> 0xxxx </td>
<td class="bitfield"> 1 </td>
<td class="bitfield"> 00 </td>
<td class="bitfield"> 1 </td>
<td class="iformname">Multiply and Accumulate</td>
</tr>
</table>
</div><hr /><h2><a name="sync" id="sync"></a>Synchronization primitives and
Load-Acquire/Store-Release</h2><div class="decode_navigation">
<p>These instructions are under <a href="#dp">Data-processing and miscellaneous
instructions</a>.</p>
</div><div class="regdiagram-32">
<table class="regdiagram">
<thead>
<tr>
<td>31</td>
<td>0</td>
</tr>
</thead>
<tbody>
<tr class="firstrow">
<td colspan="4" class="lr">!= 1111</td>
<td colspan="4" class="lr">0001</td>
<td class="lr">op0</td>
<td colspan="11" class="lr"></td>
<td colspan="2" class="lr">11</td>
<td colspan="2" class="lr"></td>
<td colspan="4" class="lr">1001</td>
<td colspan="4" class="lr"></td>
</tr>
</tbody>
</table>
</div><hr /><hr /><h2><a name="dpmisc" id="dpmisc"></a>Miscellaneous</h2><div
class="decode_navigation">
<p>These instructions are under <a href="#dp">Data-processing and miscellaneous
instructions</a>.</p>
</div><div class="regdiagram-32">
<table class="regdiagram">
<thead>
<tr>
<td>31</td>
<td>30</td>
<td>0</td>
</tr>
</thead>
<tbody>
<tr class="firstrow">
<td colspan="4" class="lr">!= 1111</td>
<td colspan="5" class="lr">00010</td>
<td colspan="2" class="lr">op0</td>
<td colspan="1" class="lr">0</td>
<td colspan="12" class="lr"></td>
<td colspan="1" class="lr">0</td>
<td colspan="3" class="lr">op1</td>
<td colspan="4" class="lr"></td>
</tr>
</tbody>
</table>
</div><div class="instructiontable">
<table class="instructiontable">
<tr>
<th colspan="2">Decode fields</th>
<th rowspan="2"> Instruction details </th>
</tr>
<tr>
<th class="bitfields">op0</th>
<th class="bitfields">op1</th>
</tr>
<tr class="instructiontable">
<td class="bitfield"> 01 </td>
<td class="bitfield"> 010 </td>
<td class="iformname">BXJ</td>
</tr>
<tr class="instructiontable">
<td class="bitfield"> 01 </td>
<td class="bitfield"> 011 </td>
<td class="iformname">BLX (register)</td>
</tr>
</table>
</div><div class="decode_navigation">
<p>These instructions are under <a href="#dp">Data-processing and miscellaneous
instructions</a>.</p>
</div><div class="regdiagram-32">
<table class="regdiagram">
<thead>
<tr>
<td>31</td>
<td>30</td>
<td>0</td>
</tr>
</thead>
<tbody>
<tr class="firstrow">
<td colspan="4" class="lr">!= 1111</td>
<td colspan="3" class="lr">000</td>
<td colspan="2" class="lr">op0</td>
<td colspan="2" class="lr"></td>
<td class="lr">op1</td>
<td colspan="15" class="lr"></td>
<td colspan="1" class="lr">0</td>
<td colspan="4" class="lr"></td>
</tr>
</tbody>
</table>
</div><div class="decode_constraints">
<p> The following constraints also apply to this encoding: op0:op1 != 100 </p>
</div><div class="instructiontable">
<table class="instructiontable">
<tr>
<th colspan="2">Decode fields</th>
<th rowspan="2"> Instruction details </th>
</tr>
<tr>
<th class="bitfields">op0</th>
<th class="bitfields">op1</th>
</tr>
<tr class="instructiontable">
<td class="bitfield"> 0x </td>
<td class="bitfield"> </td>
<td class="iformname"><a href="#intdp3reg_immsh">Integer Data Processing (three register,
immediate shift)</a></td>
</tr>
<tr class="instructiontable">
<td class="bitfield"> 10 </td>
<td class="bitfield"> 1 </td>
<td class="iformname"><a href="#intdp2reg_immsh">Integer Test and Compare (two register,
immediate shift)</a></td>
</tr>
<tr class="instructiontable">
<td class="bitfield"> 11 </td>
<td class="bitfield"> </td>
<td class="iformname"><a href="#logic3reg_immsh">Logical Arithmetic (three register,
immediate shift)</a></td>
</tr>
</table>
</div><hr /><div class="iclass" id="intdp3reg_immsh">
<a name="intdp3reg_immsh" id="intdp3reg_immsh"></a>
<h3 class="iclass">Integer Data Processing (three register, immediate shift)</h3>
<p>These instructions are under <a href="#dpregis">Data-processing register (immediate
shift)</a>.</p>
<div class="regdiagram-32">
<table class="regdiagram">
<thead>
<tr>
<td>31</td>
<td>0</td>
</tr>
</thead>
<tbody>
<tr class="firstrow">
<td colspan="4" class="lr">!= 1111</td>
<td class="l">0</td>
<td>0</td>
<td>0</td>
<td class="r">0</td>
<td colspan="3" class="lr">opc</td>
<td class="lr">S</td>
<td colspan="4" class="lr">Rn</td>
<td colspan="4" class="lr">Rd</td>
<td colspan="5" class="lr">imm5</td>
<td colspan="2" class="lr">type</td>
<td class="lr">0</td>
<td colspan="4" class="lr">Rm</td>
</tr>
<tr class="secondrow">
<td colspan="4" class="droppedname">cond</td>
<td colspan="4"></td>
<td colspan="3"></td>
<td></td>
<td colspan="4"></td>
<td colspan="4"></td>
<td colspan="5"></td>
<td colspan="2"></td>
<td></td>
<td colspan="4"></td>
</tr>
</tbody>
</table>
</div>
<div class="decode_constraints">
<p> The following constraints also apply to this encoding: cond != 1111 && cond !=
1111 </p>
</div>
<div class="instructiontable">
<table class="instructiontable" id="intdp3reg_immsh">
<thead class="instructiontable">
<tr>
<th class="bitfields-heading" rowspan="" colspan="3">Decode fields</th>
<th class="iformname" rowspan="2" colspan=""> Instruction Details </th>
</tr>
<tr>
<th class="bitfields" rowspan="" colspan="">opc</th>
<th class="bitfields" rowspan="" colspan="">S</th>
<th class="bitfields" rowspan="" colspan="">Rn</th>
</tr>
</thead>
<tbody>
<tr>
<td class="bitfield">000</td>
<td class="bitfield"></td>
<td class="bitfield"></td>
<td class="iformname"><a name="AND_r" href="and_r.html" id="AND_r">AND, ANDS
(register)</a></td>
</tr>
<tr>
<td class="bitfield">001</td>
<td class="bitfield"></td>
<td class="bitfield"></td>
<td class="iformname"><a name="EOR_r" href="eor_r.html" id="EOR_r">EOR, EORS
(register)</a></td>
</tr>
</tbody>
</table>
</div>
</div><div class="decode_constraints">
<p> The following constraints also apply to this encoding: op0:op1 != 100 </p>
</div><div class="instructiontable">
<table class="instructiontable">
<tr>
<th colspan="2">Decode fields</th>
<th rowspan="2"> Instruction details </th>
</tr>
<tr>
<th class="bitfields">op0</th>
<th class="bitfields">op1</th>
</tr>
<tr class="instructiontable">
<td class="bitfield"> 0x </td>
<td class="bitfield"> </td>
<td class="iformname"><a href="#intdp3reg_regsh">Integer Data Processing (three register,
register shift)</a></td>
</tr>
<tr class="instructiontable">
<td class="bitfield"> 10 </td>
<td class="bitfield"> 1 </td>
<td class="iformname"><a href="#intdp2reg_regsh">Integer Test and Compare (two register,
register shift)</a></td>
</tr>
</table>
</div><hr /><h2><a name="dpimm" id="dpimm"></a>Data-processing immediate</h2><div
class="decode_navigation">
<p>These instructions are under <a href="#dp">Data-processing and miscellaneous
instructions</a>.</p>
</div><div class="regdiagram-32">
<table class="regdiagram">
<thead>
<tr>
<td>31</td>
<td>0</td>
</tr>
</thead>
<tbody>
<tr class="firstrow">
<td colspan="4" class="lr">!= 1111</td>
<td colspan="3" class="lr">001</td>
<td colspan="2" class="lr">op0</td>
<td colspan="1" class="lr"></td>
<td colspan="2" class="lr">op1</td>
<td colspan="20" class="lr"></td>
</tr>
</tbody>
</table>
</div><div class="instructiontable">
<table class="instructiontable">
<tr>
<th colspan="2">Decode fields</th>
<th rowspan="2"> Instruction details </th>
</tr>
<tr>
<th class="bitfields">op0</th>
<th class="bitfields">op1</th>
</tr>
<tr class="instructiontable">
<td class="bitfield"> 0x </td>
<td class="bitfield"> </td>
<td class="iformname"><a href="#intdp2reg_imm">Integer Data Processing (two register and
immediate)</a></td>
</tr>
</table>
</div><hr /><div class="iclass" id="intdp2reg_imm">
<a name="intdp2reg_imm" id="intdp2reg_imm"></a>
</div><div class="iclass" id="end">
<a name="ldstimm" id="ldstimm"></a>
<h3 class="iclass">Load/Store Word, Unsigned Byte (immediate, literal)</h3>
<div class="regdiagram-32">
<table class="regdiagram">
<thead>
<tr>
<td>31</td>
<td>0</td>
</tr>
</thead>
<tbody>
<tr class="firstrow">
<td colspan="4" class="lr">!= 1111</td>
<td class="l">0</td>
<td>1</td>
<td class="r">0</td>
<td class="lr">P</td>
<td class="lr">U</td>
<td class="lr">o2</td>
<td class="lr">W</td>
<td class="lr">o1</td>
<td colspan="4" class="lr">Rn</td>
<td colspan="4" class="lr">Rt</td>
<td colspan="12" class="lr">imm12</td>
</tr>
<tr class="secondrow">
<td colspan="4" class="droppedname">cond</td>
<td colspan="3"></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td colspan="4"></td>
<td colspan="4"></td>
<td colspan="12"></td>
</tr>
</tbody>
</table>
</div>
<div class="decode_constraints">
<p> The following constraints also apply to this encoding: cond != 1111 && cond !=
1111 </p>
</div>
<div class="instructiontable">
<table class="instructiontable" id="ldstimm">
<thead class="instructiontable">
<tr>
<th class="bitfields-heading" rowspan="" colspan="4">Decode fields</th>
<th class="iformname" rowspan="2" colspan=""> Instruction Details </th>
</tr>
<tr>
<th class="bitfields" rowspan="" colspan="">P:W</th>
<th class="bitfields" rowspan="" colspan="">o2</th>
<th class="bitfields" rowspan="" colspan="">o1</th>
<th class="bitfields" rowspan="" colspan="">Rn</th>
</tr>
</thead>
<tbody>
<tr>
<td class="bitfield">!= 01</td>
<td class="bitfield">0</td>
<td class="bitfield">1</td>
<td class="bitfield">1111</td>
<td class="iformname"><a name="LDR_l" href="ldr_l.html" id="LDR_l">LDR
(literal)</a></td>
</tr>
<tr>
<td class="bitfield">!= 01</td>
<td class="bitfield">1</td>
<td class="bitfield">1</td>
<td class="bitfield">1111</td>
<td class="iformname"><a name="LDRB_l" href="ldrb_l.html" id="LDRB_l">LDRB
(literal)</a></td>
</tr>
</tbody>
</table>
</div>
</div></body>
</html>
Here's the output using the XPath given above:
<div class="decode_navigation">
<p>These instructions are under the top-level.</p>
</div>
Just to clarify, the output should include all of the divs in the sample HTML, about 400 lines in total.
I've also tried the XPath suggestions I've been given below, but they produced the same results.
Edit: Here's my code:
use strict;
use warnings;
use feature 'say';
use XML::LibXML;
my $encoding_index_file = q(C:\path\to\testfile.html);
my $source_doc = XML::LibXML->load_html(
location => $encoding_index_file,
recover => 1,
suppress_errors => 1,
);
my ($node) = $source_doc->findnodes('//h2[a[#id="start"]]/following-sibling::*[not(preceding-sibling::div[#id="end"])]');
say $node->toString;
Not only does that XPath conform to XPath 1.0, it works correctly in XML::LibXML.
use strict;
use warnings qw( all );
use feature qw( say );
use XML::LibXML qw( );
my $doc = XML::LibXML->new->parse_html_string(<<'__EOS__');
<html>
<h2><a id="start">Foo</a></h2>
<div id="pre1"><img></div>
<div id="pre2"><img></div>
<div id="end"><img></div>
<div id="post1"><img></div>
<div id="post2"><img></div>
</html>
__EOS__
# Select all the siblings of the starting h2 element that follow
# it and don't have <div id="end"/> as a preceding sibling.
for my $node ($doc->findnodes('//h2[a[#id="start"]]/following-sibling::*[not(preceding-sibling::*[self::div[#id="end"]])]')) {
my $name = $node->nodeName;
my $id = $node->getAttribute('id');
say $id ? sprintf("%s#%s", $name, $id) : $name;
}
Output:
div#pre1
div#pre2
div#end
By the way,
//h2[a[#id="start"]]/following-sibling::*[not(preceding-sibling::*[self::div[#id="end"]])]
is a weird way of writing
//h2[a[#id="start"]]/following-sibling::*[not(preceding-sibling::div[#id="end"])]
Maybe you wanted
//h2[a[#id="start"]]/following-sibling::*[not(self::div[#id="end"] or preceding-sibling::div[#id="end"])]
That would produce the following output:
div#pre1
div#pre2
I managed to get to the bottom of what was causing the problem: Every sibling found by the XPath is handled by LibXML as a separate node, so I needed to assign them to an array, not a simple scalar as I was doing. The not-weird XPath suggested by ikegami was also better than the one I was using, as mine was doubling up everything in the output.
Here's the code that produces the correct results:
use strict;
use warnings;
use feature 'say';
use XML::LibXML qw( );
my $encoding_index_file = q(C:\path\to\testfile.html);
my $source_doc = XML::LibXML->load_html(
location => $encoding_index_file,
recover => 1,
suppress_errors => 1,
);
my $contents = "";
my #nodes = $source_doc->findnodes('//h2[a[#id="start"]]/following-sibling::[not(preceding-sibling::div[#id="end"])]');
foreach my $node (#nodes) {
my ($str) = $node->toString;
$contents = $contents . $str;
}
print $contents;

Stack Email for Gmail on mobile

My media queries are not being recognized by Gmail for mobile.
Does anybody how can this be fixed? I'd like my cells to stack, it all works fine on Mail iOS, Outlook iOS, but not Gmail ...
Thanks for your advice!
Gmail doesn't support media queries (or the <style> tag), so in order to have table cells stack on narrow widths you have to code a hybrid email.
These patterns by Fabio Carniero demonstrate this principle in action. I would strongly recommend looking at these scaffolds, as they achieve column stacking in mobile Gmail as well as other email clients that don't support media queries.
Here is an example of a 2-column layout that stacks without using media queries (adapted from Fabio's files):
<!-- // 2-COLUMN SCAFFOLD [CENTERING, FLUID] -->
<tr>
<td align="center" height="100%" valign="top" width="100%">
<!--[if mso]>
<table align="center" border="0" cellspacing="0" cellpadding="0" width="660">
<tr>
<td align="center" valign="top" width="660">
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width:660px;">
<tr>
<td align="center" valign="top" style="font-size:0;">
<!--[if mso]>
<table align="center" border="0" cellspacing="0" cellpadding="0" width="660">
<tr>
<td align="left" valign="top" width="330">
<![endif]-->
<div style="display:inline-block; max-width:50%; min-width:240px; vertical-align:top; width:100%;">
<table align="left" border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width:330px;">
<tr>
<td align="center" valign="top">
LEFT
</td>
</tr>
</table>
</div>
<!--[if mso]>
</td>
<td align="left" valign="top" width="330">
<![endif]-->
<div style="display:inline-block; max-width:50%; min-width:240px; vertical-align:top; width:100%;">
<table align="left" border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width:330px;">
<tr>
<td align="center" valign="top">
RIGHT
</td>
</tr>
</table>
</div>
<!--[if mso]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
<!--[if mso]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<!-- 2-COLUMN SCAFFOLD [CENTERING, FLUID] // -->

Outlook email template completely broken

This is the code that is broken in outlook 2013 and 2010 works fine in 2003 and everything else. I am wondering what might be causing the issue. The page is just white and I cant find any of the email template in litmus. If anyone could help that would be great.
<!-- Wrapper 2 (Header) -->
<table width="100%" border="0" cellpadding="0" cellspacing="0" align="center">
<tr>
<td width="100%" valign="top" bgcolor="#ffffff">
<!-- 1px Height Border -->
<table class="fullWidth" width="740" border="0" cellpadding="0" cellspacing="0" align="center">
<tr>
<td width="100%" height="1" bgcolor="#dedede"></td>
</tr>
</table>
<!-- Mobile Wrapper -->
<table width="100%" height="300" class="fullWidth" border="0" cellpadding="0" cellspacing="0" align="center">
<tr>
<td width="100%" bgcolor="f6f6f6" background="beachBg.png" style="background-size: 100%; background-position-y: -100px;">
<a href="http://www.something.com">
<div>
<!--[if gte mso 9]>
<v:rect xmlns:v="urn:schemas-microsoft-com:vml" fill="true" stroke="false" style="width:740px;height:300px;">
<v:fill type="tile" src="beachBg.png" color="#000000" />
<v:textbox inset="0,0,0,0">
<![endif]-->
<table table width="100%" border="0" cellpadding="0" cellspacing="0" align="center" class="scaleForMobile" height="300">
<tr align="right" class="socialNav">
<td width="100%">
<table width="35" border="0" cellpadding="0" cellspacing="0" align="right" class="clearing">
<tbody><tr>
<td width="375" valign="top">
<img alt="rss" src="rss.png"/>
</td>
</tr>
</tbody></table>
<table width="35" border="0" cellpadding="0" cellspacing="0" align="right" class="clearing">
<tbody><tr>
<td width="375" valign="top">
<img alt="vimeo" src="vimeo.png"/>
</td>
</tr>
</tbody></table>
<table width="35" border="0" cellpadding="0" cellspacing="0" align="right" class="clearing">
<tbody><tr>
<td width="50" valign="top">
<img alt="instagram" src="instagram.png"/>
</td>
</tr>
</tbody></table>
<table width="35" border="0" cellpadding="0" cellspacing="0" align="right" class="clearing">
<tbody><tr>
<td width="375" valign="top">
<img alt="tumblr" src="tumblr.png"/>
</td>
</tr>
</tbody></table>
<table width="35" border="0" cellpadding="0" cellspacing="0" align="right" class="clearing">
<tbody><tr>
<td width="375" valign="top">
<img alt="youtube" src="youtube.png"/>
</td>
</tr>
</tbody></table>
<table width="35" border="0" cellpadding="0" cellspacing="0" align="right" class="clearing">
<tbody><tr>
<td width="375" valign="top">
<img alt="facebook" src="facebook.png"/>
</td>
</tr>
</tbody></table>
<table width="35" border="0" cellpadding="0" cellspacing="0" align="right" class="clearing">
<tbody><tr>
<td width="375" valign="top">
<img alt="linkedin" src="linkedin.png"/>
</td>
</tr>
</tbody></table>
</tr>
<tr class="beachLogo">
<td style="width:740;" ><img style="margin-left:80px;" src="beachLogo.png"></td>
<td width="400"></td>
</tr>
</table>
<div>
</div>
</div>
</td>
</tr>
</table><!-- End Header -->
</td>
</tr>
</table><!-- End Mobile Wrapper -->
<!-- Space -->
<table bgcolor="ffffff" width="740" border="0" cellpadding="0" cellspacing="0" align="center" class="mobileCenter">
<tr>
<td width="740" height="0">
</td>
</tr>
</table>
</td>
</tr>
</table><!-- End Wrapper 2 -->
A couple of syntax issues I'm seeing.
<a href="http://www.something.com"> is missing a closing tag.
You probably shouldn't be wrapping everything in just 1 <a> tag like that.
The </tr> before <tr class="beachLogo"> is missing a </td>
Fix those issues and see if you get better results in Outlook.

jtemplate giving ; expected below is my code

My Code is:
<table border="1" rules="all" cellpadding="0" width="100%" cellspacing="1" id="table1" style="text-align:center">
<thead>
{var tmpchannelid = '0'}
{#foreach $T as ChannelRoomBind}
{#if $T.ChannelRoomBind.channelid neq ${tmpchannelid}}
<tr class="midhead2_calen">
<td>{$T.ChannelRoomBind.ChannelName }</td>
</tr>
{#/if}
{ tmpchannelid = {$T.ChannelRoomBind.channelId}}
{#/for}
</thead>
<tbody>
<tr>
</tr>
</tbody>
</table>