{"action":"opened","number":233,"pull_request":{"url":"https://api.github.com/repos/openwebwork/pg/pulls/233","id":41828270,"html_url":"https://github.com/openwebwork/pg/pull/233","diff_url":"https://github.com/openwebwork/pg/pull/233.diff","patch_url":"https://github.com/openwebwork/pg/pull/233.patch","issue_url":"https://api.github.com/repos/openwebwork/pg/issues/233","number":233,"state":"open","locked":false,"title":"colspan for table cells; cell-specific halign","user":{"login":"Alex-Jordan","id":4732672,"avatar_url":"https://avatars.githubusercontent.com/u/4732672?v=3","gravatar_id":"","url":"https://api.github.com/users/Alex-Jordan","html_url":"https://github.com/Alex-Jordan","followers_url":"https://api.github.com/users/Alex-Jordan/followers","following_url":"https://api.github.com/users/Alex-Jordan/following{/other_user}","gists_url":"https://api.github.com/users/Alex-Jordan/gists{/gist_id}","starred_url":"https://api.github.com/users/Alex-Jordan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Alex-Jordan/subscriptions","organizations_url":"https://api.github.com/users/Alex-Jordan/orgs","repos_url":"https://api.github.com/users/Alex-Jordan/repos","events_url":"https://api.github.com/users/Alex-Jordan/events{/privacy}","received_events_url":"https://api.github.com/users/Alex-Jordan/received_events","type":"User","site_admin":false},"body":"Added `colspan =>` option for a cell. This necessitated also adding `halign =>` option for a cell. `halign` is perhaps not the best name, but is consistent with the already existing `align =>`. Both `halign =>` and `align =>` take strings that can be used in `\\begin{tabular}{<here>}` and `\\multicolumn{}{<here>}{}`. These strings can have pipes, `>{commands}` for formatting contents, and of course `r`, `c`, `l`, `p{width}`, and `X`. The strings are used directly in TeX output. Whatever information can be extracted from them is converted to some CSS styling for HTML output. This introduces a lot of flexibility with cell-specific formatting that formerly was only available in HTML, not TeX.\r\n\r\nCaught and fixed one small bug during testing where in TeX output, a cell that an author had marked as `TD` would nevertheless be formatted as `TH` if the whole row had been marked as a header row.\r\n\r\nAlso added some commentary. And moved a code block that gets used twice into a separate subroutine.\r\n\r\nTest with below. This is the same .pg file I've used for testing before, but now two more DataTables are there to see `colspan` and `halign` for a cell.\r\n\r\n```\r\nDOCUMENT();      \r\n\r\nloadMacros(\r\n   \"PGstandard.pl\",\r\n   \"MathObjects.pl\",     \r\n   \"niceTables.pl\",\r\n);\r\n\r\n#########################################\r\n\r\nTEXT(beginproblem());\r\n\r\n$f = Formula(\"x^2\");\r\n\r\n#########################################\r\n\r\nContext()->texStrings;\r\nBEGIN_TEXT\r\n\r\nAn example with math objects and answer blanks.\r\n$PAR\r\n\r\nFill in the table of values for \\(f\\) where \\(f(x) = $f\\).\r\n\r\n\\{DataTable([\r\n[\"\\(x\\)\", \"\\(0\\)\", \"\\(1\\)\", \"\\(2\\)\"],\r\n[\"\\(f(x)\\)\", ans_rule(5), ans_rule(5), ans_rule(5)],\r\n],\r\nalign=>'cccc',\r\nmidrules=>1,\r\nrowheaders=>1,\r\ncaption=>\"\\(f(x)=$f\\)\",\r\nallcellcss=>'padding:6pt; ',\r\n)\\}\r\n\r\nEND_TEXT\r\nContext()->normalStrings;\r\n\r\nfor my $i (0..2)\r\n{ANS($f->eval(x=>$i)->cmp);};\r\n\r\n\r\nBEGIN_TEXT\r\nNo frills.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\n);\r\n\\}\r\n\r\nNot centered.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncenter=>0,\r\n);\r\n\\}\r\n\r\nHas a caption.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\n);\r\n\\}\r\n\r\nMidrules.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\n);\r\n\\}\r\n\r\nLeft-aligned.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\nalign=>'lll',\r\n);\r\n\\}\r\n\r\nLeft-center-right aligned.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\nalign=>'lcr',\r\n);\r\n\\}\r\n\r\nFixed-width paragraph.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['I ','Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the Government for a redress of grievances.'],\r\n['II','A well regulated Militia, being necessary to the security of a free State, the right of the people to keep and bear Arms, shall not be infringed.'],\r\n], \r\ncaption=>'Bill of Rights',\r\nmidrules=>1,\r\nalign=>'lp{2in}',\r\n);\r\n\\}\r\n\r\nExpandable-width paragraph.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['I ','Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the Government for a redress of grievances.'],\r\n['II','A well regulated Militia, being necessary to the security of a free State, the right of the people to keep and bear Arms, shall not be infringed.'],\r\n], \r\ncaption=>'Bill of Rights',\r\nmidrules=>1,\r\nalign=>'lX',\r\n);\r\n\\}\r\n\r\nVertical bars.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\nalign=>'|l|c|r|',\r\n);\r\n\\}\r\n\r\nText styles by column.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\nalign=>'|  >{\\bfseries} l |  >{\\itshape} c  | >{\\ttfamily} r  |  ',\r\n);\r\n\\}\r\n\r\n...with fore color.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\nalign=>'|  >{\\bfseries \\color[HTML]{FF0000}} l |  >{\\itshape} c  | >{\\ttfamily\\color{pink}} r  |  ',\r\n);\r\n\\}\r\n\r\n...and background color.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\nalign=>'|  >{\\bfseries \\color[HTML]{FF0000}\\columncolor{green}} l |  >{\\columncolor[HTML]{33FF00}\\itshape} c  | >{\\ttfamily\\color{pink}} r  |  ',\r\n);\r\n\\}\r\n\r\nPut everything in math mode.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nencase=>['\\(','\\)'],\r\n);\r\n\\}\r\n\r\n...with exceptions.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries',['ice cream',noencase=>1]],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nencase=>['\\(','\\)'],\r\n);\r\n\\}\r\n\r\nCSS applied to whole table.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\ntablecss=>'border:solid 1px; ',\r\n);\r\n\\}\r\n\r\nCSS applied to caption.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\ncaptioncss=>'text-decoration:line-through; ',\r\n);\r\n\\}\r\n\r\nCSS applied by column.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\ncolumnscss=>['text-decoration:line-through; ','','text-decoration:overline; '],\r\n);\r\n\\}\r\n\r\nA header row.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n[['apple ',headerrow=>1],'banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\n);\r\n\\}\r\n\r\nCSS header styling.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n[['apple ',headerrow=>1],'banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nheadercss => 'color:blue; ',\r\n);\r\n\\}\r\n\r\nCSS non-header styling.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n[['apple ',headerrow=>1],'banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\ndatacss => 'color:blue; ',\r\n);\r\n\\}\r\n\r\nCSS for every cell.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n[['apple ',headerrow=>1],'banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nallcellcss => 'font-family:fantasy; ',\r\n);\r\n\\}\r\n\r\nRow headers.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava', ,'huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nrowheaders=>1,\r\n);\r\n\\}\r\n\r\nRow and column headers with a table header\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n[['apple',headerrow=>1,header=>'TH'],'banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava', ,'huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nrowheaders=>1,\r\n);\r\n\\}\r\n\r\nRow and column headers with no vertex header\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n[['apple',headerrow=>1,header=>'TD'],'banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava', ,'huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nrowheaders=>1,\r\n);\r\n\\}\r\n\r\nIndividual cell manipulation.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n[['apple', tex=>'\\cellcolor[HTML]{FF0000}'],'banana ','cherry'],\r\n['durian', ['elderberrries',tex=>'\\color{green}'],['fig',m=>1]],\r\n[['guava', b=>1],'huckleberries','ice cream'],\r\n[['jackfruit', texencase=>['\\emph{','}']],'kiwi',['lemon',cellcss=>'font-family:cursive; ']]], \r\ncaption=>'Fruit',\r\n);\r\n\\}\r\n\r\nRow alteration.\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n[['apple', rowcolor=>'{yellow}'],'banana ','cherry'],\r\n[['durian', rowcss=>'font-family:cursive; ',midrule=>1],'elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n[['jackfruit', header=>'row'],'kiwi','lemon']], \r\ncaption=>'Fruit',\r\n);\r\n\\}\r\n\r\nAlignment (and styling via tex alignment string) of a single cell\r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n['apple','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava', 'huckleberries','ice cream'],\r\n['jackfruit', ['kiwi', halign => '|>{\\cellcolor{green}\\bfseries}l'],'lemon']], \r\ncaption=>'Fruit',\r\n);\r\n\\}\r\n\r\nColspan \r\n$PAR\r\n\r\n\\{\r\nDataTable([\r\n[['applebananacherry',colspan=>\"3\", header=>\"TH\"]],\r\n['durian','elderberrries','fig'],\r\n['guava', ['huckleberries', colspan=>\"2\", halign=>'>{\\color{blue}}r']],\r\n['jackfruit', 'kiwi','lemon']], \r\ncaption=>'Fruit',\r\n);\r\n\\}\r\n\r\n$HR\r\nLayout tables\r\n$PAR\r\n\r\nNo frills.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\n);\r\n\\}\r\n\r\nNot centered.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncenter=>0,\r\n);\r\n\\}\r\n\r\nMidrules.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\n);\r\n\\}\r\n\r\nLeft-aligned.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\nalign=>'lll',\r\n);\r\n\\}\r\n\r\nLeft-center-right aligned.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\nalign=>'lcr',\r\n);\r\n\\}\r\n\r\nFixed-width paragraph.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['I ','Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the Government for a redress of grievances.'],\r\n['II','A well regulated Militia, being necessary to the security of a free State, the right of the people to keep and bear Arms, shall not be infringed.'],\r\n], \r\ncaption=>'Bill of Rights',\r\nmidrules=>1,\r\nalign=>'lp{2in}',\r\n);\r\n\\}\r\n\r\nExpandable-width paragraph.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['I ','Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the Government for a redress of grievances.'],\r\n['II','A well regulated Militia, being necessary to the security of a free State, the right of the people to keep and bear Arms, shall not be infringed.'],\r\n], \r\ncaption=>'Bill of Rights',\r\nmidrules=>1,\r\nalign=>'lX',\r\n);\r\n\\}\r\n\r\nVertical bars.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\nalign=>'|l|c|r|',\r\n);\r\n\\}\r\n\r\nText styles by column.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\nalign=>'|  >{\\bfseries} l |  >{\\itshape} c  | >{\\ttfamily} r  |  ',\r\n);\r\n\\}\r\n\r\n...with fore color.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\nalign=>'|  >{\\bfseries \\color[HTML]{FF0000}} l |  >{\\itshape} c  | >{\\ttfamily\\color{pink}} r  |  ',\r\n);\r\n\\}\r\n\r\n...and background color.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nmidrules=>1,\r\nalign=>'|  >{\\bfseries \\color[HTML]{FF0000}\\columncolor{green}} l |  >{\\columncolor[HTML]{33FF00}\\itshape} c  | >{\\ttfamily\\color{pink}} r  |  ',\r\n);\r\n\\}\r\n\r\nPut everything in math mode.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nencase=>['\\(','\\)'],\r\n);\r\n\\}\r\n\r\n...with exceptions.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries',['ice cream',noencase=>1]],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nencase=>['\\(','\\)'],\r\n);\r\n\\}\r\n\r\nCSS applied to whole table.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\ntablecss=>'border:solid 1px; ',\r\n);\r\n\\}\r\n\r\nCSS applied by column.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n['apple ','banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\ncolumnscss=>['text-decoration:line-through; ','','text-decoration:overline; '],\r\n);\r\n\\}\r\n\r\nCSS for every cell.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n[['apple ',headerrow=>1],'banana ','cherry'],\r\n['durian','elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n['jackfruit','kiwi','lemon']], \r\ncaption=>'Fruit',\r\nallcellcss => 'font-family:fantasy; ',\r\n);\r\n\\}\r\n\r\nIndividual cell manipulation.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n[['apple', tex=>'\\cellcolor[HTML]{FF0000}'],'banana ','cherry'],\r\n['durian', ['elderberrries',tex=>'\\color{green}'],['fig',m=>1]],\r\n[['guava', b=>1],'huckleberries','ice cream'],\r\n[['jackfruit', texencase=>['\\emph{','}']],'kiwi',['lemon',cellcss=>'font-family:cursive; ']]], \r\ncaption=>'Fruit',\r\n);\r\n\\}\r\n\r\nRow alteration.\r\n$PAR\r\n\r\n\\{\r\nLayoutTable([\r\n[['apple', rowcolor=>'{yellow}'],'banana ','cherry'],\r\n[['durian', rowcss=>'font-family:cursive; ',midrule=>1],'elderberrries','fig'],\r\n['guava','huckleberries','ice cream'],\r\n[['jackfruit', header=>'row'],'kiwi','lemon']], \r\ncaption=>'Fruit',\r\n);\r\n\\}\r\n\r\nEND_TEXT\r\n\r\n\r\n\r\nENDDOCUMENT();        \r\n\r\n```","created_at":"2015-08-06T20:01:00Z","updated_at":"2015-08-06T20:01:00Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/openwebwork/pg/pulls/233/commits","review_comments_url":"https://api.github.com/repos/openwebwork/pg/pulls/233/comments","review_comment_url":"https://api.github.com/repos/openwebwork/pg/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openwebwork/pg/issues/233/comments","statuses_url":"https://api.github.com/repos/openwebwork/pg/statuses/bd2eed49ffd76c2ac7c0de5d55d94df5e4066b1f","head":{"label":"Alex-Jordan:colspanNiceTables","ref":"colspanNiceTables","sha":"bd2eed49ffd76c2ac7c0de5d55d94df5e4066b1f","user":{"login":"Alex-Jordan","id":4732672,"avatar_url":"https://avatars.githubusercontent.com/u/4732672?v=3","gravatar_id":"","url":"https://api.github.com/users/Alex-Jordan","html_url":"https://github.com/Alex-Jordan","followers_url":"https://api.github.com/users/Alex-Jordan/followers","following_url":"https://api.github.com/users/Alex-Jordan/following{/other_user}","gists_url":"https://api.github.com/users/Alex-Jordan/gists{/gist_id}","starred_url":"https://api.github.com/users/Alex-Jordan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Alex-Jordan/subscriptions","organizations_url":"https://api.github.com/users/Alex-Jordan/orgs","repos_url":"https://api.github.com/users/Alex-Jordan/repos","events_url":"https://api.github.com/users/Alex-Jordan/events{/privacy}","received_events_url":"https://api.github.com/users/Alex-Jordan/received_events","type":"User","site_admin":false},"repo":{"id":17758070,"name":"pg","full_name":"Alex-Jordan/pg","owner":{"login":"Alex-Jordan","id":4732672,"avatar_url":"https://avatars.githubusercontent.com/u/4732672?v=3","gravatar_id":"","url":"https://api.github.com/users/Alex-Jordan","html_url":"https://github.com/Alex-Jordan","followers_url":"https://api.github.com/users/Alex-Jordan/followers","following_url":"https://api.github.com/users/Alex-Jordan/following{/other_user}","gists_url":"https://api.github.com/users/Alex-Jordan/gists{/gist_id}","starred_url":"https://api.github.com/users/Alex-Jordan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Alex-Jordan/subscriptions","organizations_url":"https://api.github.com/users/Alex-Jordan/orgs","repos_url":"https://api.github.com/users/Alex-Jordan/repos","events_url":"https://api.github.com/users/Alex-Jordan/events{/privacy}","received_events_url":"https://api.github.com/users/Alex-Jordan/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Alex-Jordan/pg","description":"Problem rendering engine for WeBWorK","fork":true,"url":"https://api.github.com/repos/Alex-Jordan/pg","forks_url":"https://api.github.com/repos/Alex-Jordan/pg/forks","keys_url":"https://api.github.com/repos/Alex-Jordan/pg/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Alex-Jordan/pg/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Alex-Jordan/pg/teams","hooks_url":"https://api.github.com/repos/Alex-Jordan/pg/hooks","issue_events_url":"https://api.github.com/repos/Alex-Jordan/pg/issues/events{/number}","events_url":"https://api.github.com/repos/Alex-Jordan/pg/events","assignees_url":"https://api.github.com/repos/Alex-Jordan/pg/assignees{/user}","branches_url":"https://api.github.com/repos/Alex-Jordan/pg/branches{/branch}","tags_url":"https://api.github.com/repos/Alex-Jordan/pg/tags","blobs_url":"https://api.github.com/repos/Alex-Jordan/pg/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Alex-Jordan/pg/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Alex-Jordan/pg/git/refs{/sha}","trees_url":"https://api.github.com/repos/Alex-Jordan/pg/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Alex-Jordan/pg/statuses/{sha}","languages_url":"https://api.github.com/repos/Alex-Jordan/pg/languages","stargazers_url":"https://api.github.com/repos/Alex-Jordan/pg/stargazers","contributors_url":"https://api.github.com/repos/Alex-Jordan/pg/contributors","subscribers_url":"https://api.github.com/repos/Alex-Jordan/pg/subscribers","subscription_url":"https://api.github.com/repos/Alex-Jordan/pg/subscription","commits_url":"https://api.github.com/repos/Alex-Jordan/pg/commits{/sha}","git_commits_url":"https://api.github.com/repos/Alex-Jordan/pg/git/commits{/sha}","comments_url":"https://api.github.com/repos/Alex-Jordan/pg/comments{/number}","issue_comment_url":"https://api.github.com/repos/Alex-Jordan/pg/issues/comments{/number}","contents_url":"https://api.github.com/repos/Alex-Jordan/pg/contents/{+path}","compare_url":"https://api.github.com/repos/Alex-Jordan/pg/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Alex-Jordan/pg/merges","archive_url":"https://api.github.com/repos/Alex-Jordan/pg/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Alex-Jordan/pg/downloads","issues_url":"https://api.github.com/repos/Alex-Jordan/pg/issues{/number}","pulls_url":"https://api.github.com/repos/Alex-Jordan/pg/pulls{/number}","milestones_url":"https://api.github.com/repos/Alex-Jordan/pg/milestones{/number}","notifications_url":"https://api.github.com/repos/Alex-Jordan/pg/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Alex-Jordan/pg/labels{/name}","releases_url":"https://api.github.com/repos/Alex-Jordan/pg/releases{/id}","created_at":"2014-03-14T19:45:45Z","updated_at":"2014-09-04T05:17:14Z","pushed_at":"2015-08-06T19:49:06Z","git_url":"git://github.com/Alex-Jordan/pg.git","ssh_url":"git@github.com:Alex-Jordan/pg.git","clone_url":"https://github.com/Alex-Jordan/pg.git","svn_url":"https://github.com/Alex-Jordan/pg","homepage":"http://webwork.maa.org/wiki/Category:Authors","size":5774,"stargazers_count":0,"watchers_count":0,"language":"Perl","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"openwebwork:develop","ref":"develop","sha":"679bd0bb201bc30b7ee2a25e54811eaf4e292cac","user":{"login":"openwebwork","id":1289488,"avatar_url":"https://avatars.githubusercontent.com/u/1289488?v=3","gravatar_id":"","url":"https://api.github.com/users/openwebwork","html_url":"https://github.com/openwebwork","followers_url":"https://api.github.com/users/openwebwork/followers","following_url":"https://api.github.com/users/openwebwork/following{/other_user}","gists_url":"https://api.github.com/users/openwebwork/gists{/gist_id}","starred_url":"https://api.github.com/users/openwebwork/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openwebwork/subscriptions","organizations_url":"https://api.github.com/users/openwebwork/orgs","repos_url":"https://api.github.com/users/openwebwork/repos","events_url":"https://api.github.com/users/openwebwork/events{/privacy}","received_events_url":"https://api.github.com/users/openwebwork/received_events","type":"Organization","site_admin":false},"repo":{"id":3064601,"name":"pg","full_name":"openwebwork/pg","owner":{"login":"openwebwork","id":1289488,"avatar_url":"https://avatars.githubusercontent.com/u/1289488?v=3","gravatar_id":"","url":"https://api.github.com/users/openwebwork","html_url":"https://github.com/openwebwork","followers_url":"https://api.github.com/users/openwebwork/followers","following_url":"https://api.github.com/users/openwebwork/following{/other_user}","gists_url":"https://api.github.com/users/openwebwork/gists{/gist_id}","starred_url":"https://api.github.com/users/openwebwork/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openwebwork/subscriptions","organizations_url":"https://api.github.com/users/openwebwork/orgs","repos_url":"https://api.github.com/users/openwebwork/repos","events_url":"https://api.github.com/users/openwebwork/events{/privacy}","received_events_url":"https://api.github.com/users/openwebwork/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/openwebwork/pg","description":"Problem rendering engine for WeBWorK","fork":false,"url":"https://api.github.com/repos/openwebwork/pg","forks_url":"https://api.github.com/repos/openwebwork/pg/forks","keys_url":"https://api.github.com/repos/openwebwork/pg/keys{/key_id}","collaborators_url":"https://api.github.com/repos/openwebwork/pg/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/openwebwork/pg/teams","hooks_url":"https://api.github.com/repos/openwebwork/pg/hooks","issue_events_url":"https://api.github.com/repos/openwebwork/pg/issues/events{/number}","events_url":"https://api.github.com/repos/openwebwork/pg/events","assignees_url":"https://api.github.com/repos/openwebwork/pg/assignees{/user}","branches_url":"https://api.github.com/repos/openwebwork/pg/branches{/branch}","tags_url":"https://api.github.com/repos/openwebwork/pg/tags","blobs_url":"https://api.github.com/repos/openwebwork/pg/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/openwebwork/pg/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/openwebwork/pg/git/refs{/sha}","trees_url":"https://api.github.com/repos/openwebwork/pg/git/trees{/sha}","statuses_url":"https://api.github.com/repos/openwebwork/pg/statuses/{sha}","languages_url":"https://api.github.com/repos/openwebwork/pg/languages","stargazers_url":"https://api.github.com/repos/openwebwork/pg/stargazers","contributors_url":"https://api.github.com/repos/openwebwork/pg/contributors","subscribers_url":"https://api.github.com/repos/openwebwork/pg/subscribers","subscription_url":"https://api.github.com/repos/openwebwork/pg/subscription","commits_url":"https://api.github.com/repos/openwebwork/pg/commits{/sha}","git_commits_url":"https://api.github.com/repos/openwebwork/pg/git/commits{/sha}","comments_url":"https://api.github.com/repos/openwebwork/pg/comments{/number}","issue_comment_url":"https://api.github.com/repos/openwebwork/pg/issues/comments{/number}","contents_url":"https://api.github.com/repos/openwebwork/pg/contents/{+path}","compare_url":"https://api.github.com/repos/openwebwork/pg/compare/{base}...{head}","merges_url":"https://api.github.com/repos/openwebwork/pg/merges","archive_url":"https://api.github.com/repos/openwebwork/pg/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/openwebwork/pg/downloads","issues_url":"https://api.github.com/repos/openwebwork/pg/issues{/number}","pulls_url":"https://api.github.com/repos/openwebwork/pg/pulls{/number}","milestones_url":"https://api.github.com/repos/openwebwork/pg/milestones{/number}","notifications_url":"https://api.github.com/repos/openwebwork/pg/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/openwebwork/pg/labels{/name}","releases_url":"https://api.github.com/repos/openwebwork/pg/releases{/id}","created_at":"2011-12-28T19:29:38Z","updated_at":"2015-04-17T12:55:57Z","pushed_at":"2015-08-06T20:01:00Z","git_url":"git://github.com/openwebwork/pg.git","ssh_url":"git@github.com:openwebwork/pg.git","clone_url":"https://github.com/openwebwork/pg.git","svn_url":"https://github.com/openwebwork/pg","homepage":"http://webwork.maa.org/wiki/Category:Authors","size":6967,"stargazers_count":20,"watchers_count":20,"language":"Perl","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":42,"mirror_url":null,"open_issues_count":5,"forks":42,"open_issues":5,"watchers":20,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openwebwork/pg/pulls/233"},"html":{"href":"https://github.com/openwebwork/pg/pull/233"},"issue":{"href":"https://api.github.com/repos/openwebwork/pg/issues/233"},"comments":{"href":"https://api.github.com/repos/openwebwork/pg/issues/233/comments"},"review_comments":{"href":"https://api.github.com/repos/openwebwork/pg/pulls/233/comments"},"review_comment":{"href":"https://api.github.com/repos/openwebwork/pg/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openwebwork/pg/pulls/233/commits"},"statuses":{"href":"https://api.github.com/repos/openwebwork/pg/statuses/bd2eed49ffd76c2ac7c0de5d55d94df5e4066b1f"}},"merged":false,"mergeable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"commits":1,"additions":157,"deletions":34,"changed_files":1}}