By: Skrol29
Date: 2012-02-17
Time: 00:08
|
delete colmuns in a Ms Word document
Hello,
Here is a TBS plug-in that enhances OpenTBS and enables you to delete some columns in a table of an Ms Word documents.
tbs_plugin_delcol.php
<?php
/*
This TBS plug-ins enables you to delete the columns you want in any table of an Ms Word Document.
It is supposed to be used with OpenTBS.
Version 1.00
Skrol29, 2011-10-07
Installation:
--------------
$TBS = new clsTinyButStrong;
$TBS->Plugin(TBS_INSTALL, OPENTBS_PLUGIN);
$TBS->Plugin(TBS_INSTALL, DELCOL_PLUGIN);
Use:
----
You have to put a TBS field anywhere inside the table with the following parameters:
The field will be erased and the specified columns will be deleted.
* ope=delcol
* colnum = the column numbers to delete, separated with commas (first colmun is number 1).
* colshift = (optional) if parameter "colnum" has only on value then "colshift" extends the number of columns to delete to the left of to the rigth.
Both parameters "colnum" and "colshift" can contain [val] and [var] fields.
Examples:
---------
[onload;ope=delcol;colnum=2,4,6] => will delete columns {2,5,6}
[onload;ope=delcol;colnum=2;colshift=2] => will delete columns {2,3,4}
[onload;ope=delcol;colnum=2;colshift=-1] => will delete columns {1,2}
[onload.col_to_delete;ope=delcol;colnum=[val];colshift=2] => will delete 3 colmuns staring to column number $col_to_delete
*/
define('DELCOL_PLUGIN','clsTbsDeleteColumn');
class clsTbsDeleteColumn {
function OnInstall() {
$this->Version = '1.00'; // Versions of installed plug-ins can be displayed using [var..tbs_info] since TBS 3.2.0
return array('OnOperation');
}
function replaceTbsFields($Prm, $Value) {
$this->TBS->meth_Merge_AutoVar($Prm, true);
$Prm = str_replace($this->TBS->_ChrVal, $Value, $Prm);
return $Prm;
}
function OnOperation($FieldName,&$Value,&$PrmLst,&$Txt,$PosBeg,$PosEnd,&$Loc) {
if ($PrmLst['ope']!='delcol') return; // activated only if delcol parameter is used
if (!isset($PrmLst['colnum'])) return;
// List of columns converted into an array
if (is_array($Value)) $Value = implode(',', $Value);
$col_lst = $this->replaceTbsFields($PrmLst['colnum'], $Value);
$col_lst = str_replace(' ', '', $col_lst);
if ( ($col_lst=='') || ($col_lst=='0') ) return false; // nothing to do
$col_lst = explode(',', $col_lst);
$col_nbr = count($col_lst);
for ($c=0; $c<$col_nbr; $c++) $col_lst[$c] = intval($col_lst[$c]); // Conversion into numeric
// Add column by shifting
if (isset($PrmLst['colshift'])) {
$col_shift = intval($this->replaceTbsFields($PrmLst['colshift'], $Value));
if ($col_shift<>0) {
$step = ($col_shift>0) ? -1 : +1;
for ($s = $col_shift; $s<>0; $s = $s + $step) {
for ($c=0; $c<$col_nbr; $c++) $col_lst[] = $col_lst[$c] + $s;
}
}
}
// Delete the TBS field
$Txt = substr_replace($Txt, '', $PosBeg, $PosEnd - $PosBeg + 1);
// Look for the source of the table
$Loc = clsTbsXmlLoc::findElement($Txt, 'w:tbl', $PosBeg, false);
if ($Loc===false) return false;
$Src = $Loc->GetTxt();
$this->deleteElements($Src, 'w:tblGrid', 'w:gridCol', $col_lst);
$this->deleteElements($Src, 'w:tr', 'w:tc', $col_lst);
$Loc->ReplaceTxt($Src);
return false; // avoid the mergin of the field
}
function deleteElements(&$Txt, $ParentTag, $Tag, $ColLst) {
$ColLst = array_unique($ColLst, SORT_NUMERIC); // delete double columns
sort($ColLst, SORT_NUMERIC); // sort
$ColMax = $ColLst[(count($ColLst)-1)]; // last column to delete
$ParentPos = 0;
$TotalDelNbr = 0;
while ($ParentLoc = clsTbsXmlLoc::findElement($Txt, $ParentTag, $ParentPos, true)) {
$ParentTxt = $ParentLoc->GetTxt();
$ColNum = 0;
$ColPos = 0;
$Continue = true;
$DelNbr = 0;
while ($Continue && ($ColLoc = clsTbsXmlLoc::findElement($ParentTxt, $Tag, $ColPos, true)) ) {
$ColNum++;
if ($ColNum>$ColMax) {
// stop the search
$Continue = false;
} elseif (array_search($ColNum,$ColLst)===false) {
// ne deletation
$ColPos = $ColLoc->PosEnd + 1;
} else {
// deleteation
$DelNbr++;
$ColLoc->ReplaceTxt('');
}
}
if ($DelNbr>0) $ParentLoc->ReplaceTxt($ParentTxt);
$TotalDelNbr = $TotalDelNbr + $DelNbr;
$ParentPos = $ParentLoc->PosEnd + 1;
}
return $TotalDelNbr;
}
}
/* An instance of clsTbsXmlLoc representes a location of an XML element (<tag>...</tag>) in a TXT contents.
Attributes are no
*/
class clsTbsXmlLoc {
var $PosBeg;
var $PosEnd;
var $SelfClosing;
var $Txt;
// crate an instance with the given parameters
function __construct(&$Txt, $PosBeg, $PosEnd, $SelfClosing = false) {
$this->Txt = &$Txt;
$this->PosBeg = $PosBeg;
$this->PosEnd = $PosEnd;
$this->SelfClosing = $SelfClosing;
}
// return the len of the locator
function GetLen() {
return $this->PosEnd - $this->PosBeg + 1;
}
// return the source of the locator
function GetTxt() {
return substr($this->Txt, $this->PosBeg, $this->GetLen() );
}
// replace the source of the locator in the TXT contents
// update the locator's positions
function ReplaceTxt($new) {
$len = $this->GetLen(); // avoid PHP error : Strict Standards: Only variables should be passed by reference
$this->Txt = substr_replace($this->Txt, $new, $this->PosBeg, $len);
$this->PosEnd = $this->PosEnd + strlen($new) - $len;
}
// search an element in the TXT contents, and return an object if it is found
static function findElement(&$Txt, $Tag, $PosBeg, $Forward) {
$PosBeg = clsTinyButStrong::f_Xml_FindTagStart($Txt, $Tag, true , $PosBeg, $Forward, true);
if ($PosBeg===false) return false;
$PosEnd = strpos($Txt, '>', $PosBeg);
if ($PosEnd===false) return false;
$SelfClosing = (substr($Txt, $PosEnd-1, 1)=='/');
if (!$SelfClosing) {
$PosEnd = clsTinyButStrong::f_Xml_FindTagStart($Txt, $Tag, false, $PosEnd, true , true);
if ($PosEnd===false) return false;
$PosEnd = strpos($Txt, '>', $PosEnd);
if ($PosEnd===false) return false;
}
$XmlLoc = new clsTbsXmlLoc($Txt, $PosBeg, $PosEnd, $SelfClosing);
return $XmlLoc;
}
}
|
|