commit 75f0a3d9b843170de528023f52b4ca391831ccf2 Author: Florian Overkamp Date: Sat Sep 1 14:34:41 2012 +0200 initial move to git (subversion history dropped intentionally) diff --git a/CHANGELOG.txt b/CHANGELOG.txt new file mode 100644 index 0000000..a281d08 --- /dev/null +++ b/CHANGELOG.txt @@ -0,0 +1,17 @@ +TRUNK +----- + +SAFE 0.3 +-------- +* Change amount to float datatype (allow for billing of partial amounts, i.e. hours) + +SAFE 0.2 +-------- +* Bugfix to avoid multiple companies in one invoice (important!) +* Clean up column names in listings +* Adjust sorting options + +SAFE 0.1 +-------- +* Initial release + diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..ca268b2 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,74 @@ +Artistic License 2.0 + +Copyright (c) 2000-2006, The Perl Foundation. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +Preamble + +This license establishes the terms under which a given free software Package may be copied, modified, distributed, and/or redistributed. The intent is that the Copyright Holder maintains some artistic control over the development of that Package while still keeping the Package available as open source and free software. + +You are always permitted to make arrangements wholly outside of this license directly with the Copyright Holder of a given Package. If the terms of this license do not permit the full use that you propose to make of the Package, you should contact the Copyright Holder and seek a different licensing arrangement. +Definitions + +"Copyright Holder" means the individual(s) or organization(s) named in the copyright notice for the entire Package. + +"Contributor" means any party that has contributed code or other material to the Package, in accordance with the Copyright Holder's procedures. + +"You" and "your" means any person who would like to copy, distribute, or modify the Package. + +"Package" means the collection of files distributed by the Copyright Holder, and derivatives of that collection and/or of those files. A given Package may consist of either the Standard Version, or a Modified Version. + +"Distribute" means providing a copy of the Package or making it accessible to anyone else, or in the case of a company or organization, to others outside of your company or organization. + +"Distributor Fee" means any fee that you charge for Distributing this Package or providing support for this Package to another party. It does not mean licensing fees. + +"Standard Version" refers to the Package if it has not been modified, or has been modified only in ways explicitly requested by the Copyright Holder. + +"Modified Version" means the Package, if it has been changed, and such changes were not explicitly requested by the Copyright Holder. + +"Original License" means this Artistic License as Distributed with the Standard Version of the Package, in its current version or as it may be modified by The Perl Foundation in the future. + +"Source" form means the source code, documentation source, and configuration files for the Package. + +"Compiled" form means the compiled bytecode, object code, binary, or any other form resulting from mechanical transformation or translation of the Source form. +Permission for Use and Modification Without Distribution + +(1) You are permitted to use the Standard Version and create and use Modified Versions for any purpose without restriction, provided that you do not Distribute the Modified Version. +Permissions for Redistribution of the Standard Version + +(2) You may Distribute verbatim copies of the Source form of the Standard Version of this Package in any medium without restriction, either gratis or for a Distributor Fee, provided that you duplicate all of the original copyright notices and associated disclaimers. At your discretion, such verbatim copies may or may not include a Compiled form of the Package. + +(3) You may apply any bug fixes, portability changes, and other modifications made available from the Copyright Holder. The resulting Package will still be considered the Standard Version, and as such will be subject to the Original License. +Distribution of Modified Versions of the Package as Source + +(4) You may Distribute your Modified Version as Source (either gratis or for a Distributor Fee, and with or without a Compiled form of the Modified Version) provided that you clearly document how it differs from the Standard Version, including, but not limited to, documenting any non-standard features, executables, or modules, and provided that you do at least ONE of the following: + +(a) make the Modified Version available to the Copyright Holder of the Standard Version, under the Original License, so that the Copyright Holder may include your modifications in the Standard Version. +(b) ensure that installation of your Modified Version does not prevent the user installing or running the Standard Version. In addition, the Modified Version must bear a name that is different from the name of the Standard Version. +(c) allow anyone who receives a copy of the Modified Version to make the Source form of the Modified Version available to others under +(i) the Original License or +(ii) a license that permits the licensee to freely copy, modify and redistribute the Modified Version using the same licensing terms that apply to the copy that the licensee received, and requires that the Source form of the Modified Version, and of any works derived from it, be made freely available in that license fees are prohibited but Distributor Fees are allowed. +Distribution of Compiled Forms of the Standard Version or Modified Versions without the Source + +(5) You may Distribute Compiled forms of the Standard Version without the Source, provided that you include complete instructions on how to get the Source of the Standard Version. Such instructions must be valid at the time of your distribution. If these instructions, at any time while you are carrying out such distribution, become invalid, you must provide new instructions on demand or cease further distribution. If you provide valid instructions or cease distribution within thirty days after you become aware that the instructions are invalid, then you do not forfeit any of your rights under this license. + +(6) You may Distribute a Modified Version in Compiled form without the Source, provided that you comply with Section 4 with respect to the Source of the Modified Version. +Aggregating or Linking the Package + +(7) You may aggregate the Package (either the Standard Version or Modified Version) with other packages and Distribute the resulting aggregation provided that you do not charge a licensing fee for the Package. Distributor Fees are permitted, and licensing fees for other components in the aggregation are permitted. The terms of this license apply to the use and Distribution of the Standard or Modified Versions as included in the aggregation. + +(8) You are permitted to link Modified and Standard Versions with other works, to embed the Package in a larger work of your own, or to build stand-alone binary or bytecode versions of applications that include the Package, and Distribute the result without restriction, provided the result does not expose a direct interface to the Package. +Items That are Not Considered Part of a Modified Version + +(9) Works (including, but not limited to, modules and scripts) that merely extend or make use of the Package, do not, by themselves, cause the Package to be a Modified Version. In addition, such works are not considered parts of the Package itself, and are not subject to the terms of this license. +General Provisions + +(10) Any use, modification, and distribution of the Standard or Modified Versions is governed by this Artistic License. By using, modifying or distributing the Package, you accept this license. Do not use, modify, or distribute the Package, if you do not accept this license. + +(11) If your Modified Version has been derived from a Modified Version made by someone other than you, you are nevertheless required to ensure that your Modified Version complies with the requirements of this license. + +(12) This license does not grant you the right to use any trademark, service mark, tradename, or logo of the Copyright Holder. + +(13) This license includes the non-exclusive, worldwide, free-of-charge patent license to make, have made, use, offer to sell, sell, import and otherwise transfer the Package with respect to any patent claims licensable by the Copyright Holder that are necessarily infringed by the Package. If you institute patent litigation (including a cross-claim or counterclaim) against any party alleging that the Package constitutes direct or contributory patent infringement, then this Artistic License to you shall terminate on the date that such litigation is filed. + +(14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..01b27b0 --- /dev/null +++ b/README.txt @@ -0,0 +1,35 @@ +Service Administration Front End +SAFE is written by F. Overkamp, ObSimRef BV (C) 2009 + +For latest updates, see: http://www.obsimref.com/en/safe/ + +SAFE stands for Service and Administration Front End. It is a basic web-based application that allows small companies to perform invoicing tasks, both one-off invoices and recurring services (subscriptions). Subscriptions can be entered with a price per month, per quarter or per year. Invoice lines can be joined together by your company administrator into an invoice. That invoice can then be downloaded in PDF format, printed and sent to the customer. SAFE is meant to allow non-techical people to work with the invoicing system so simplicity is key. + +Obtaining the latest sources: svn co http://pkg.obsimref.com/svn/safe/trunk safe + +Why SAFE and not SugarCRM/PHPAGA/.... ? + +We experimented with a number of publicly available open source applications. The main problem with all of them is that they are not purely administrative in function, and therefore present the users with many many other functions that will never be used. Ofcourse there is also the number of issues that we feel is not really done conveniently, but the clutter in the interface is really the primary issue. +Current state and roadmap + + * Working basic setup, based on phpMyEdit pages, expanded with PDF download and cron-scripts + * Next version will replace phpMyEdit pages with proper Zend framework usage + +Features + + * Basic multilingual support + * VAT and EU Intracom rules + * Multiple subscriptions in 1 invoice or separate invoices per service: You decide + * Processing of Call Detail Records in standard formats (i.e. to add voip services) + * ... + +Requirements + + * PHP5 + * MySQL (working on other database abstraction) + * Cron to enable automatic invoice-line creation + +Licensing + +SAFE is provided AS-IS without any warranty. It may be used, modified and redistributed under the Artistic License v2. + diff --git a/cache/placeholder.txt b/cache/placeholder.txt new file mode 100644 index 0000000..e2f5d59 --- /dev/null +++ b/cache/placeholder.txt @@ -0,0 +1 @@ +Your webserver should be able to write in this directory to allow caching WHOIS data diff --git a/createinvoice.php b/createinvoice.php new file mode 100644 index 0000000..c093ed0 --- /dev/null +++ b/createinvoice.php @@ -0,0 +1,35 @@ +A fatal MySQL error occured.\n
Query: " . $qry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + $customerset = mysql_fetch_array($result); + $onecustomer = $customerset["customerid"]; + + // Okay, update the selected customer + $qry = "UPDATE ".$opts['in']." SET invoiceid=$invnr, invoicelinedate=NOW() WHERE invoiceid IS NULL AND customerid=$onecustomer AND invoicelineid IN (".implode(",",$combine).")"; + $result = mysql_query($qry) or die("A fatal MySQL error occured.\n
Query: " . $qry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + + header('Location: invoicelist.php'); +} else { + header('Location: itemstoinvoice.php'); +} + +?> diff --git a/cron-domains.php b/cron-domains.php new file mode 100644 index 0000000..8d8a9b1 --- /dev/null +++ b/cron-domains.php @@ -0,0 +1,121 @@ +A fatal MySQL error occured.\n
Query: " . $qry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + +header("Content-Type: text/plain"); + +// Loop through them +while ($domain = mysql_fetch_array($result)) { + // Check domain parameters + $domainname = $domain['domain']; + echo $domainname.": "; + + // Check Whois NS records + if(empty($zonecheck)) { + $zonecheck = new zonecheck($domainname); + } else { + $zonecheck->lookup($domainname); + } + echo $zonecheck->registrar; + echo " / "; + echo $zonecheck->rsp; + echo " / "; + $nstxt = implode(",", $zonecheck->ns); + echo $nstxt; + echo " / "; + + if(!empty($zonecheck->registrar) && ($domain['registrar'] != $zonecheck->registrar)) { + $updqry = "UPDATE ".$opts['tb']." SET registrar='".$zonecheck->registrar."' WHERE domain='$domainname'"; + $updres = mysql_query($updqry) or die("A fatal MySQL error occured.\n
Query: " . $updqry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + } + if(!empty($zonecheck->rsp) && ($domain['rsp'] != $zonecheck->rsp)) { + $updqry = "UPDATE ".$opts['tb']." SET rsp='".$zonecheck->rsp."' WHERE domain='$domainname'"; + $updres = mysql_query($updqry) or die("A fatal MySQL error occured.\n
Query: " . $updqry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + } + if(!empty($nstxt) && ($domain['whoisglue'] != $nstxt)) { + $updqry = "UPDATE ".$opts['tb']." SET whoisglue='$nstxt' WHERE domain='$domainname'"; + $updres = mysql_query($updqry) or die("A fatal MySQL error occured.\n
Query: " . $updqry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + } + + // Check DNS NS records + $output = array(); + $nshosts = array(); + $cmd = "host -t NS $domainname $neutralnameserver"; + $retcode = exec($cmd, $output); + foreach($output as $nsline) { + $tok = strtok($nsline, " \n\t"); + while($tok !== false) { + $host = $tok; + $tok = strtok(" \n\t"); + } + $nshosts[] = $host; + } + sort($nshosts); + $nstxt = implode(",",$nshosts); + echo $nstxt; + echo " / "; + if($domain['dnshosts'] != $nstxt) { + $updqry = "UPDATE ".$opts['tb']." SET dnshosts='$nstxt' WHERE domain='$domainname'"; + $updres = mysql_query($updqry) or die("A fatal MySQL error occured.\n
Query: " . $updqry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + } + + // Check DNS MX records + $output = array(); + $mxhosts = array(); + $cmd = "host -t MX $domainname $neutralnameserver"; + $retcode = exec($cmd, $output); + foreach($output as $mxline) { + $tok = strtok($mxline, " \n\t"); + while($tok !== false) { + $host = $tok; + $tok = strtok(" \n\t"); + } + $mxhosts[] = $host; + } + sort($mxhosts); + $mxtxt = implode(",",$mxhosts); + echo $mxtxt; + echo " / "; + if($domain['mxhosts'] != $mxtxt) { + $updqry = "UPDATE ".$opts['tb']." SET mxhosts='$mxtxt' WHERE domain='$domainname'"; + $updres = mysql_query($updqry) or die("A fatal MySQL error occured.\n
Query: " . $updqry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + } + + // Check DNS www record + $output = array(); + unset($host); + $cmd = "host www.$domainname $neutralnameserver | grep -v 'CNAME'"; + $retcode = exec($cmd, $output); + $tok = strtok($output[count($output)-1], " \n\t"); + // Gets only the last line of output (which holds the host IP) + while($tok !== false) { + $host = $tok; + $tok = strtok(" \n\t"); + } + switch($host) { + case "217.114.110.194": $host = "clio"; break; + case "217.114.110.195": $host = "toledo"; break; + } + echo $host; + if($domain['web'] != $host) { + $updqry = "UPDATE ".$opts['tb']." SET web='$host' WHERE domain='$domainname'"; + $updres = mysql_query($updqry) or die("A fatal MySQL error occured.\n
Query: " . $updqry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + } + + echo "\n"; +} +?> diff --git a/cron-items.php b/cron-items.php new file mode 100644 index 0000000..63a0f60 --- /dev/null +++ b/cron-items.php @@ -0,0 +1,90 @@ +A fatal MySQL error occured.\n
Query: " . $qry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + +header("Content-Type: text/plain"); + +// Loop through them +while ($subscription = mysql_fetch_array($result)) { + // Process the subscription + $subid = $subscription['subscriptionid']; + $custid = $subscription['customerid']; + $description = $subscription['servicename']." ".$subscription['description']; + $amount = $subscription['amount']; + $nrc = $subscription['nrc']; + $yrc = $subscription['yrc']; + $qrc = $subscription['qrc']; + $mrc = $subscription['mrc']; +// $substart = $subscription['startdate']; + $lastinv = $subscription['lastinvoiced']; + $lastinvtime = strtotime($lastinv); + $yearseconds = 60*60*24*365; + $today = date("Y-m-d"); + $updated = false; + if($lastinv == "0000-00-00") { + $firsttime = true; + } else { + $firsttime = false; + } + + // Test for NRC + if(($lastinv == "0000-00-00") && ($nrc != 0)) { + // Invoice the NRC + $ins = "INSERT INTO ".$opts['in']." (customerid, subscriptionid, description, invoicelinedate, amount, charge) "; + $ins .= "VALUES ($custid, $subid, '$NRC: $description', NOW(), $amount, $nrc)"; + $insres = mysql_query($ins) or die("A fatal MySQL error occured.\n
Query: " . $ins . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + $updated = true; + $firsttime = true; + echo "Invoiced $NRC $description $amount x $nrc\n"; + } + + // Test for MRC + if((($MRC != strtolower(date('F', $lastinvtime))) || $firsttime) && ($mrc != 0)) { + // Invoice the MRC + $ins = "INSERT INTO ".$opts['in']." (customerid, subscriptionid, description, invoicelinedate, amount, charge) "; + $ins .= "VALUES ($custid, $subid, '$description $MRC', NOW(), $amount, $mrc)"; + $insres = mysql_query($ins) or die("A fatal MySQL error occured.\n
Query: " . $ins . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + $updated = true; + echo "Invoiced $description $MRC $amount x $mrc\n"; + } + + // Test for QRC + if((($QRC != 'Q'.ceil(date('n', $lastinvtime)/3)) || $firsttime) && ($qrc != 0)) { + // Invoice the QRC + $ins = "INSERT INTO ".$opts['in']." (customerid, subscriptionid, description, invoicelinedate, amount, charge) "; + $ins .= "VALUES ($custid, $subid, '$description $QRC', NOW(), $amount, $qrc)"; + $insres = mysql_query($ins) or die("A fatal MySQL error occured.\n
Query: " . $ins . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + $updated = true; + echo "Invoiced $description $QRC $amount x $qrc\n"; + } + + // Test for YRC + if((($YRC != date('Y', $lastinvtime)) || $firsttime) && ($yrc != 0)) { + // Invoice the YRC + $ins = "INSERT INTO ".$opts['in']." (customerid, subscriptionid, description, invoicelinedate, amount, charge) "; + $ins .= "VALUES ($custid, $subid, '$description $YRC', NOW(), $amount, $yrc)"; + $insres = mysql_query($ins) or die("A fatal MySQL error occured.\n
Query: " . $ins . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + $updated = true; + echo "Invoiced $description $YRC $amount x $yrc\n"; + } + + if($updated) { + $upd = "UPDATE ".$opts['tb']." SET lastinvoiced=NOW() WHERE subscriptionid=$subid"; + $updres = mysql_query($upd) or die("A fatal MySQL error occured.\n
Query: " . $upd . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + } +} +?> diff --git a/customers.php b/customers.php new file mode 100644 index 0000000..12c31fe --- /dev/null +++ b/customers.php @@ -0,0 +1,203 @@ + + + + + Customers + + + +

Customers

+ true, + 'query' => true, + 'sort' => true, + 'time' => true, + 'tabs' => true +); + +// Set default prefixes for variables +$opts['js']['prefix'] = 'PME_js_'; +$opts['dhtml']['prefix'] = 'PME_dhtml_'; +$opts['cgi']['prefix']['operation'] = 'PME_op_'; +$opts['cgi']['prefix']['sys'] = 'PME_sys_'; +$opts['cgi']['prefix']['data'] = 'PME_data_'; + +/* Get the user's default language and use it if possible or you can + specify particular one you want to use. Refer to official documentation + for list of available languages. */ +$opts['language'] = $_SERVER['HTTP_ACCEPT_LANGUAGE'] . '-UTF8'; + +/* Table-level filter capability. If set, it is included in the WHERE clause + of any generated SELECT statement in SQL query. This gives you ability to + work only with subset of data from table. + +$opts['filters'] = "column1 like '%11%' AND column2<17"; +$opts['filters'] = "section_id = 9"; +$opts['filters'] = "PMEtable0.sessions_count > 200"; +*/ + +/* Field definitions + +Fields will be displayed left to right on the screen in the order in which they +appear in generated list. Here are some most used field options documented. + +['name'] is the title used for column headings, etc.; +['maxlen'] maximum length to display add/edit/search input boxes +['trimlen'] maximum length of string content to display in row listing +['width'] is an optional display width specification for the column + e.g. ['width'] = '100px'; +['mask'] a string that is used by sprintf() to format field output +['sort'] true or false; means the users may sort the display on this column +['strip_tags'] true or false; whether to strip tags from content +['nowrap'] true or false; whether this field should get a NOWRAP +['select'] T - text, N - numeric, D - drop-down, M - multiple selection +['options'] optional parameter to control whether a field is displayed + L - list, F - filter, A - add, C - change, P - copy, D - delete, V - view + Another flags are: + R - indicates that a field is read only + W - indicates that a field is a password field + H - indicates that a field is to be hidden and marked as hidden +['URL'] is used to make a field 'clickable' in the display + e.g.: 'mailto:$value', 'http://$value' or '$page?stuff'; +['URLtarget'] HTML target link specification (for example: _blank) +['textarea']['rows'] and/or ['textarea']['cols'] + specifies a textarea is to be used to give multi-line input + e.g. ['textarea']['rows'] = 5; ['textarea']['cols'] = 10 +['values'] restricts user input to the specified constants, + e.g. ['values'] = array('A','B','C') or ['values'] = range(1,99) +['values']['table'] and ['values']['column'] restricts user input + to the values found in the specified column of another table +['values']['description'] = 'desc_column' + The optional ['values']['description'] field allows the value(s) displayed + to the user to be different to those in the ['values']['column'] field. + This is useful for giving more meaning to column values. Multiple + descriptions fields are also possible. Check documentation for this. +*/ + +$opts['fdd']['customerid'] = array( + 'name' => 'Customerid', + 'select' => 'T', + 'options' => 'AVCPDR', // auto increment + 'maxlen' => 20, + 'default' => '0', + 'sort' => false +); +$opts['fdd']['customername'] = array( + 'name' => 'Customer', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => true +); +$opts['fdd']['attn'] = array( + 'name' => 'Attn', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => false +); +$opts['fdd']['street'] = array( + 'name' => 'Street', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => false +); +$opts['fdd']['zipcode'] = array( + 'name' => 'Zipcode', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => false +); +$opts['fdd']['city'] = array( + 'name' => 'City', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => true +); +$opts['fdd']['country'] = array( + 'name' => 'Country', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => true +); +$opts['fdd']['vatnr'] = array( + 'name' => 'VATnr', + 'select' => 'T', + 'maxlen' => 20, + 'sort' => false +); +$opts['fdd']['language'] = array( + 'name' => 'Language', + 'select' => 'T', + 'maxlen' => 5, + 'sort' => true +); + +// Now important call to phpMyEdit +require_once 'phpMyEdit.class.php'; +new phpMyEdit($opts); + +?> + + + + diff --git a/doc/AUTHORS b/doc/AUTHORS new file mode 100644 index 0000000..fa3df8a --- /dev/null +++ b/doc/AUTHORS @@ -0,0 +1,17 @@ +John McCreesh + Founded project and developed all versions 0.x, 1.x, 2.x and 3.x. + +Jim Kraai + Maintains phpMyEdit versions 4.x. + +Ondrej Jombik + Current project maintainer. Develops version 5.0 and laters. + +Many thanks to various project contributors. See doc/ChangeLog file +for credits. + +Please do not write previous maintainers support questions, +suggestions, bug reports or patches. Use Platon.SK bug-tracking +system, support forum or phpMyEdit mailinglist for these purposes. + + diff --git a/doc/COPYING b/doc/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/doc/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/doc/ChangeLog b/doc/ChangeLog new file mode 100644 index 0000000..e50c1ba --- /dev/null +++ b/doc/ChangeLog @@ -0,0 +1,938 @@ +2007-09-16 release 5.7.1 (official) +- finalizations, README & Makefile updates +- added support for various language encodings + (default one is backward compatible and this + will be changed later to UTF-8 for all languages) + +2007-09-12 +- joining virtual column to other table now works + +2007-09-08 +- refixed bug #446 +- refixed limit clause +- updated PT-BR language file (Victor Zucarino) + +2007-09-03 release 5.7 (official) +- finalizations, README & Makefile updates +- removed unneccessary obsolete extensions, + others extensions were fixed + +2007-07-03 +- allow to pass an array to $opts['filters'] +- fixed #446: default value in pull-down not working + +2007-05-05 +- fixed numeric/integer fields with UTF-8 strings + concatenation (nepto) + +2007-04-15 +- possibility for db abstraction added (michal) +- fixed long term bug on quoting of column names, which added + possibility for usage of reserved words as column names + (bugs #94, #126, #146, ...) (michal) +- fixed several small bugs #409, #437, #430, #426 + +2006-01-30 +- japanese language file added +- indonesian language file added + +2006-11-26 +- fixed #424: Available Languages doc: Czech should be CZ +- several tiny bugs fixed: #421, #422, #416, #412 + (thanks to Doug Hockinson) + +2006-09-17 release 5.6 (official) +- finalizations, README & Makefile updates + +2006-09-09 +- implemented #258: Add version info to generated files + +2006-09-08 +- fixed #402, options for database and table in setup script +- fixed #391, Addition to XHTML Compliancy (thanks to DeanS) +- fixed #327, values with values2 work also in LFV modes + (thanks to mmikrut@cyberone.com.au) +- fixed #384, escape option not working in AC modes + please check your configuration if option 'escape' => false + should not be set 'escape|LFVD' => false +- fixed #387, special characters in javascript hints + (thanks to Doug Hockinson) +- implemented #401: innoDB field contrains + (thanks to Ryan Wade - wryan ) + +2006-08-30 +- implemented #393: added support for 'php' feature (michal) +- implemented #296: checkboxes / flags support (+ radios) + +2006-09-02 +- changed phpMyEdit action icons to more nice ones + (contribution by Alexandros Vellis , + icons are from http://www.famfamfam.com/lab/icons/ website) + +2006-08-05 +- added greek hellenic (EL) translation + (contribution from Alexandros Vellis ) + +2006-06-07 +- alternate phpMyEdit icons added to distribution + (contributed Victor Zucarino ) + +2006-05-29 +- improved Portugese translation + (contribution by Sérgio Sanches ) + +2006-03-19 +- fixed #380: $join_table and others not working in 'filters' +- listall fixed, division by zero prevented +- fixed #326: "Go to" button page selector does not change page + +2006-03-04 +- record radio button on list/filter page is set accodring + to the last manipulated record (thanks to Enis Pilavdzic) + +2006-02-20 +- fixed #355: column looking from another table +- fixed #375: HR tag is output before TABLE tag (doug) + +2006-02-16 +- language codes are not truncated to 5 characters now + +2006-01-24 +- fixed #368: PDF and long line (long lines were wrapped) +- fixed #365, #369, #370: xhtml compliant (thanks to lcapronnier) +- fixed #337: $HTTP_SERVER_VAR no longer works with php 5.04 + +2006-01-23 release 5.5 (official) +- updated copyright dates and copyright holder +- added extensions to distribution package +- finalizations, TODO update, etc. + +2006-01-04 +- closed #197: Dutch language file (thanks to Mardek) + +2005-11-13 +- improved turkish translation + (thanks to Kadan Kongar ) + +2005-09-14 +- added #345: phpMyEdit Estonian translation + (thanks to Alexia Death ) + +2005-04-26 +- added #332: Czech language file + (thanks to Jan Cinert ) + +2005-04-03 +- applied #152: button display order + (many thanks to michal for the patch and docs) + +2005-03-24 +- fixed #295: linefeed and persistent connect + (thanks to Doug Hockinson for the contribution) + +2005-03-12 +- fixed #254: password field not working (on the add page) + +2005-03-05 +- fixed #311: setup script and cgi prefixes +- fixed #303: filter broken after view + (thanks to michal and hbernard for these updates) + +2004-12-26 +- added #292: Translation into Romanian language + (thanks to Sebastian Proksch ) +- added static method get_default_cgi_prefix(); + made get_*_cgi_var() methods work statically as well +- fixed #262: modifications to $newvals not in TUB triggers + (thanks to several contributors for the ideas and patches) + +2004-12-08 +- fixed #288: wrong default value of hidden fields in add mode +- fixed #231: array of trigger and event processing + (thanks to hbernard for working on these issues) + +2004-11-27 +- new documentation chapter "Hints & Tips" was created +- fixed #259: Standard STYLE commands cause clashes + (thanks to ajh for pointing on this and initial patch) + +2004-11-20 +- implemented #158: Internal CGI name prefixing +- implemented #279: Making selected TAB persistent + (thanks to hbernard for patching both issues) + +2004-11-09 +- implemented #277: number_format option + +2004-11-02 +- all preg_match() scans for number now use \d+ instead of \d* +- fixed #271: no posibility to suppress initial sort + +2004-10-18 +- fixed #270: error in PME.lang.ZH.inc + (thanks to Manix Sio for corrections) + +2004-07-15 +- fixed #253: introducing $opts['dbh'] option + +2004-07-13 +- fixed #233: Sort order is reversed after 'more' button used + +2004-05-17 +- added basqe language file + (thanks to Ibon Igartua ) + +2004-04-21 +- fixed #178: get value of the key field after an insert + (thanks to mariano for the patch) +- fixed #235: Apply broken when KEY value was changed + (a patch was provided by hbernard) + +2004-04-20 +- fixed #185: creating of insert/update query + (thanks to michal and hbernard) +- fixed #229: cancel triggers (thanks to michal for the patch) +- fixed #194: TABs improvement suggestions + (thanks to hbernard for the patch) +- fixed #188: language unspecific operations + (implementation of $opts['cgi']['prefix']['operation']) + +2004-04-17 +- fixed #176: 'values' JOIN with multiple from same table crashes +- fixed #205: Delete button creates a jscript runtime error +- fixed #25: tons of errors when display_errors set to ON + (an error_reporting() function did nothing when called + with @ prepended; all the issues was fixed by hbernard) + +2004-04-14 +- fix related to #121: during insert/update/delete actions + page type is according to page from which was from submitted + (thanks to hbernard for the initial patch) + +2004-04-11 +- fixed #219: Check "HTML header & footer", setup generates + NO php code (thanks to brycen for reporting) + +2004-04-04 +- fixed #155: New Translate values for spanish + (thanks to Eduardo Diaz ) +- fixed #161: js regexp input validation + (thanks to hbernard for the patch) + +2004-03-31 +- italian translation update (thanks to Keatch) +- fixed #134: joining tables with weird result + (thanks to michal for the idea and patch) +- fixed #208: title="" attributes for A HREF in text navigation + and did also some cleanup in code where these links are created + +2004-03-20 +- display plain text also for readonly URLs on the change page +- fixed #203: Calendar extension broken with jscalendar 0.9.6 + (thanks to ajh for the patch) +- fixed #190: URLdisp cannot show images + (URLdisp is now escaped according to field's ['escape']) + +2004-03-08 +- fixed division by zero when doing listall +- fixed #0000195: listall broken with mysql alpha 4.1.1 + (thanks to hbernard for providing a solution) + +2004-02-19 release 5.4 (official) +- finalizations, TODO update, etc. + +2004-02-08 +- swedish language file update (thanks to stefanl) +- spanish (AR) language file update (thanks to mariano) +- fixed #0000174: "Striping tags" should be "Stripping trags" + +2004-01-21 +- swedish language file added into distribution + (thanks to Björn Hammarbäck ) + +2004-01-20 +- operation handling simplyfication (related to #112) +- do not show navigation buttons when doing "listall" + (thanks to hbernard for the patch) +- fixed #0000131; this means, that ['width'] field attribute was + completelly removed and documentation was updated as well +- added basis of field's ['input'] option; BC with ['options'] + will be preserved for some time, at least in 5.4 release + +2004-01-12 +- fixed #0000033: Fast moving between list pages + (thanks to hbernard & others for the patches) + note, that with this change three new keys "First", + "Last" and "Go to" were added into language files + +2004-01-02 +- fixed #0000154: CGI values shouldn't be slash-stripped + (thanks to hbernard for the pointing on this issue) +- fixed #0000125: cancel buttons should be reset buttons + (again thanks to hbernard for the patch) +- fixed #0000114: Pre/after Edit/View trigger + (and finally thanks to hbernard for the idea & patch) +- fixed #0000112: Pressing Enter to perform a Query + +2003-12-30 +- fixed #0000156: Filter enabled even if 'F" not specified +- fixed names of SQL field aliases used internally by phpMyEdit +- fixed #0000153: Field size cannot be specified + (thanks to Feike for idea and patch) +- function create_javascripts() renamed to form_begin() + and new function form_end() was created +- added phpMyEdit-calpopup extension into repository + (thanks to Adam Hammond from London) + +2003-12-22 +- fixed #0000034: enum fields with " ' " come out wrong + +2003-12-18 +- fixed #0000150: Trimlen breaks URL linkages (thanks to ajh) +- fixed #0000147: $opts[page_name] can't be declared correctly + (thanks to Feike for the patch) + +2003-12-15 +- removed all eval() calls from the code; simple and secure + variable substitution function is used instead + +2003-12-11 +- date mask options are not applied also when timestamp is 0 +- implemented ['escape'] field option to control HTML + characters esaping; when not present, default value is "true" +- implemented ['display']['form'] global option to control whether + HTML
tag should be written to output by phpMyEdit; if not + present, default value is considered as "true" + +2003-12-08 +- write SQL expressions via ['sqlw'] option implemented +- basis of virtual properties +- options ['datemask'] and ['strftimemask'] are not applied + to empty strings or NULLs + +2003-11-22 +- fixed #0000143: Field name not displayed (thanks to d-rap) + +2003-11-12 +- applied #0000135: patch to add dropdown and hiding fields + (this affects phpMyEdit-report extension; thanks to "iplayfast") +- finished CSS classing policy in phpMyEdit-report extension + +2003-10-24 +- Turkish language file added + (thanks to Nuri Akman ) + +2003-08-15 +- implemented general control of TAB feature + via $opts['display']['tabs'] variable +- read ['sql'] option now works in all modes + +2003-07-29 +- fixed #0000119: readonly time/date field with datemask display + +2003-07-25 +- fixed #0000118: $key value is not save in Changelog +- fixed several weird 'H' (hidden) flag behaviours +- added chinese (Singapore) language file + +2003-06-30 +- added new chinese traditional language file + (thanks to Pao-Hsi Huang ) +- polish language file update + +2003-06-21 +- initial commit regarding to TABs support in phpMyEdit + (this is based on the request #0000063: Notebook display) + +2003-05-30 +- field is no longer forced to readonly when ['sql'] option is used +- phpMyEdit-messages extension modifications: + - added CSS classes policy + - added upper article pulldown box on add/change/view pages + - some methods reorganized + +2003-05-14 +- fixed #0000062: special mysql type handling should be documented + (generated code now contains comments near read-only fields) + +2003-05-12 +- substitued "Table0" with "PMEtable0" in setup script +- fixed #0000085, documentation problem regarding extensions usage +- added htmlArea extension usage notes into documentation +- reviewed and documented field's ['sql'] option + +2003-05-09 +- extension phpMyEdit-htmlarea.class.php added into repository + (thanks to Ezudin for this contribution) + +2003-05-02 +- column option ['colattrs'] implemented (based on the original + cell ['align'] patch by Raffaele Spangaro" ) + +2003-05-01 +- removed unneccessary string concatenations from echo() calls +- various fixes in phpMyEdit-report extension: + - made extension work with register_globals turned off + - added labels to language files + - use button for "Select fields" + - use table name in cookie names + (this will save preferences for various report pages) + - optional and warning-free cookie memory implemented + - code cleanups + +2003-04-27 +- improved validity of HTML output +- yet another fix for already "fixed" #0000047 and all things around + (this need a lot of testing) + +2003-04-20 +- every occurence of "choose" changed to "select" in setup script +- properly classified Query button ("pme-filter" -> "pme-query") + +2003-04-12 +- fixed #76 again, patch was not correct, thought idea was good +- italian language file update + (thanks to Keatch ) +- try to fix issue related to striping tags and escaping values + in html selections; this will be surely improved in future + +2003-04-10 +- fixed #0000076: mask attribute does not work properly + (thanks to Mariano ) +- fixed #0000074: "alt"-tag should be a "title"-tag + (thanks to Gerd) + +2003-04-08 release 5.3 (official) +- finalizations, TODO update, etc. + +2003-04-07 +- error reporting handling added into core class constructor +- fixed CSS postfix appending in display_change_field() +- improved setup script to ask user for additional option + (page header, HTML header, HTML footer, CSS basic sheet, etc.) + +2003-04-05 +- $opts['fdd']['col_name']['css']['postfix'] implementation +- other tiny improvements related to CSS handling +- fixed #0000064: no javascript validation during 'Copy' Operation + (thanks to Hugues Bernard ) +- fixed #0000067: when field type is "auto_increment" mark field + 'required' => false and read-only + +2003-04-02 +- improved array syntax of generated PHP code +- removed 'nowrap' field option from generated code +- CSS stylesheet typo fixed +- fixed #0000047: values2 not interpreted in list table when SET field + +2003-03-31 +- ability to have selects, multiple selects and textareas readonly + +2003-03-30 +- ['URLprefix'] and ['URLpostfix'] are added only if missing +- added URL displaying on delete/view pages +- standardize do_*_record() function to have $newvals and $oldvals + available in trigger files +- implemented ['datemask'] and ['strftimemask'] to format date and time + fields (currently done only for fields displaying; entering using + these masks is still missing) +- $changed array of changed keys is now also available in all triggers +- ['URLprefix'] and ['URLpostfix'] may be arrays +- fixed bug in htmlDisplay() when $disallow_empty and !$escape are set +- method encode() was removed + +2003-03-29 +- field type parameter is no longer needed and used; all occurences were + removed from core class and setup script as well +- default hostname "localhost" present in setup script +- a lot of redunacy and unneccessary code was removed +- class constructor cleanup +- SQL table aliases changed from "TableN" to "phpMyEdit_table_alias_N" + or something similar +- patch from Shaun Johnston extended by adding divs[-1] to implement + prefix and divs[$n + 1] to implement postfix +- CSS improvements in setup file + + +2003-03-26 +- several improvements in setup scripts: + - output source code contains basic CSS + - by default is page title empty and not written + - added info about usage of MySQL reserved word as primary key name + - etc. +- message cell is not printed if message is empty + +2003-03-19 +- applied improvement #0000052 - default value for drop down boxes + in add record page (thanks to hereq) +- tags are stripped in HTML selects values +- Clear button does not hide the filter now +- fixed filtering regarding to "0", "", "*" and similar strings +- several improvements regarding to "qfn" stuff +- code cleanup: short functions were moved to the top and some + unneccessary commets were remvoed or moved to the TODO file +- danish language file was added + (thanks to Henrik Nielsen ) + +2003-03-18 +- in do_add_record() changed $vals_ori to $values and $vals + to $vals_quoted, $values are now also available also in "before" trigger +- read only and hidden fields are automaticaly counted as not required; + this prevents JavaScript checks for these fields +- fixed sequences in CSS +- better signature for sent e-mail messages + +2003-03-17 +- moving on CSS classes policy matter +- various optimalizations to avoid string concatenations + +2003-03-6 +- several tiny improvements in setup script; many code cleanups was also + done there + +2003-02-18 +- starting with CSS classes policy implementation (all items are currently + marked with "TODO-class") + +2003-02-15 +- a lot of unnecessary code removal (gather_*(), plain2web(), web2plain()) +- fixed multiple selects usage on add and edit pages + +2003-02-14 +- timer.class file removed, class integrated into phpMyEdit core file +- fixed searching/filtering in text inputs of table lookup fields + +2003-02-12 +- fixed #0000023: Change/Save doesn't work with Mozilla + +2003-01-27 +- improved javascript empty fields protection; string is now trimed before + check if it is empty +- fixed set datatype storage into changelog during update action + (actually Array was written instead val1,val2,...) + +2003-01-12 +- multiple select can be forced now by ['select'] = 'M' +- added JavaScript validation support for select and multiple select fields + +2002-12-23 +- added portuguese (brazilian) language file + (thanks to Roberto Cohen ) +- fixed SQL query error check in list_table() +- improved error() method + +2002-12-22 +- fixed security bug - updating/adding/deleting record without particular + flag present in $opts['option'] option + +2002-12-18 +- fixed hidden field behaviour on add record page + +2002-12-14 +- improvemets of e-mail notifying and changelog saving +- all do_*_record() methods rewritten +- fixed hidden field behaviour (but it needs to be consulted with users) +- removed possibility of sorting according to hidden or password field +- get_server_var() method added + +2002-12-13 +- error message printing when language files could not be located +- persistent (session) CGI variables implemented via $opts['cgi']['persist'] +- fixed password field behaviour +- fixed readonly field behaviour +- rewritten logging changes into changelog table +- rewritten e-mail notification of changes +- some method simplification, huge code cleanup + +2002-12-12 +- fixed bug with multiple rows printing when using ['column'] without + ['description']; old behaviour can be reached using the same column for + both options (in example ['column'] = ['description'] = 'column_name') + +2002-12-10 release 5.2 (official) +- section "Documentation" of README file was updated + +2002-12-02 +- reimplemented input field sizes in filter +- fixed bug, when sorting according to non-displayed field + ($this->fqn($field) is used instead of "qf$field") +- fixed usage of real/double key types +- generated script will have all special page elements turned on by default + +2002-11-24 +- added russian language file (thanks to Lev Zabudkin ) +- fixed superfluous cells printing in add record action +- fixed empty field bug for read only fields on add page +- rewritten size/maxlength input field issues + +2002-11-22 +- fixed bad column saves for particular field definitions and "Apply" action +- added database connection closing at the end of phpMyEdit execution +- explicit MySQL query performing using stored database handle + +2002-11-18 +- fixed undesirable printing in display_add_record() method +- fixed bad hidden input tags position on diplay record pages; they were + moved before table declaration, so they are not inside anymore + +2002-11-14 +- add "Apply" functionality into change record page +- removed get_http_*() methods; only get_cgi_var() is used for safe CGI + variables retrieval +- informational message is also printed in display record page if neccessary +- options "default_sort_columns" removed and its functionality assigned to + "sort_field" option; due to complete rewrite of sorting system, other + features are: + - "sort_field" initialization by column name or field number + - "sort_field" initialization by one element or array of elements + - cumulative sorting (more sorting column selection on the fly) +- fixed nasty bug: after "More" or "Apply" operation was wrong columns + and/or column names displayed + +2002-11-12 +- HTML tags and attributes generation improvements such as quoting 'align' + attribute, removing 'nowrap', etc. (thanks to ) +- fixed 'sort_field' behaviour; now works fine + +2002-11-01 +- fixed undefined index warings in $HTTP_GET_VARS[] array in setup file +- improved connect() method and others slight improvements +- created phpMyEdit class error handler via method error(); it could be used + by extensions as well +- fixed bug with recreate_fdd() call in class constructor +- fixed JavaScript empty form fields validation; JavaScript is now generated + only if field with ['required'] turned on exists +- fixed bug using htmlDisplay() when displaying empty data + for input/textarea fields +- added extensions/phpMyEdit-report.class.php extension + +2002-10-30 +- methods simplyfication and split (connect(), recreate_displayed(), + recreate_fdd() was added); it should bring better and easier phpMyEdit + extensions implementation +- added extensions/phpMyEdit-slide.class.php extension + +2002-10-29 +- fixed language inclusion stuff +- added default true parameter for disallowing empty fields + into htmlDisplay() method +- fixed all occurences of possible empty fields +- changed invalid HTML attribute `maxwidth' to `maxlength' in `input' tag + (fixes #629942) + +2002-10-23 +- set default sorting when using ['divs'] in ['values']['description'] and + ['orderby'] is not specified +- intelligent usage of Search/Hide/Query labels; if there is space, long + labels are used, short ones otherwise +- changed default language from English-US to classical English +- added Clear label with appropriate filter clear action +- forced graphics/text links and radio buttons to get minimum screen size +- fixed bug, when doing add/copy/change/delete action under filter enabled; + not proper fields were displayed due to quering according filter flag, not + according performed action flag +- ['strip_tags'] option for field implemented + +2002-10-20 +- fixed flag collision between copy opration and password field +- fixed bug with preserving descending sorting during record display + +2002-10-19 +- URL option implemented, now works for images location +- fixed division by zero; listing all is now also in inc equal to 0 +- improved ['values2'] support +- added support for ['cgi']['append'] and ['cgi']['overwrite'] CGI variables +- added support for ['execute'] + +2002-10-18 +- fixed bug with filter displaying, moving across various pages and + performing actions with filter enabled +- added feature to have ability to define special options connected + with particular phpMyEdit actions for items in $fdd array + +2002-10-17 release 5.1 (official) +- added support for ['values2'] which can be used in addition to table + lookup done by ['values']['table'] and similar options +- fixed save/change/delete bug, which updates bad fields not according + to performed action +- added copyright headers into PHP files +- file doc/COPYING file added into distribution + +2002-10-12 +- clearification of URL stuff; better examples in generated files + and also ['URLprefix'] and ['URLpostfix'] options was added; first + one gives old 3.5 ['URL'] bahaviour +- fixed selection and multiple selection filter behaviour +- some internal methods were modified, fe. fqn(), web2plain() and others + +2002-10-01 +- added polish language file (thanks to Piotr Walesiuk ) + +2002-09-30 release 5.0 (official) +- improved setup script with appropriate changes in class file; more clear + comments, cleaner code, grouped options and added missing functionality + (see `display' key), etc. +- huge code and HTML output cosmetic changes +- fixed colspan errors + +2002-09-29 +- removed `actionStyle' configuration parameter, `navigation' was added + to get more flexibility of navigation style configuration + +2002-09-24 +- doc/ changes: README heavily updated, AUTHORS added +- Makefile added into CVS; use "make dist" for phpMyEdit + distribution creation + +2002-08-23 +- applied patch from Bill Sparkman containing + possibility to have navigation buttons also on top of page +- fixed buggy more operation functionality +- fixed set datatype behaviour during add operation +- removed empty initialization item in combo boxes during add operation +- new HTML (table) code for navigation buttons and output message printing +- following new language keys are now accepted: of, Search, Hide, Go; + default values are initialized if they are not set +- Diplay to View language key changes + +2002-08-09 +- applied patch from Shaun Johnston to have + ability to select more than one description column from another table; + backward compatibility with 'description' field of 'values' array + is preserved +- corrected display vs. view operation confusion; only view now exists, + display was removed; use 'V' flag for this +- array_merge() calls completelly removed due to its strange behaviour; + see also #575090 and similar +- fixed phpMyEditSetup.php file to work with register globals turned off + (see #556553); also messages were updated and code was a little bit + cleanified + +2002-08-08 +- fixed set SQL data type manipulation (works fine, yeah!) +- fixed proper column displaying in table list after record update +- fixed copy/change bug when lookup for data in other table is done +- unneccessary variables removed from display_change_field() +- pretty HTML output is no longer supported + +2002-08-07 +- new transparent PNG icons added into distribution +- fixed bug with action links +- fixed set handling (see #531091) +- fixed register_globals turned off behaviour; should works fine +- fixed URL/eval() parse error bug +- fixed bug in htmlSelect(); closing tag was added +- changed HTTP-ACCEPT-LANGUAGE to HTTP_ACCEPT_LANGUAGE +- german language file according to #524371 changed +- PGPMyEdit to phpMyedit change + +2002-07-29 +- directory structure and files reorganization file names, variables + and PHP tags changed to match convention +- changed all occurences of htmlentities() to htmlspecialchars() +- view functionality letter changed from E to V +- some HTML fixes and code cleanups + +2002-07-28 +- OK guys, after few months of project inactivity, we are going to move + this thing on; my name is Ondrej Jombik, I'm from Slovakia and I believe + in productive cooperation + ++-+-+-+-+ Changes by Jim Kraai & John McCreesh follow + +2002-02-07 + Added support for $fdd['field']['values']['db'] + Replace call to mysql_fetch_assoc with mysql_fetch_array in PME Setup +05-Feb-02 + Tore explicit date support from PME out of frustration + (will tackle this later) + timestamps are still read-only + +04-Feb-02 + Fixed logtable schema in PHPMyEditSetup.php + +30-Jan-02 + Changed filters to use strings instead of arrays + +29-Jan-02 + Added support for $fdd[col][values]['filters'] when selecting + values from another table + Added support for 'graphic' links + +28-Jan-02 + Added ability to turn off displaying current sort and/or filters + in generated include file + Added nowrap to action (first) column if 'link' style is used + +25-Jan-02 + Added support for MySQL enum type + Added support for MySQL set type + Fixed bug with sort field number zero + Fixed bug in PME Setup w/ wrong name to support language labels + in generated .inc file + Fixed bug in PME Setup where generated file was including non-existent + header/footer files + Added support in PME Setup for default values MySQL derived + from MySQL table description + Fixed date edit form display bug + Added another action--Display Detail. + In $opts['options'], it's an 'E' and is on by default + +24-Jan-02 - 4.001b1 Many Changes + Added support for a calculated column requires: + $fdd['other']['name']='Col Header'; + $fdd['other']['expression']='onHand-ordered'; + $fdd['other']['sort']='T:!'; + $fdd['other']['select']='T'; + $fdd['other']['type']='int'; + 'other' can be anything, but multiple ones in a single + file need to be unique + 'expression' can be any valid MySQL expression + 'type' should reflect the results of the expression, + e.g. 'int' or 'string' + all other options work as with other, normal columns + this kind of column is always read-only + Most of these changes were motivated by using PME in two + medium sized projects. + Setup renamed to PHPMyEditSetup.php + Setup Added functionality: + Ascertains field type from mysql database + Setup displays and attempts to write two files. + These files are written to a configurable directory. + PHPMyEdit.inc Added functionality: + Date and Number filter fields now have in/equality operators + Major date handling changes: + Dates now handled with multiple input fields + Specifiable date ranges (within year ranges only) + see 'daterange' option + + Can set listing limit to -1 (all rows on page) + Can have multiple initial sort fields which are retained + as secondary/tertiary/quaternary/etc sort fields during normal usage + 'format' option is deprecated in favor of two new options: + 'datemask' is a PHP date style date format that supports + a few of the date macros + 'mask' is processed by printf() before displaying + 'daterange' accepts a range of years + 'maxwidth' is a new option that limits the width of filter fields + 'URL' options have been expanded, maybe too far for security comfort + 'options' have been expanded to recognize additional params + R -- read-only + P -- password field + H -- hidden field + Not for the faint of heart, trigger support has been added, + see discussion in home page docs. + Initial filters capability has been added, also not for the faint + of heart. Flexibility was chosen at the cost of ease of use + Default field values are now supported + Updates to a table can now be logged to another table + Call to $MyForm -> execute() moved to end of the PME class initializer + because it always gets executed then anyway + Previously unidentified bug fixed where if the coder had referred + to the same ['values']['table'] for two different fields would pull + (and update) based on the last use of the referenced table. + Changed all implicit joins to LEFT OUTER JOINs. + Bug fix where addslashes() wasn't complimented by strip + Bug fix where filtering didn't work where there were slashes + in the data + Started moving to single function which generates SELECT statements + +06-May-01 - 3.5 multilingual version - you can now change all + the displayed text to your local language. + Limited ability to customise the format used for displaying and + entering dates (d/m/y, m/d/y, d.m.y etc). However, dates in filters + must still be entered in MySQL format. + Fixed some bugs introduced when support of column names containing + special characters or reserved words was added (e.g. using 'Date' as + a column name). Note - database and table names may not contain + special characters or reserved words. + Changed handling of 'Cancel' button + (thanks Bret ) + +23-Apr-01 - 3.4 added 'More' button to 'Add' screen to make it easier + to enter multiple records. + +23-Apr-01 - 3.3 fixed bug which prevented 'Next' button working + when filter had been activated (oops). + +18-Apr-01 - 3.2 added ['select'] = 'M' to allow Multiple values + to be selected in a drop-down list in a filter. The number of values + displayed is set by $multiple (default = 4). + + NOTE - $multiple has been added to the call to PHPMyEdit, so this + release is not compatible with calling programs produced by earlier + releases of SETUP.PHP (sorry). + +20-Mar-01 - 3.1 added ['options'] to provide full control over + which fields appear on the List, Add, Change, and Delete screens. + This replaces 'listview', which no longer works with this release + - i.e. ['options']='ACD' has the same effect as ['listview']=true. + +27-Feb-01 - 3.0 PHPMyEdit converted to PHP classes + by Pau Aliagas . + This new version will not work with calling programs created by older + versions of SETUP.PHP - you will need to run SETUP.PHP again (sorry). + Added $options='I' - to display records from the table with the + Initial sort suppressed (useful if you have a very large table with + no indexes). + +14-Feb-01 - 2.3 added ['description'] option to ['values']. + This considerably enhances PHPMyEdit's ability to handle multiple + tables in a seamless manner. It also involved a lot of new code, + so 2.3 should be considered as more risky than the well-tested 2.2. + +10-Feb-01 - 2.2 generate javascript to ensure user enters values + for fields marked as 'required'. SETUP.PHP now marks 'not_null' + fields as 'required' by default. + (by Yusuf Kursat Tuncel ) + PHPMyEdit.PHP now no longer requires 'sort_open_tag' to be set to + false. + + NOTE - to use the filter functionality, you must now have 'F' in + $OPTIONS in your calling program. This is set automatically by + SETUP.PHP in version 2.2, BUT IS NOT BACKWARDS COMPATIBLE (sorry). + +02-Feb-01 - 2.1 suppress display of selected fields from the list + display but still allow editing with "listview" property. + (by Linas Jakucionis ) + +12-Jan-01 - 2.0 added filter functionality based on an idea from Chris. + +02-Jan-00 - 1.9 fixed minor bug in display of blank fields as textareas + +21-Dec-00 - 1.8 clicking a second time on a column heading causes + the sort order to be reversed + (thanks to Paolo Petrini ) + Support multi-line textareas (thanks again to Chris Navas) + +19-Dec-00 - 1.7 removed restriction that key field must be numeric + with $key_type parameter. Also fixed that not all browsers let you + get away with . + +17-Dec-00 - 1.6 split out php and php3 versions. + SETUP.PHP now prompts for the field to be used as a key. + PHPMyEdit can now populate drop down lists from a field in a table. + +11-Dec-00 - 1.5 included a local version of an in_array function + so PHP Version 3 users can use the program + (thanks to for the code). + +10-Dec-00 - 1.4 Added support for textareas to SETUP.PHP and PHPMyEdit. + Merci beaucoup Chris Navas pour ce petit truc. + +08-Dec-00 - 1.3 SETUP is now a bit prettier to look at. PHPMyEdit.PHP + now allows you to store HTML etc inside a table (previously it + stripped out anything that looked like code). Note that it displays + HTML as HTML - e.g. if you store this in a table, that's how + it will appear on the screen - not 'this' in bold type. + +03-Dec-00 - 1.2 rather more elegant solution to SETUP.PHP problem already + fixed temporarily in 1.1. + Added warning to SETUP.PHP if PHP is not configured correctly for XML. + Added support for "URL" parameter to SETP.PHP and PHPMyEdit.PHP, + to allow 'clickable' links to email, web, ftp, etc. addresses. + Improved handling of magic_quotes within PHPMyEdit.PHP. + +29-Nov-00 - 1.1 temporary fix to glaring bug which prevented SETUP.PHP + working with protected MySQL databases + diff --git a/doc/README b/doc/README new file mode 100644 index 0000000..5825593 --- /dev/null +++ b/doc/README @@ -0,0 +1,105 @@ +phpMyEdit +--------- + +1. Overview + + How many times have you hand coded a MySQL table editor in PHP? + phpMyEdit application provides an instant table editor. + + phpMyEdit generates PHP code for displaying/editing MySQL tables + in HTML. All you need to do is to write a simple calling program + (a utility to do this is included). It includes a huge set of + table manipulation functions (record adition, change, view, copy, + and remove), table sorting, filtering, table lookups, and more. + +2. Installation + + For quick installation follow these steps: + + 1. Extract phpMyEdit distribution archive. + 2. Copy/ftp/whatever them to your development web site. + 3. Using a browser, run phpMyEditSetup.php to log on + to your MySQL server. + 4. Select a database, table and table key. + 5. Script phpMyEditSetup.php will attempt to write one file + and it will also display that file on the screen. + 6. If the file write to the directory where the files were to be + written fails, copy it into your PHP editor, save it to a file, + and then run it in the same directory that you used for + phpMyEdit.class.php file. + + Portions of the generated PHP file are commented and described. + However phpMyEdit has amount of available features, so if there is + anything you do not understand, look into official phpMyEdit + documentation. + +3. Documentation + + phpMyEdit comes with extensive and exhaustive documentation in SGML, + HTML and PDF format with huge amount of options, possibilities and + information described. It is available for download as a separate + package from phpMyEdit homepage or its project management page. + +4. Homepage and download + + The official phpMyEdit homepage is: + http://www.phpMyEdit.org + + The phpMyEdit project management page is: + http://platon.sk/projects/main_page.php?project_id=5 + + You can download the latest version in "Download" sections + of these pages. + +5. Bug reporting and support + + I'm happy to accept bug reports, feature requests, suggestions for + improvement, or improved code, preferably via our Platon.SK project + management interface where everyone can see them. + + If you are submitting a bug report, please include the main table + schema (mysqldump -d [database_name] [table_name]), schema for + supporting ['values']['table'] tables, and the contents of the + generated PHP file in your bug report. Also be sure to strip out + database host/user/password info from the generated file. + + There is also discussion forum available for asking support + questions or brainstorming about new features. phpMyEdit has also + its own mailinglist and CVS repository. All these issues are + described in official documentation. + + Commercial support is also available; see http://phpMyEdit.org + for more detailed information. + +6. Developers + + This project was the brain child of John McCreesh who has now moved + on to other, more pressing projects. Mr. McCreesh had the foresight + and fortitude to put together an excellent framework. Second project + maintainer was Jim Kraai who puts a lot of wonderful feature basis + and continues development in created framework. + + Many thanks to all those who have contributed code, notes or bug + reports. Special thanks belongs to Pau Aliagas + who converted phpMyEdit to PHP class in version 3.0. + + Current maintainer is Ondrej Jombik with help from various phpMyEdit + community contributors. See doc/ChangeLog for credits. + +7. License + + phpMyEdit is open-source released under GNU: General Public License; + see doc/COPYING file for more information. + + Commercial licensing for closed source projects is also possible; + see http://phpMyEdit.org website for more information. + +8. Other information + + This README file was initialy written by John McCreesh, updated by + Jim Kraai in 3rd December 2001 and updated by Ondrej Jombik in 24th + September 2002 and 12th February 2003. + + If you find any typo or grammar mistake in this document, feel free + to send me notice and correction. + diff --git a/doc/TESTS b/doc/TESTS new file mode 100644 index 0000000..d7a32bb --- /dev/null +++ b/doc/TESTS @@ -0,0 +1,13 @@ +If you have some time, I will appreciate if you could perform some tests to +ensure that phpMyEdit is working right with every table. + +[1] Access generated script. Press "Search". Remember number of displayed +records and the whole look of the page. Now press "Query". The page should look +the same (of course except thing, that filter is opened) and the number of +displayed record should not change. + +[2] Ensure you have $opts['display']['query'] enabled. Access generated script. +Make some filtering. Click on the "Clear" link in the query line. You will be +purpously moved to the first page. Click on the "Next". You should get the page +no. 2. + diff --git a/doc/TODO b/doc/TODO new file mode 100644 index 0000000..6e682ba --- /dev/null +++ b/doc/TODO @@ -0,0 +1,136 @@ +phpMyEdit TODO list +------------------- + +* change SQL table aliases from "TableN" to "phpMyEdit_table_alias_N" or + something similar + - done with "PMEtableN" and "PMEjoinN" for lookup tables +* filter should be allowed only if $opts['options'] contains 'F' +- multi-part date handling + - finish converting date handling to internal date handling functions + - abstract date field gathering to get rid of _many_ redundant lines of code + - there was some kludged fix for dateformat'ting where '%'s are removed + - better support for more date format macros + - better documentation for valid date format macros +- aggregates - firstly make specification and than implement such feature(s) +- data validation: expand JS field validation to match JS regexes +- data validation: create PHP field validation to match PHP regexes + +* do_add_record() triggers - change $vals_ori to $vals and $vals to $vals_quoted + - $vals_ori changed to $values +* do_add_record() triggers - make $vals available also in "before" trigger + +- template based control of add/change/copy/view/delete record page; maybe also + control of list page +* add ['display']['form'] parameter to control HTML and tag; + policy for this: if missing => display form, if not and true => display form, + if not missing and false => do not display form + +* array compatible "sort_field" option to have possibility of default sorting + according to more than one table column +* fix sorting problem when using table lookup with divs (separator) +* if picture/text links enabled, use texts for filter/search/hide buttons +* create URL links also in record view/delete + +- fix this: `filters' option works fine, but when there is column with the same + name in main table and also in join table, it must be prefixed by table alias + (TableX.); prefixation with table name of course does not work; maybe note + should be added into this option to use aliases, because this is difficult to + fix without CPU expensive SQL parser +* add original variables which will persist whole session support + - implemented via ['cgi']['persist'] +* reimplement actionStyle to have possibility spefify where you want navigation + buttons (up, down or both) and/or image/text action links +* implement repeating save in change operation (after repeating save is change + record displayed again instead of table listing) + - "Apply" function works fine +* extend patch from Shaun Johnston and add divs['-1'] to implement prefix and + divs[$n + 1] to implement postfix + + +* what is difference between default_sort_columns and sort_field + - not important now, default_sort_columns remove and sort_field brings amount + of usable features, check doc/ChangeLog file for more information +* after save of records, fields are incorrectly displayed (in example + Description field in Authors is showed) + - nasty bug created in 4.x, fixed and works fine +* URLtarget to specify URL target + +* links and buttons - booth used for records manipulating is not good + idea? + - good idea, implemented, use `navigation' option key for this +* when using images or links instead of buttons, change and delete links + are constructed with English words (not national): + http://example.com/authors.php?sfn=0&fl=0&fm=0&operation=Change&rec=1 + http://example.com/authors.php?sfn=0&fl=0&fm=0&operation=Delete&rec=1 + Than it is impossible to change or delete record via links. Other + functions such as view and copy works well. + - fixed, works fine + +* images should be transparent, and not GIFs but PNGs ++ path prefix specification to graphic image styles ++ default sort columns are cool, but is there a way to specify + descending ordering? In this case empty strings goes first and + I want them at the end of list + +* value of 0 in number of records to display on the screen will cause + "Division by zero" error; so this should have the same functionality + as -1 (display all records) + - fixed + +* according to language uand settings use htmlentities() + or htmlspecialchars() + - problematic htmlentities() is not used anymore + ++ abbility to take more than one column from external table when using + optional description field; + Example: + I have a table of authors with surname and firstname fields. + I have also table of articles with author_id field. + I want during adding new article to select from authors, but not only + by surname, but by both, surname and firstname. + Posible solutions: + 1. specify one field '@concat(surname, ', ', firstname) + 2. specify by array + Although this seems to be difficult to implement. + ++ ability to resize set of values from external table about value 'not set' + Example: + I have table of organizations. + I have table of users with organization_id field. + Every user may be in organization, but he/she mustn't. + So I wanted to select from organization table names or select nothing and + than organization_id will be 0. + - implemented via ['values2'] + ++ security hole with View (remove View ability and use operation=View, it will + also give you a view ability) + - should be checked ++ the same with Change (after saving, records will be surprisingly added) + - should be fixed + +* allow to set CSS's clases for (odd and even), , , , etc +- multiple primary key support +- M:N joins support and similary sets support ++ allow to select any combination of description columns when makes join; eval() + should be used for this purpose to allow also some simple data transforming + - implemented via ['description']['columns'] and ['description']['divs'] + but should be re-thought and changed +* $inc sets to 0 means unlimited + +* implementation of view action - requires change of $labels, but it is + neccessary +* column ability to be showed and read-only in add/edit screen + (example of use: description column of property/config table) ++ fix page number after search (that means: I'm on page 4/50, I search for + some records and result is a few in example 5 records, all of these 5 records + are able to fill 1 page, but I will be after search on page 4/1 - that's + really strange) + - need testing +* fast moving between list pages (pulldown menu with page numbers) ++ $where variable in options to specify where clausule for working only + with subset of data + - to have ability of setting up particular filter anc do not need to enter + filtering value in add or other forms +- data removing protection - delete will only mark record as deleted + - hint: can be handled in triggers, however no one have this tested yet + diff --git a/doc/VERSION b/doc/VERSION new file mode 100644 index 0000000..64ff7de --- /dev/null +++ b/doc/VERSION @@ -0,0 +1 @@ +5.7.1 diff --git a/domains.php b/domains.php new file mode 100644 index 0000000..7c9ff78 --- /dev/null +++ b/domains.php @@ -0,0 +1,184 @@ + true, + 'query' => true, + 'sort' => true, + 'time' => true, + 'tabs' => true +); + +// Set default prefixes for variables +$opts['js']['prefix'] = 'PME_js_'; +$opts['dhtml']['prefix'] = 'PME_dhtml_'; +$opts['cgi']['prefix']['operation'] = 'PME_op_'; +$opts['cgi']['prefix']['sys'] = 'PME_sys_'; +$opts['cgi']['prefix']['data'] = 'PME_data_'; + +/* Get the user's default language and use it if possible or you can + specify particular one you want to use. Refer to official documentation + for list of available languages. */ +$opts['language'] = $_SERVER['HTTP_ACCEPT_LANGUAGE'] . '-UTF8'; + +/* Table-level filter capability. If set, it is included in the WHERE clause + of any generated SELECT statement in SQL query. This gives you ability to + work only with subset of data from table. + +$opts['filters'] = "column1 like '%11%' AND column2<17"; +$opts['filters'] = "section_id = 9"; +$opts['filters'] = "PMEtable0.sessions_count > 200"; +*/ + +/* Field definitions + +Fields will be displayed left to right on the screen in the order in which they +appear in generated list. Here are some most used field options documented. + +['name'] is the title used for column headings, etc.; +['maxlen'] maximum length to display add/edit/search input boxes +['trimlen'] maximum length of string content to display in row listing +['width'] is an optional display width specification for the column + e.g. ['width'] = '100px'; +['mask'] a string that is used by sprintf() to format field output +['sort'] true or false; means the users may sort the display on this column +['strip_tags'] true or false; whether to strip tags from content +['nowrap'] true or false; whether this field should get a NOWRAP +['select'] T - text, N - numeric, D - drop-down, M - multiple selection +['options'] optional parameter to control whether a field is displayed + L - list, F - filter, A - add, C - change, P - copy, D - delete, V - view + Another flags are: + R - indicates that a field is read only + W - indicates that a field is a password field + H - indicates that a field is to be hidden and marked as hidden +['URL'] is used to make a field 'clickable' in the display + e.g.: 'mailto:$value', 'http://$value' or '$page?stuff'; +['URLtarget'] HTML target link specification (for example: _blank) +['textarea']['rows'] and/or ['textarea']['cols'] + specifies a textarea is to be used to give multi-line input + e.g. ['textarea']['rows'] = 5; ['textarea']['cols'] = 10 +['values'] restricts user input to the specified constants, + e.g. ['values'] = array('A','B','C') or ['values'] = range(1,99) +['values']['table'] and ['values']['column'] restricts user input + to the values found in the specified column of another table +['values']['description'] = 'desc_column' + The optional ['values']['description'] field allows the value(s) displayed + to the user to be different to those in the ['values']['column'] field. + This is useful for giving more meaning to column values. Multiple + descriptions fields are also possible. Check documentation for this. +*/ + +$opts['fdd']['domainid'] = array( + 'name' => 'Domainid', + 'select' => 'T', + 'options' => 'AVCPDR', // auto increment + 'maxlen' => 20, + 'default' => '0', + 'sort' => true +); +$opts['fdd']['domain'] = array( + 'name' => 'Domain', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => true +); +$opts['fdd']['rsp'] = array( + 'name' => 'Rsp', + 'select' => 'T', + 'maxlen' => 20, + 'sort' => true +); +$opts['fdd']['registrar'] = array( + 'name' => 'Registrar', + 'select' => 'T', + 'maxlen' => 20, + 'sort' => true +); +$opts['fdd']['whoisglue'] = array( + 'name' => 'Whoisglue', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => true +); +$opts['fdd']['dnshosts'] = array( + 'name' => 'Dnshosts', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => true +); +$opts['fdd']['mxhosts'] = array( + 'name' => 'Mxhosts', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => true +); +$opts['fdd']['web'] = array( + 'name' => 'Web', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => true +); + +// Now important call to phpMyEdit +require_once 'phpMyEdit.class.php'; +new phpMyEdit($opts); + +?> + diff --git a/editinvoicelines.php b/editinvoicelines.php new file mode 100644 index 0000000..df8fe92 --- /dev/null +++ b/editinvoicelines.php @@ -0,0 +1,208 @@ + + + + + Items to invoice + + + +

Items to invoice

+ true, + 'query' => true, + 'sort' => true, + 'time' => true, + 'tabs' => true +); + +// Set default prefixes for variables +$opts['js']['prefix'] = 'PME_js_'; +$opts['dhtml']['prefix'] = 'PME_dhtml_'; +$opts['cgi']['prefix']['operation'] = 'PME_op_'; +$opts['cgi']['prefix']['sys'] = 'PME_sys_'; +$opts['cgi']['prefix']['data'] = 'PME_data_'; + +/* Get the user's default language and use it if possible or you can + specify particular one you want to use. Refer to official documentation + for list of available languages. */ +$opts['language'] = $_SERVER['HTTP_ACCEPT_LANGUAGE'] . '-UTF8'; + +/* Table-level filter capability. If set, it is included in the WHERE clause + of any generated SELECT statement in SQL query. This gives you ability to + work only with subset of data from table. + +$opts['filters'] = "column1 like '%11%' AND column2<17"; +$opts['filters'] = "section_id = 9"; +$opts['filters'] = "PMEtable0.sessions_count > 200"; +*/ + +/* Field definitions + +Fields will be displayed left to right on the screen in the order in which they +appear in generated list. Here are some most used field options documented. + +['name'] is the title used for column headings, etc.; +['maxlen'] maximum length to display add/edit/search input boxes +['trimlen'] maximum length of string content to display in row listing +['width'] is an optional display width specification for the column + e.g. ['width'] = '100px'; +['mask'] a string that is used by sprintf() to format field output +['sort'] true or false; means the users may sort the display on this column +['strip_tags'] true or false; whether to strip tags from content +['nowrap'] true or false; whether this field should get a NOWRAP +['select'] T - text, N - numeric, D - drop-down, M - multiple selection +['options'] optional parameter to control whether a field is displayed + L - list, F - filter, A - add, C - change, P - copy, D - delete, V - view + Another flags are: + R - indicates that a field is read only + W - indicates that a field is a password field + H - indicates that a field is to be hidden and marked as hidden +['URL'] is used to make a field 'clickable' in the display + e.g.: 'mailto:$value', 'http://$value' or '$page?stuff'; +['URLtarget'] HTML target link specification (for example: _blank) +['textarea']['rows'] and/or ['textarea']['cols'] + specifies a textarea is to be used to give multi-line input + e.g. ['textarea']['rows'] = 5; ['textarea']['cols'] = 10 +['values'] restricts user input to the specified constants, + e.g. ['values'] = array('A','B','C') or ['values'] = range(1,99) +['values']['table'] and ['values']['column'] restricts user input + to the values found in the specified column of another table +['values']['description'] = 'desc_column' + The optional ['values']['description'] field allows the value(s) displayed + to the user to be different to those in the ['values']['column'] field. + This is useful for giving more meaning to column values. Multiple + descriptions fields are also possible. Check documentation for this. +*/ + +$opts['fdd']['invoicelineid'] = array( + 'name' => 'Invoicelineid', + 'select' => 'C', + 'options' => 'AVCPDR', // auto increment + 'maxlen' => 20, + 'default' => '0', + 'sort' => false +); +$opts['fdd']['invoiceid'] = array( + 'name' => 'Invoice', + 'select' => 'N', + 'options' => 'LFAVCPDR', + 'maxlen' => 20, + 'sqlw' => 'IF(CAST($val_qas AS DECIMAL) = 0, NULL, CAST($val_qas AS DECIMAL))', // Only store value if it is a value + 'sort' => true +); +$opts['fdd']['customerid'] = array( + 'name' => 'Customer', + 'select' => 'T', + 'maxlen' => 20, + 'values' => array( + 'table' => 'customers', + 'column' => 'customerid', + 'description' => 'customername' + ), + 'sort' => true +); +$opts['fdd']['subscriptionid'] = array( + 'name' => 'Subscription', + 'input' => 'R', + 'select' => 'T', + 'maxlen' => 20, + 'sort' => true +); +$opts['fdd']['description'] = array( + 'name' => 'Description', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => true +); +$opts['fdd']['invoicelinedate'] = array( + 'name' => 'Invoicelinedate', + 'select' => 'T', + 'maxlen' => 10, + 'sort' => true +); +$opts['fdd']['amount'] = array( + 'name' => 'Amount', + 'select' => 'T', + 'maxlen' => 12, + 'sort' => true +); +$opts['fdd']['charge'] = array( + 'name' => 'Charge', + 'select' => 'T', + 'maxlen' => 12, + 'sort' => true +); + +// Now important call to phpMyEdit +require_once 'phpMyEdit.class.php'; +new phpMyEdit($opts); + +?> + + + + diff --git a/editinvoices.php b/editinvoices.php new file mode 100644 index 0000000..48a8024 --- /dev/null +++ b/editinvoices.php @@ -0,0 +1,209 @@ + + + + + Items to invoice + + + +

Generated invoices

+ true, + 'query' => true, + 'sort' => true, + 'time' => true, + 'tabs' => true +); + +// Set default prefixes for variables +$opts['js']['prefix'] = 'PME_js_'; +$opts['dhtml']['prefix'] = 'PME_dhtml_'; +$opts['cgi']['prefix']['operation'] = 'PME_op_'; +$opts['cgi']['prefix']['sys'] = 'PME_sys_'; +$opts['cgi']['prefix']['data'] = 'PME_data_'; + +/* Get the user's default language and use it if possible or you can + specify particular one you want to use. Refer to official documentation + for list of available languages. */ +$opts['language'] = $_SERVER['HTTP_ACCEPT_LANGUAGE'] . '-UTF8'; + +/* Table-level filter capability. If set, it is included in the WHERE clause + of any generated SELECT statement in SQL query. This gives you ability to + work only with subset of data from table. + +$opts['filters'] = "column1 like '%11%' AND column2<17"; +$opts['filters'] = "section_id = 9"; +$opts['filters'] = "PMEtable0.sessions_count > 200"; +*/ + +/* Field definitions + +Fields will be displayed left to right on the screen in the order in which they +appear in generated list. Here are some most used field options documented. + +['name'] is the title used for column headings, etc.; +['maxlen'] maximum length to display add/edit/search input boxes +['trimlen'] maximum length of string content to display in row listing +['width'] is an optional display width specification for the column + e.g. ['width'] = '100px'; +['mask'] a string that is used by sprintf() to format field output +['sort'] true or false; means the users may sort the display on this column +['strip_tags'] true or false; whether to strip tags from content +['nowrap'] true or false; whether this field should get a NOWRAP +['select'] T - text, N - numeric, D - drop-down, M - multiple selection +['options'] optional parameter to control whether a field is displayed + L - list, F - filter, A - add, C - change, P - copy, D - delete, V - view + Another flags are: + R - indicates that a field is read only + W - indicates that a field is a password field + H - indicates that a field is to be hidden and marked as hidden +['URL'] is used to make a field 'clickable' in the display + e.g.: 'mailto:$value', 'http://$value' or '$page?stuff'; +['URLtarget'] HTML target link specification (for example: _blank) +['textarea']['rows'] and/or ['textarea']['cols'] + specifies a textarea is to be used to give multi-line input + e.g. ['textarea']['rows'] = 5; ['textarea']['cols'] = 10 +['values'] restricts user input to the specified constants, + e.g. ['values'] = array('A','B','C') or ['values'] = range(1,99) +['values']['table'] and ['values']['column'] restricts user input + to the values found in the specified column of another table +['values']['description'] = 'desc_column' + The optional ['values']['description'] field allows the value(s) displayed + to the user to be different to those in the ['values']['column'] field. + This is useful for giving more meaning to column values. Multiple + descriptions fields are also possible. Check documentation for this. +*/ + +$opts['fdd']['invoicelineid'] = array( + 'name' => 'Invoicelineid', + 'select' => 'C', + 'options' => 'AVCPDR', // auto increment + 'maxlen' => 20, + 'default' => '0', + 'sort' => false +); +$opts['fdd']['invoiceid'] = array( + 'name' => 'Invoice', + 'select' => 'N', + 'options' => 'LFAVCPDR', + 'maxlen' => 20, + 'sqlw' => 'IF(CAST($val_qas AS DECIMAL) = 0, NULL, CAST($val_qas AS DECIMAL))', // Only store value if it is a value + 'sort' => true +); +$opts['fdd']['customerid'] = array( + 'name' => 'Customer', + 'select' => 'T', + 'maxlen' => 20, + 'values' => array( + 'table' => 'customers', + 'column' => 'customerid', + 'description' => 'customername' + ), + + 'sort' => true +); +$opts['fdd']['subscriptionid'] = array( + 'name' => 'Subscription', + 'input' => 'R', + 'select' => 'T', + 'maxlen' => 20, + 'sort' => true +); +$opts['fdd']['description'] = array( + 'name' => 'Description', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => true +); +$opts['fdd']['invoicelinedate'] = array( + 'name' => 'Invoicelinedate', + 'select' => 'T', + 'maxlen' => 10, + 'sort' => true +); +$opts['fdd']['amount'] = array( + 'name' => 'Amount', + 'select' => 'T', + 'maxlen' => 12, + 'sort' => true +); +$opts['fdd']['charge'] = array( + 'name' => 'Charge', + 'select' => 'T', + 'maxlen' => 12, + 'sort' => true +); + +// Now important call to phpMyEdit +require_once 'phpMyEdit.class.php'; +new phpMyEdit($opts); + +?> + + + + diff --git a/extensions/phpMyEdit-mce-cal.class.php b/extensions/phpMyEdit-mce-cal.class.php new file mode 100644 index 0000000..054122b --- /dev/null +++ b/extensions/phpMyEdit-mce-cal.class.php @@ -0,0 +1,509 @@ +, London, UK + * Contribution of Ezudin Kurtowich , Sarajevo + * Copyright (c) 2003-2006 Platon Group, http://platon.sk/ + * All rights reserved. + * + * Updated 28th Jul 2005 + * + * Updated to use TinyMCE instead of HTMLArea + * Updated to handle multiple tabs and to use PME prefixes. + * Updated to include sub-form patch + * + * + * + * See README file for more information about this software. + * See COPYING file for license information. + * + * Download the latest version from + * http://platon.sk/projects/phpMyEdit/ + */ + +/* $Platon: phpMyEdit/extensions/phpMyEdit-mce-cal.class.php,v 1.6 2006-09-16 18:43:47 nepto Exp $ */ + +/* + OVERVIEW + -------- + + mce_cal extends the standard phpMyEdit class to allow + a calendar popup helper to be put on any text field and for any textarea + field to turned into an HTML editor. + This extension uses the free jsCalendar from http://dynarch.com/mishoo + and the TinyMCE code from http://tinymce.moxiecode.com/ + + REQUIREMENTS + ------------ + + The requirement is a properly installed jsCalendar and TinyMCE script. + All browsers supported by these scripts are supported by this + extension. Note that version 1.44 or later for TinyMCE is required. + + USAGE + ----- + + For both features: + + 1. Call to phpMyEdit-mce-cal.class.php instead + of phpMyEdit.class.php. + + Example: + + require_once 'extensions/phpMyEdit-mce-cal.class.php'; + new phpMyEdit_mce_cal($opts); + + + + HTML TextArea + + This enables WYSIWYG editing of a textarea field. + In order to use it, you should: + + 1. Load TinyMCE script in the ... section of your + phpMyEdit calling program as described in the htmlarea manual. + + + + + + + where 'js/' is the path to the javascript code + + NOTES: + A. The PME implementation uses the "specific_textareas" mode - this + must always be set + + B. Due to a bug in Mozilla, if any of the textareas being used as HTML + editors are in tabs and are initially hidden, the width and height + need to be specified in the tinyMCE initialization and + 'auto_reset_designmode' must be set to 'true': + + tinyMCE.init({ + mode : "specific_textareas", + auto_reset_designmode : true, + width: "800", + height: "200" + }); + + 2. Add 'html'=>true parameter to the textarea field definition + in your phpMyEdit calling program. + + Example: + + $opts['fdd']['col_name'] = array( + 'name' => 'Column', + 'select' => 'T', + 'options' => 'ACPVD', + 'required' => true, + 'textarea' => array( + 'html' => true, + 'rows' => 11, + 'cols' => 81) + ); + + 3. It is also possible to have multiple text area formats on the same + form. This is done by specifying a text tag for the textarea: + + $opts['fdd']['col_name'] = array( + 'name' => 'Column', + 'select' => 'T', + 'options' => 'ACPVD', + 'required' => true, + 'textarea' => array( + 'html' => 'format1', + 'rows' => 11, + 'cols' => 81) + ); + + You then need to initialize TinyMCE in the header to recognize all of + the tags used in the textareas. + + EXAMPLE + In the following, two formats of tinyMCE editor are defined. + + This example is the default, and will be used for any fields where + 'html' is set to true. + + tinyMCE.init({ + mode : "specific_textareas", + auto_reset_designmode : true + }); + + This second example has an extra parameter, 'textarea_trigger', which is + set to the text tag given to the textarea in PME with 'mce_' prepended + to it. + + tinyMCE.init({ + mode : "specific_textareas", + auto_reset_designmode : true, + textarea_trigger : "mce_format1", + theme : "advanced", + width: "800", + height: "200", + plugins : "table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,zoom,flash,searchreplace,print", + theme_advanced_buttons1_add_before : "save,separator", + theme_advanced_buttons1_add : "fontselect,fontsizeselect", + theme_advanced_buttons2_add : "separator,insertdate,inserttime,preview,zoom,separator,forecolor,backcolor", + theme_advanced_buttons2_add_before: "cut,copy,paste,separator,search,replace,separator", + theme_advanced_buttons3_add_before : "tablecontrols,separator", + theme_advanced_buttons3_add : "emotions,iespell,flash,advhr,separator,print", + theme_advanced_toolbar_location : "top", + theme_advanced_toolbar_align : "left", + theme_advanced_path_location : "bottom", + content_css : "example_full.css", + plugin_insertdate_dateFormat : "%Y-%m-%d", + plugin_insertdate_timeFormat : "%H:%M:%S", + extended_valid_elements : "a[name|href|target|title|onclick],img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name],hr[class|width|size|noshade],font[face|size|color|style],span[class|align|style]" + + }); + + So: + 'html' => 'format1' maps to textarea_trigger : "mce_format1" + 'html' => 'foo' maps to textarea_trigger : "mce_foo" + 'html' => 'bar' maps to textarea_trigger : "mce_bar" + + You can initialize TinyMCE as many times as you need to give you as many + editor formats as you need. + + CALENDAR + + This extension enables the display of a popup calendar selection + against selected fields. + + In order to use it, you should: + + 1. Load the jsCalendar scripts in the ... section of + your phpMyEdit calling program, substituting the correct paths: + + + + + + 2. Choose your preferred jsCalendar CSS file (see jsCalendar + documentation) and add the following in the ... + section of your phpMyEdit calling program, substituting the + correct path: + + + + 3. Add 'calendar' parameter to the field definitions where you + want a calendar popup in your phpMyEdit calling program. + + Example: + + $opts['fdd']['col_name'] = array( + 'name' => 'Column', + 'select' => 'T', + 'options' => 'ACPVD', + 'required' => true, + 'calendar' => true + ); + + This is will display a button next to the field which pops up + a calendar when clicked. If that field has a 'strftimemask' + parameter set, it will use this for the date format. + + For more advanced usage, you can set the 'calendar' parameter + to an array of valid jsCalendar Calendar.setup options + (see jSCalendar document for details). Note that not all + of these options make sense to use in phpMyEdit, and some + of them will actively break the function. + + Example: + + $opts['fdd']['col_name'] = array( + 'name' => 'Column', + 'select' => 'T', + 'options' => 'ACPVD', + 'required' => true, + 'calendar' => array( + 'ifFormat' => '%Y/%m/%d', // defaults to the ['strftimemask'] + 'firstDay' => 1, // 0 = Sunday, 1 = Monday + 'singleClick' => true, // single or double click to close + 'weekNumbers' => true, // Show week numbers + 'showsTime' => false, // Show time as well as date + 'timeFormat' => '24', // 12 or 24 hour clock + 'button' => true, // Display button (rather then clickable area) + 'label' => '...', // button label (used by phpMyEdit) + 'date' => '2003-12-19 10:00' // Initial date/time for popup + // (see notes below) + ) + ); + + NOTES + ----- + + 1. The popup will normally set the initial value to the current + field value or to current date/time. 'date' option will always + override this, even if there is a current date/time value + in the field. If you want a default value only if the field + is currently empty, use the phpMyEdit 'default' option. + + 2. Only the options listed above may be set by the user, any other + options will be ignored. + + 3. The 'label' option can contain HTML markup which will be displayed as + the button/clickable area to pull up the calendar + + SEARCH KEYWORD + -------------- + + Search for "htmlcal" string in this source code, + to find all extension related modifications. +*/ + +require_once dirname(__FILE__).'/../phpMyEdit.class.php'; + +class phpMyEdit_mce_cal extends phpMyEdit +{ + /* calendar mod start */ + + var $calendars; // Array for collecting list of fields with calendar popups + + /* Array of valid options for passing to Calendar.setup */ + var $valid_opts = array( + 'button','ifFormat','singleClick','firstDay', + 'weekNumbers','showsTime','timeFormat','date' + ); + + /** + * Checks to see if the calendar parameter is set on the field + * + * @param k current field name + * @param curval current value of field (set to null for default) + * + * If the calendar parameter is set on the field, this function displays + * the button. It then pushes the Calendar.setup parameters into an array, + * including the user specified ones in the calling program is they exist. + * This array is then added to the $calendars array indexed by the field + * name. This allows for multiple fields with calendar popups. + */ + function calPopup_helper($k, $curval) /* {{{ */ + { + if (@$this->fdd[$k]['calendar']) { + $cal_ar['ifFormat'] = '%Y-%m-%d %H:%M'; + $cal_ar['showsTime'] = true; + $cal_ar['singleClick'] = false; + if (isset($curval)) { + if (substr($curval, 0, 4) != '0000') + $cal_ar['date'] = $curval; + } + if (isset($this->fdd[$k]['strftimemask'])) { + $cal_ar['ifFormat'] = $this->fdd[$k]['strftimemask']; + } + if (is_array($this->fdd[$k]['calendar'])) { + foreach($this->fdd[$k]['calendar'] as $ck => $cv) { + $cal_ar[$ck] = $cv; + } + } + $cal_ar['button'] = $this->dhtml['prefix'].'calbutton_'.$this->fds[$k]; + $this->calendars[$this->fds[$k]] = $cal_ar; + + $label = @$this->fdd[$k]['calendar']['label']; + strlen($label) || $label = '...'; + + $do_button = true; + if (isset($this->fdd[$k]['calendar']['button'])) { + $do_button = $this->fdd[$k]['calendar']['button']; + }; + + if ($do_button) { + echo ''; + } else { + echo '',$label,''; + } + } + } /* }}} */ + + /* calendar mod end */ + + function display_add_record() /* {{{ */ + { + for ($tab = 0, $k = 0; $k < $this->num_fds; $k++) { + if (isset($this->fdd[$k]['tab']) && $this->tabs_enabled() && $k > 0) { + $tab++; + echo '
',"\n"; + echo '',"\n"; + echo '
',"\n"; + echo '',"\n"; + } + if (! $this->displayed[$k]) { + continue; + } + if ($this->hidden($k)) { + echo $this->htmlHiddenData($this->fds[$k], $this->fdd[$k]['default']); + continue; + } + $css_postfix = @$this->fdd[$k]['css']['postfix']; + $css_class_name = $this->getCSSclass('input', null, 'next', $css_postfix); + echo '',"\n"; + echo '',"\n"; + echo '',"\n"; + if ($this->guidance) { + $css_class_name = $this->getCSSclass('help', null, true, $css_postfix); + $cell_value = $this->fdd[$k]['help'] ? $this->fdd[$k]['help'] : ' '; + echo '',"\n"; + } + echo '',"\n"; + } + } /* }}} */ + + function display_change_field($row, $k) /* {{{ */ + { + $css_postfix = @$this->fdd[$k]['css']['postfix']; + $css_class_name = $this->getCSSclass('input', null, true, $css_postfix); + echo '',"\n"; + } /* }}} */ + + function form_end() /* {{{ */ + { + if ($this->display['form']) { + echo '',"\n"; + + /* calendar mod start */ + + /* Add script calls to the end of the form for all fields + with calendar popups. */ + if (isset($this->calendars)) { + echo '',"\n"; + }; + /* calendar mod end */ + }; + } /* }}} */ + +} + +?> diff --git a/extensions/phpMyEdit-report.class.php b/extensions/phpMyEdit-report.class.php new file mode 100644 index 0000000..6df0416 --- /dev/null +++ b/extensions/phpMyEdit-report.class.php @@ -0,0 +1,319 @@ + + * Copyright (c) 2002-2006 Platon Group, http://platon.sk/ + * All rights reserved. + * + * See README file for more information about this software. + * See COPYING file for license information. + * + * Download the latest version from + * http://platon.sk/projects/phpMyEdit/ + */ + +/* $Platon: phpMyEdit/extensions/phpMyEdit-report.class.php,v 1.11 2004/12/30 19:59:00 nepto Exp $ */ + +/* Extension TODO: + + - allow user to enable/disable particular field in reporting (maybe 'X' flag + for indicating that field is forbidden is good idea) + - support for ['help'] in select fields screen + - make extension's option for selecting "Select fields" link or button + */ + +require_once dirname(__FILE__).'/../phpMyEdit.class.php'; + +class phpMyEdit_report extends phpMyEdit +{ + + function phpMyEdit_report($opts) /* {{{ */ + { + $opts['options'] = 'L'; + $execute = 1; + isset($opts['execute']) && $execute = $opts['execute']; + $opts['execute'] = 0; + parent::phpMyEdit($opts); + $execute && $this->execute(); + } /* }}} */ + + function make_language_labels($language) /* {{{ */ + { + $ret = parent::make_language_labels($language); + strlen($ret['Make report']) <= 0 && $ret['Make report'] = 'Make report'; + strlen($ret['Select fields']) <= 0 && $ret['Select fields'] = 'Select fields'; + strlen($ret['Records per screen']) <= 0 && $ret['Records per screen'] = 'Records per screen'; + return $ret; + } /* }}} */ + + function get_cgi_cookie_var($name, $default_value = null) /* {{{ */ + { + $ret = $this->get_cgi_var($name, null); + if ($ret === null) { + global $HTTP_COOKIE_VARS; + $ret = @$HTTP_COOKIE_VARS[$name.'_'.$this->tb.'_cookie']; + if (! isset($ret)) { + $ret = $default_value; + } + } + return $ret; + } /* }}} */ + + function display_list_table_buttons($total_recs, $position) /* {{{ */ + { /* This is mostly copy/paste from core class. */ + $listall = $this->inc <= 0; // Are we doing a listall? + echo '
'; + echo $this->fdd[$k]['name'],'getColAttributes($k),">\n"; + if ($this->col_has_values($k)) { + $vals = $this->set_values($k); + $selected = @$this->fdd[$k]['default']; + $multiple = $this->col_has_multiple_select($k); + $readonly = $this->readonly($k); + $strip_tags = true; + $escape = true; + echo $this->htmlSelect($this->cgi['prefix']['data'].$this->fds[$k], $css_class_name, + $vals, $selected, $multiple, $readonly, $strip_tags, $escape); + } elseif (isset ($this->fdd[$k]['textarea'])) { + echo '',"\n"; + } else { + // Simple edit box required + $size_ml_props = ''; + $maxlen = intval($this->fdd[$k]['maxlen']); + $size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size'] : min($maxlen, 60); + $size && $size_ml_props .= ' size="'.$size.'"'; + $maxlen && $size_ml_props .= ' maxlength="'.$maxlen.'"'; + echo 'password($k) ? 'type="password"' : 'type="text"'); + echo ($this->readonly($k) ? ' disabled' : ''); + /* calendar mod start */ + echo ' id="',$this->dhtml['prefix'].'fld_'.$this->fds[$k],'"'; + /* calendar mod end */ + echo ' name="',$this->cgi['prefix']['data'].$this->fds[$k],'"'; + echo $size_ml_props,' value="'; + echo htmlspecialchars($this->fdd[$k]['default']),'">'; + /* calendar mod start */ + /* Call htmlcal helper function */ + $this->calPopup_helper($k, null); + /* calendar mod end */ + } + echo '',$cell_value,'
getColAttributes($k),">\n"; + if ($this->col_has_values($k)) { + $vals = $this->set_values($k); + $multiple = $this->col_has_multiple_select($k); + $readonly = $this->readonly($k); + $strip_tags = true; + $escape = true; + echo $this->htmlSelect($this->cgi['prefix']['data'].$this->fds[$k], $css_class_name, + $vals, $row["qf$k"], $multiple, $readonly, $strip_tags, $escape); + } elseif (isset($this->fdd[$k]['textarea'])) { + echo '',"\n"; + } else { + $size_ml_props = ''; + $maxlen = intval($this->fdd[$k]['maxlen']); + $size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size'] : min($maxlen, 60); + $size && $size_ml_props .= ' size="'.$size.'"'; + $maxlen && $size_ml_props .= ' maxlength="'.$maxlen.'"'; + echo 'readonly($k) ? 'disabled ' : ''); + /* calendar mod start */ + echo ' id="',$this->dhtml['prefix'].'fld_'.$this->fds[$k],'"'; + /* calendar mod end */ + echo 'name="',$this->cgi['prefix']['data'].$this->fds[$k],'" value="'; + echo htmlspecialchars($row["qf$k"]),'" ',$size_ml_props,'>',"\n"; + /* calendar mod start */ + /* Call calPopup helper function */ + $this->calPopup_helper($k, htmlspecialchars($row["qf$k"])); + /* calendar mod end */ + } + echo '
',"\n"; + echo '',"\n"; + echo '',"\n"; + if (strlen(@$this->message) > 0) { + echo '',"\n"; + } + // Display page and records statistics + echo '
',"\n"; + echo ' '; + // Note that fm > 0 && ! $listall) ? '' : ' disabled'; + echo ' '; + $disabled = ($this->fm + $this->inc < $total_recs && ! $listall) ? '' : ' disabled'; + echo ''; + // Message is now written here + echo '',$this->message,'',"\n"; + if ($listall) { + echo $this->labels['Page'],': 1 ',$this->labels['of'],' 1'; + } else { + echo $this->labels['Page'],': ',($this->fm / $this->inc) + 1; + echo ' ',$this->labels['of'],' ',max(1, ceil($total_recs / abs($this->inc))); + } + echo '  ',$this->labels['Records'],': ',$total_recs; + echo '
',"\n"; + } /* }}} */ + + function display_report_selection_buttons($position) /* {{{ */ + { + echo '',"\n"; + echo '',"\n"; + echo '
',"\n"; + echo '',"\n"; + echo '
',"\n"; + } /* }}} */ + + function get_select_fields_link() /* {{{ */ + { + $link = '
'.$this->labels['Select fields'].''; + return $link; + } /* }}} */ + + function execute() /* {{{ */ + { + global $HTTP_GET_VARS; + global $HTTP_POST_VARS; + + /* + * Extracting field names + */ + + $table_cols = array(); + $all_table_cols = array(); + + if ($this->connect() == false) { + return false; + } + $query_parts = array( + 'type' => 'select', + 'select' => '*', + 'from' => $this->tb, + 'limit' => '1'); + $result = $this->myquery($this->get_SQL_query($query_parts), __LINE__); + $all_table_cols = array_keys(@mysql_fetch_array($result, MYSQL_ASSOC)); + if (count($all_table_cols) <= 0) { + $this->error('database fetch error'); + return false; + } + foreach (array_keys($this->fdd) as $field_name) { + if (preg_match('/^\d*$/', $field_name)) + continue; + if (($idx = array_search($field_name, $all_table_cols)) !== false) + $table_cols[$field_name] = mysql_field_len($result, $idx); + } + @mysql_free_result($result); + unset($all_table_cols); + + /* + * Preparing variables + */ + + $fields_select = $this->get_cgi_var('fields_select'); + $filter = $this->get_cgi_var('filter'); + $prepare_filter = $this->get_cgi_var('prepare_filter'); + $this->inc = intval($this->get_cgi_cookie_var('inc')); + $force_select = true; + $none_displayed = true; + $expire_time = time() + (3600 * 24 * 30 * 12 * 5); // five years + $headers_sent = @headers_sent(); + + foreach (array_merge(array('@inc'), array_keys($table_cols)) as $col) { + $varname = ($col[0] == '@' ? substr($col, 1) : 'have_'.$col); + if (isset($HTTP_POST_VARS[$varname]) || isset($HTTP_GET_VARS[$varname])) { + $value = $HTTP_POST_VARS[$varname]; + if (isset($HTTP_GET_VARS[$varname])) { + $value = $HTTP_GET_VARS[$varname]; + } + if ($varname != 'inc' && ! empty($value)) { + $force_select = false; + } + $headers_sent || setcookie($varname.'_'.$this->tb.'_cookie', $value, $expire_time); + $this->cgi['persist'] .= '&'.urlencode($varname); + $this->cgi['persist'] .= '='.urlencode($value); + } else { + $headers_sent || setcookie($varname.'_'.$this->tb.'_cookie', '', time() - 10000); + } + } + + $i = -1; + foreach (array_keys($this->fdd) as $key) { + $i++; + if (preg_match('/^\d*$/', $key)) + continue; + $varname = 'have_'.$key; + $value = @$this->get_cgi_cookie_var($varname, ''); + $options = @$value ? 'LV' : ''; + $this->fdd[$i]['options'] = $options; + $this->fdd[$key]['options'] = $options; + $this->displayed[$i] = @$value ? true : false; + $value && $none_displayed = false; + } + + /* + * Redirecting when neccessary + * (hackity hack with unregistering/unchecking fields) + */ + + if ($prepare_filter && ! $headers_sent) { + $this->execute_redirect(); + exit; + } + + /* + * Check if field selection report screen has to be displayed + */ + + if (isset($fields_select) || $force_select || $none_displayed) { + $this->execute_report_screen($table_cols); + return true; + } + + if (0) { + $this->message .= $this->get_select_fields_link(); + } + + // parent class call + return parent::execute(); + } /* }}} */ + + function execute_redirect() /* {{{ */ + { + global $HTTP_SERVER_VARS; + global $HTTP_GET_VARS; + global $HTTP_POST_VARS; + $redirect_url = 'http://'.$HTTP_SERVER_VARS['HTTP_HOST'].$HTTP_SERVER_VARS['SCRIPT_NAME']; + $delim = '?'; + foreach ($HTTP_POST_VARS + $HTTP_GET_VARS as $cgi_var_name => $cgi_var_value) { + $cgi_var_name == 'prepare_filter' && $cgi_var_name = 'filter'; + $redirect_url .= $delim; + $redirect_url .= rawurlencode($cgi_var_name).'='.rawurlencode($cgi_var_value); + $delim == '?' && $delim = '&'; + } + $redirect_url .= $this->cgi['persist']; + header('Location: '.$redirect_url); + exit; + } /* }}} */ + + function execute_report_screen($table_cols) /* {{{ */ + { + echo '
',"\n"; + if ($this->nav_up()) { + $this->display_report_selection_buttons('up'); + echo '
',"\n"; + } + echo '',"\n"; + + $i = 0; + foreach ($table_cols as $key => $val) { + $css_postfix = @$this->fdd[$key]['css']['postfix']; + $css_class_name = $this->getCSSclass('input', null, true, $css_postfix); + $varname = 'have_'.$key; + $value = $this->get_cgi_cookie_var($varname); + $checked = @$value ? ' checked' : ''; + echo '',"\n"; + echo '',"\n"; + echo '',"\n"; + echo '',"\n",'',"\n"; + $i++; + } + echo '',"\n"; + echo ''; + echo '',"\n"; + echo '
'; + echo $this->fdd[$i]['name'],''; + echo ''; + echo 'getColAttributes($key),">\n"; + $varname = 'qf'.$i; + $value = $this->get_cgi_cookie_var($varname); + if ($this->fdd[$key]['select'] == 'D' || $this->fdd[$key]['select'] == 'M') { + $from_table = ! $this->col_has_values($key) || isset($this->fdd[$key]['values']['table']); + $selected = $value; + $value = $this->set_values($key, array('*' => '*'), null, $from_table); + $multiple = $this->col_has_multiple_select($key); + $multiple |= $this->fdd[$key]['select'] == 'M'; + $readonly = false; + $strip_tags = true; + $escape = true; + echo $this->htmlSelect($varname.'_id', $css_class_name, $value, $selected, + $multiple, $readonly, $strip_tags, $escape); + } else { + echo ''; + } + echo '
'; + echo $this->labels['Records per screen'],''; + echo ''; + echo '
',"\n"; + if ($this->nav_down()) { + echo '
',"\n"; + $this->display_report_selection_buttons('down'); + } + echo '
'; + } /* }}} */ + +} + +/* Modeline for ViM {{{ + * vim:set ts=4: + * vim600:fdm=marker fdl=0 fdc=0: + * }}} */ + +?> diff --git a/extensions/phpMyEdit-slide.class.php b/extensions/phpMyEdit-slide.class.php new file mode 100644 index 0000000..fcc072b --- /dev/null +++ b/extensions/phpMyEdit-slide.class.php @@ -0,0 +1,121 @@ + + * Copyright (c) 2002-2006 Platon Group, http://platon.sk/ + * All rights reserved. + * + * See README file for more information about this software. + * See COPYING file for license information. + * + * Download the latest version from + * http://platon.sk/projects/phpMyEdit/ + */ + +/* $Platon: phpMyEdit/extensions/phpMyEdit-slide.class.php,v 1.11 2007-09-02 22:30:00 nepto Exp $ */ + +/* + * Coding elapsed time: from 8:30 to 10:30 at 30th October 2002 + * with heavy patching phpMyEdit core class. + * + * Music used: E-Type (Campione, This is the Way and others) + */ + +require_once dirname(__FILE__).'/../phpMyEdit.class.php'; + +class phpMyEdit_slide extends phpMyEdit +{ + // Extension options array + var $ext; + + function phpMyEdit_slide($opts) /* {{{ */ + { + $execute = 1; + isset($opts['execute']) && $execute = $opts['execute']; + $opts['execute'] = 0; + parent::phpMyEdit($opts); + + $this->ext = $opts['ext']; + + $execute && $this->execute($opts); + } /* }}} */ + + function execute($opts) /* {{{ */ + { + if ($this->get_sys_cgi_var('rec_change') + && ($this->next_operation() || $this->prev_operation())) { + $this->operation = $this->labels['Change']; + } + if (! $this->change_operation()) { + $this->operation = $this->labels['View']; + } + if ($this->prev_operation()) { + ! $this->ext['prev_disabled'] && $this->rec = $this->get_sys_cgi_var('rec_prev'); + $this->prev = ''; + } + if ($this->next_operation()) { + ! $this->ext['next_disabled'] && $this->rec = $this->get_sys_cgi_var('rec_next'); + $this->next = ''; + } + if (! $this->rec) { + $this->rec = $this->ext['rec']; + } + + if (! $this->rec + || (! $this->ext['prev_disable'] && ! $this->ext['prev']) + || (! $this->ext['next_disable'] && ! $this->ext['next'])) { + if ($this->connect() == false) { + return false; + } + $query_parts = array( + 'type' => 'select', + // XXX FIXME - simplify query + 'select' => 'PMEtable0.'.$this->key, + 'from' => $this->get_SQL_join_clause(), + 'where' => $this->get_SQL_where_from_query_opts()); + // TODO: order by clausule according to default sort order options + $res = $this->myquery($this->get_SQL_query($query_parts), __LINE__); + $ids = array(); + while (($row = @mysql_fetch_array($res, MYSQL_NUM)) !== false) { + $ids[] = $row[0]; + } + @mysql_free_result($res); + if ($this->rec) { + $idx = array_search($this->rec, $ids); + $idx === false && $idx = 0; + } else { + $idx = 0; + } + + $this->rec = $ids[$idx]; + ! $this->ext['prev'] && $this->ext['prev'] = $ids[$idx - 1]; + ! $this->ext['next'] && $this->ext['next'] = $ids[$idx + 1]; + } + + $this->default_buttons['V'] = array('change', 'cancel', + (isset($this->ext['prev']) ? '+prev' : 'prev'), + (isset($this->ext['next']) ? '+next' : 'next'), + array('code'=>''), + array('code'=>'') + ); + + $this->recreate_fdd(); + $this->recreate_displayed(); + parent::execute(); + } /* }}} */ + +} + +/* Modeline for ViM {{{ + * vim:set ts=4: + * vim600:fdm=marker fdl=0 fdc=0: + * }}} */ + +?> diff --git a/font/makefont.php b/font/makefont.php new file mode 100644 index 0000000..63d1801 --- /dev/null +++ b/font/makefont.php @@ -0,0 +1,6 @@ + diff --git a/fpdf16/FAQ.htm b/fpdf16/FAQ.htm new file mode 100755 index 0000000..ab38c1f --- /dev/null +++ b/fpdf16/FAQ.htm @@ -0,0 +1,339 @@ + + + + +FAQ + + + + +

FAQ

+ + +
    +
  • +

    1. What's exactly the license of FPDF? Are there any usage restrictions?

    +FPDF is released under a permissive license: there is no usage restriction. You may embed it +freely in your application (commercial or not), with or without modifications. +
  • + +
  • +

    2. When I try to create a PDF, a lot of weird characters show on the screen. Why?

    +These "weird" characters are in fact the actual content of your PDF. This behavior is a bug of +IE6. When it first receives an HTML page, then a PDF from the same URL, it displays it directly +without launching Acrobat. This happens frequently during the development stage: on the least +script error, an HTML page is sent, and after correction, the PDF arrives. +
    +To solve the problem, simply quit and restart IE. You can also go to another URL and come +back. +
    +To avoid this kind of inconvenience during the development, you can generate the PDF directly +to a file and open it through the explorer. +
  • + +
  • +

    3. I try to generate a PDF and IE displays a blank page. What happens?

    +First of all, check that you send nothing to the browser after the PDF (not even a space or a +carriage return). You can put an exit statement just after the call to the Output() method to +be sure. If it still doesn't work, it means you're a victim of the "blank page syndrome". IE +used in conjunction with the Acrobat plug-in suffers from many bugs. To avoid these problems +in a reliable manner, two main techniques exist: +
    +
    +- Disable the plug-in and use Acrobat as a helper application. To do this, launch Acrobat, go +to the Edit menu, Preferences, Internet, and uncheck "Display PDF in browser". Then, the next +time you load a PDF in IE, it displays the dialog box "Open it" or "Save it to disk". Uncheck +the option "Always ask before opening this type of file" and choose Open. From now on, PDF files +will open automatically in an external Acrobat window. +
    +The drawback of the method is that you need to alter the client configuration, which you can do +in an intranet environment but not for the Internet. +
    +
    +- Use a redirection technique. It consists in generating the PDF in a temporary file on the server +and redirect the client to it. For example, at the end of the script, you can put the following: +
    +
    //Determine a temporary file name in the current directory
    +$file = basename(tempnam('.', 'tmp'));
    +rename($file, $file.'.pdf');
    +$file .= '.pdf';
    +//Save PDF to file
    +$pdf->Output($file, 'F');
    +//Redirect
    +header('Location: '.$file);
    +
    +This method turns the dynamic PDF into a static one and avoids all troubles. But you have to do +some cleaning in order to delete the temporary files. For example: +
    +
    function CleanFiles($dir)
    +{
    +    //Delete temporary files
    +    $t = time();
    +    $h = opendir($dir);
    +    while($file=readdir($h))
    +    {
    +        if(substr($file,0,3)=='tmp' and substr($file,-4)=='.pdf')
    +        {
    +            $path = $dir.'/'.$file;
    +            if($t-filemtime($path)>3600)
    +                @unlink($path);
    +        }
    +    }
    +    closedir($h);
    +}
    +
    +This function deletes all files of the form tmp*.pdf older than an hour in the specified +directory. You may call it where you want, for example in the script which generates the PDF. +
  • + +
  • +

    4. I can't make line breaks work. I put \n in the string printed by MultiCell but it doesn't work.

    +You have to enclose your string with double quotes, not single ones. +
  • + +
  • +

    5. I try to display a variable in the Header method but nothing prints.

    +You have to use the global keyword to access global variables, for example: +
    +
    function Header()
    +{
    +    global $title;
    +
    +    $this->SetFont('Arial', 'B', 15);
    +    $this->Cell(0, 10, $title, 1, 1, 'C');
    +}
    +
    +$title = 'My title';
    +
    +Alternatively, you can use an object property: +
    +
    function Header()
    +{
    +    $this->SetFont('Arial', 'B', 15);
    +    $this->Cell(0, 10, $this->title, 1, 1, 'C');
    +}
    +
    +$pdf->title = 'My title';
    +
    +
  • + +
  • +

    6. I defined the Header and Footer methods in my PDF class but nothing appears.

    +You have to create an object from the PDF class, not FPDF: +
    +
    $pdf = new PDF();
    +
    +
  • + +
  • +

    7. Accented characters are replaced by some strange characters like é.

    +Don't use UTF-8 encoding. Standard FPDF fonts use ISO-8859-1 or Windows-1252. +It is possible to perform a conversion to ISO-8859-1 with utf8_decode(): +
    +
    $str = utf8_decode($str);
    +
    +But some characters such as Euro won't be translated correctly. If the iconv extension is available, the +right way to do it is the following: +
    +
    $str = iconv('UTF-8', 'windows-1252', $str);
    +
    +
  • + +
  • +

    8. I try to display the Euro symbol but it doesn't work.

    +The standard fonts have the Euro character at position 128. You can define a constant like this +for convenience: +
    +
    define('EURO', chr(128));
    +
    +
  • + +
  • +

    9. I get the following error when I try to generate a PDF: Some data has already been output, can't send PDF file

    +You must send nothing to the browser except the PDF itself: no HTML, no space, no carriage return. +You may have this other message just before:
    +
    +Warning: Cannot modify header information - headers already sent by (output started at script.php:X)
    +
    +It means that script.php outputs something at line X. Go to this line and fix it. +In case the warning doesn't show, add this at the very beginning of your script: +
    +
    ob_end_clean();
    +
    +If you still don't see it, disable zlib.output_compression in your php.ini. +
  • + +
  • +

    10. I draw a frame with very precise dimensions, but when printed I notice some differences.

    +To respect dimensions, select "None" for the Page Scaling setting instead of "Shrink to Printable Area" in the print dialog box. +
  • + +
  • +

    11. I'd like to use the whole surface of the page, but when printed I always have some margins. How can I get rid of them?

    +Printers have physical margins (different depending on the models); it is therefore impossible to remove +them and print on the whole surface of the paper. +
  • + +
  • +

    12. How can I put a background in my PDF?

    +For a picture, call Image() in the Header() method, before any other output. To set a background color, use Rect(). +
  • + +
  • +

    13. How can I set a specific header or footer on the first page?

    +Simply test the page number: +
    +
    function Header()
    +{
    +    if($this->PageNo()==1)
    +    {
    +        //First page
    +        ...
    +    }
    +    else
    +    {
    +        //Other pages
    +        ...
    +    }
    +}
    +
    +
  • + +
  • +

    14. I'd like to use extensions provided by different scripts. How can I combine them?

    +Use an inheritance chain. If you have two classes, say A in a.php: +
    +
    require('fpdf.php');
    +
    +class A extends FPDF
    +{
    +...
    +}
    +
    +and B in b.php: +
    +
    require('fpdf.php');
    +
    +class B extends FPDF
    +{
    +...
    +}
    +
    +then make B extend A: +
    +
    require('a.php');
    +
    +class B extends A
    +{
    +...
    +}
    +
    +and make your own class extend B: +
    +
    require('b.php');
    +
    +class PDF extends B
    +{
    +...
    +}
    +
    +$pdf = new PDF();
    +
    +
  • + +
  • +

    15. How can I send the PDF by email?

    +As any other file, but an easy way is to use PHPMailer and +its in-memory attachment: +
    +
    $mail = new PHPMailer();
    +...
    +$doc = $pdf->Output('', 'S');
    +$mail->AddStringAttachment($doc, 'doc.pdf', 'base64', 'application/pdf');
    +$mail->Send();
    +
    +
  • + +
  • +

    16. What's the limit of the file sizes I can generate with FPDF?

    +There is no particular limit. There are some constraints, however: +
    +
    +- The maximum memory size allocated to PHP scripts is usually 8MB. For very big documents, +especially with images, this limit may be reached (the file being built into memory). The +parameter is configured in the php.ini file. +
    +
    +- The maximum execution time allocated defaults to 30 seconds. This limit can of course be easily +reached. It is configured in php.ini and may be altered dynamically with set_time_limit(). +
    +
    +- Browsers generally have a 5 minute time-out. If you send the PDF directly to the browser and +reach the limit, it will be lost. It is therefore advised for very big documents to +generate them in a file, and to send some data to the browser from time to time (with a call +to flush() to force the output). When the document is finished, you can send a redirection to +it or create a link. +
    +Remark: even if the browser times out, the script may continue to run on the server. +
  • + +
  • +

    17. Can I modify a PDF with FPDF?

    +It is possible to import pages from an existing PDF document thanks to the FPDI extension:
    +
    +http://www.setasign.de/products/pdf-php-solutions/fpdi/
    +
    +You can then add some content to them. +
  • + +
  • +

    18. I'd like to make a search engine in PHP and index PDF files. Can I do it with FPDF?

    +No. But a GPL C utility does exist, pdftotext, which is able to extract the textual content from +a PDF. It is provided with the Xpdf package:
    +
    +http://www.foolabs.com/xpdf/ +
  • + +
  • +

    19. Can I convert an HTML page to PDF with FPDF?

    +Not real-world pages. But a GPL C utility does exist, htmldoc, which allows to do it and gives good results:
    +
    +http://www.htmldoc.org +
  • + +
  • +

    20. Can I concatenate PDF files with FPDF?

    +Not directly, but it is possible to use FPDI +to perform this task. Some free command-line tools also exist:
    +
    +mbtPdfAsm
    +pdftk +
  • +
+ + diff --git a/fpdf16/doc/acceptpagebreak.htm b/fpdf16/doc/acceptpagebreak.htm new file mode 100755 index 0000000..ea067b5 --- /dev/null +++ b/fpdf16/doc/acceptpagebreak.htm @@ -0,0 +1,63 @@ + + + + +AcceptPageBreak + + + +

AcceptPageBreak

+boolean AcceptPageBreak() +

Description

+Whenever a page break condition is met, the method is called, and the break is issued or not +depending on the returned value. The default implementation returns a value according to the +mode selected by SetAutoPageBreak(). +
+This method is called automatically and should not be called directly by the application. +

Example

+The method is overriden in an inherited class in order to obtain a 3 column layout: +
+
class PDF extends FPDF
+{
+var $col=0;
+
+function SetCol($col)
+{
+    //Move position to a column
+    $this->col=$col;
+    $x=10+$col*65;
+    $this->SetLeftMargin($x);
+    $this->SetX($x);
+}
+
+function AcceptPageBreak()
+{
+    if($this->col<2)
+    {
+        //Go to next column
+        $this->SetCol($this->col+1);
+        $this->SetY(10);
+        return false;
+    }
+    else
+    {
+        //Go back to first column and issue page break
+        $this->SetCol(0);
+        return true;
+    }
+}
+}
+
+$pdf=new PDF();
+$pdf->AddPage();
+$pdf->SetFont('Arial','',12);
+for($i=1;$i<=300;$i++)
+    $pdf->Cell(0,5,"Line $i",0,1);
+$pdf->Output();
+
+

See also

+SetAutoPageBreak(). +
+ + + diff --git a/fpdf16/doc/addfont.htm b/fpdf16/doc/addfont.htm new file mode 100755 index 0000000..15c156f --- /dev/null +++ b/fpdf16/doc/addfont.htm @@ -0,0 +1,55 @@ + + + + +AddFont + + + +

AddFont

+AddFont(string family [, string style [, string file]]) +

Description

+Imports a TrueType or Type1 font and makes it available. It is necessary to generate a font +definition file first with the makefont.php utility. +
+The definition file (and the font file itself when embedding) must be present in the font directory. +If it is not found, the error "Could not include font definition file" is generated. +

Parameters

+
+
family
+
+Font family. The name can be chosen arbitrarily. If it is a standard family name, it will +override the corresponding font. +
+
style
+
+Font style. Possible values are (case insensitive): +
    +
  • empty string: regular
  • +
  • B: bold
  • +
  • I: italic
  • +
  • BI or IB: bold italic
  • +
+The default value is regular. +
+
file
+
+The font definition file. +
+By default, the name is built from the family and style, in lower case with no space. +
+
+

Example

+
+
$pdf->AddFont('Comic','I');
+
+is equivalent to: +
+
$pdf->AddFont('Comic','I','comici.php');
+
+

See also

+SetFont(). +
+ + + diff --git a/fpdf16/doc/addlink.htm b/fpdf16/doc/addlink.htm new file mode 100755 index 0000000..5681d58 --- /dev/null +++ b/fpdf16/doc/addlink.htm @@ -0,0 +1,26 @@ + + + + +AddLink + + + +

AddLink

+int AddLink() +

Description

+Creates a new internal link and returns its identifier. An internal link is a clickable area +which directs to another place within the document. +
+The identifier can then be passed to Cell(), Write(), Image() or Link(). The destination is +defined with SetLink(). +

See also

+Cell(), +Write(), +Image(), +Link(), +SetLink(). +
+ + + diff --git a/fpdf16/doc/addpage.htm b/fpdf16/doc/addpage.htm new file mode 100755 index 0000000..f88d8ac --- /dev/null +++ b/fpdf16/doc/addpage.htm @@ -0,0 +1,56 @@ + + + + +AddPage + + + +

AddPage

+AddPage([string orientation ,[ mixed format]]) +

Description

+Adds a new page to the document. If a page is already present, the Footer() method is called +first to output the footer. Then the page is added, the current position set to the top-left +corner according to the left and top margins, and Header() is called to display the header. +
+The font which was set before calling is automatically restored. There is no need to call +SetFont() again if you want to continue with the same font. The same is true for colors and +line width. +
+The origin of the coordinate system is at the top-left corner and increasing ordinates go +downwards. +

Parameters

+
+
orientation
+
+Page orientation. Possible values are (case insensitive): +
    +
  • P or Portrait
  • +
  • L or Landscape
  • +
+The default value is the one passed to the constructor. +
+
format
+
+Page format. It can be either one of the following values (case insensitive): +
    +
  • A3
  • +
  • A4
  • +
  • A5
  • +
  • Letter
  • +
  • Legal
  • +
+or an array containing the width and the height (expressed in user unit).
+
+The default value is the one passed to the constructor. +
+
+

See also

+FPDF(), +Header(), +Footer(), +SetMargins(). +
+ + + diff --git a/fpdf16/doc/aliasnbpages.htm b/fpdf16/doc/aliasnbpages.htm new file mode 100755 index 0000000..2acfff1 --- /dev/null +++ b/fpdf16/doc/aliasnbpages.htm @@ -0,0 +1,45 @@ + + + + +AliasNbPages + + + +

AliasNbPages

+AliasNbPages([string alias]) +

Description

+Defines an alias for the total number of pages. It will be substituted as the document is +closed. +

Parameters

+
+
alias
+
+The alias. Default value: {nb}. +
+
+

Example

+
+
class PDF extends FPDF
+{
+function Footer()
+{
+    //Go to 1.5 cm from bottom
+    $this->SetY(-15);
+    //Select Arial italic 8
+    $this->SetFont('Arial','I',8);
+    //Print current and total page numbers
+    $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
+}
+}
+
+$pdf=new PDF();
+$pdf->AliasNbPages();
+
+

See also

+PageNo(), +Footer(). +
+ + + diff --git a/fpdf16/doc/cell.htm b/fpdf16/doc/cell.htm new file mode 100755 index 0000000..2182cf7 --- /dev/null +++ b/fpdf16/doc/cell.htm @@ -0,0 +1,104 @@ + + + + +Cell + + + +

Cell

+Cell(float w [, float h [, string txt [, mixed border [, int ln [, string align [, boolean fill [, mixed link]]]]]]]) +

Description

+Prints a cell (rectangular area) with optional borders, background color and character string. +The upper-left corner of the cell corresponds to the current position. The text can be aligned +or centered. After the call, the current position moves to the right or to the next line. It is +possible to put a link on the text. +
+If automatic page breaking is enabled and the cell goes beyond the limit, a page break is +done before outputting. +

Parameters

+
+
w
+
+Cell width. If 0, the cell extends up to the right margin. +
+
h
+
+Cell height. +Default value: 0. +
+
txt
+
+String to print. +Default value: empty string. +
+
border
+
+Indicates if borders must be drawn around the cell. The value can be either a number: +
    +
  • 0: no border
  • +
  • 1: frame
  • +
+or a string containing some or all of the following characters (in any order): +
    +
  • L: left
  • +
  • T: top
  • +
  • R: right
  • +
  • B: bottom
  • +
+Default value: 0. +
+
ln
+
+Indicates where the current position should go after the call. Possible values are: +
    +
  • 0: to the right
  • +
  • 1: to the beginning of the next line
  • +
  • 2: below
  • +
+Putting 1 is equivalent to putting 0 and calling Ln() just after. +Default value: 0. +
+
align
+
+Allows to center or align the text. Possible values are: +
    +
  • L or empty string: left align (default value)
  • +
  • C: center
  • +
  • R: right align
  • +
+
+
fill
+
+Indicates if the cell background must be painted (true) or transparent (false). +Default value: false. +
+
link
+
+URL or identifier returned by AddLink(). +
+
+

Example

+
+
//Set font
+$pdf->SetFont('Arial','B',16);
+//Move to 8 cm to the right
+$pdf->Cell(80);
+//Centered text in a framed 20*10 mm cell and line break
+$pdf->Cell(20,10,'Title',1,1,'C');
+
+

See also

+SetFont(), +SetDrawColor(), +SetFillColor(), +SetTextColor(), +SetLineWidth(), +AddLink(), +Ln(), +MultiCell(), +Write(), +SetAutoPageBreak(). +
+ + + diff --git a/fpdf16/doc/close.htm b/fpdf16/doc/close.htm new file mode 100755 index 0000000..6d8c192 --- /dev/null +++ b/fpdf16/doc/close.htm @@ -0,0 +1,21 @@ + + + + +Close + + + +

Close

+Close() +

Description

+Terminates the PDF document. It is not necessary to call this method explicitly because Output() +does it automatically. +
+If the document contains no page, AddPage() is called to prevent from getting an invalid document. +

See also

+Output(). +
+ + + diff --git a/fpdf16/doc/error.htm b/fpdf16/doc/error.htm new file mode 100755 index 0000000..49b6083 --- /dev/null +++ b/fpdf16/doc/error.htm @@ -0,0 +1,25 @@ + + + + +Error + + + +

Error

+Error(string msg) +

Description

+This method is automatically called in case of fatal error; it simply outputs the message +and halts the execution. An inherited class may override it to customize the error handling +but should always halt the script, or the resulting document would probably be invalid. +

Parameters

+
+
msg
+
+The error message. +
+
+
+ + + diff --git a/fpdf16/doc/footer.htm b/fpdf16/doc/footer.htm new file mode 100755 index 0000000..0ba9d32 --- /dev/null +++ b/fpdf16/doc/footer.htm @@ -0,0 +1,35 @@ + + + + +Footer + + + +

Footer

+Footer() +

Description

+This method is used to render the page footer. It is automatically called by AddPage() and +Close() and should not be called directly by the application. The implementation in FPDF is +empty, so you have to subclass it and override the method if you want a specific processing. +

Example

+
+
class PDF extends FPDF
+{
+function Footer()
+{
+    //Go to 1.5 cm from bottom
+    $this->SetY(-15);
+    //Select Arial italic 8
+    $this->SetFont('Arial','I',8);
+    //Print centered page number
+    $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
+}
+}
+
+

See also

+Header(). +
+ + + diff --git a/fpdf16/doc/fpdf.htm b/fpdf16/doc/fpdf.htm new file mode 100755 index 0000000..078e7db --- /dev/null +++ b/fpdf16/doc/fpdf.htm @@ -0,0 +1,63 @@ + + + + +FPDF + + + +

FPDF

+FPDF([string orientation [, string unit [, mixed format]]]) +

Description

+This is the class constructor. It allows to set up the page format, the orientation and the +unit of measure used in all methods (except for font sizes). +

Parameters

+
+
orientation
+
+Default page orientation. Possible values are (case insensitive): +
    +
  • P or Portrait
  • +
  • L or Landscape
  • +
+Default value is P. +
+
unit
+
+User unit. Possible values are: +
    +
  • pt: point
  • +
  • mm: millimeter
  • +
  • cm: centimeter
  • +
  • in: inch
  • +
+A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This +is a very common unit in typography; font sizes are expressed in that unit. +
+
+Default value is mm. +
+
format
+
+The format used for pages. It can be either one of the following values (case insensitive): +
    +
  • A3
  • +
  • A4
  • +
  • A5
  • +
  • Letter
  • +
  • Legal
  • +
+or an array containing the width and the height (expressed in the unit given by unit).
+
+Default value is A4. +
+
+

Example

+Example with a custom 100x150 mm page format: +
+
$pdf = new FPDF('P', 'mm', array(100,150));
+
+
+ + + diff --git a/fpdf16/doc/getstringwidth.htm b/fpdf16/doc/getstringwidth.htm new file mode 100755 index 0000000..7cb1119 --- /dev/null +++ b/fpdf16/doc/getstringwidth.htm @@ -0,0 +1,23 @@ + + + + +GetStringWidth + + + +

GetStringWidth

+float GetStringWidth(string s) +

Description

+Returns the length of a string in user unit. A font must be selected. +

Parameters

+
+
s
+
+The string whose length is to be computed. +
+
+
+ + + diff --git a/fpdf16/doc/getx.htm b/fpdf16/doc/getx.htm new file mode 100755 index 0000000..1d1310c --- /dev/null +++ b/fpdf16/doc/getx.htm @@ -0,0 +1,20 @@ + + + + +GetX + + + +

GetX

+float GetX() +

Description

+Returns the abscissa of the current position. +

See also

+SetX(), +GetY(), +SetY(). +
+ + + diff --git a/fpdf16/doc/gety.htm b/fpdf16/doc/gety.htm new file mode 100755 index 0000000..e8ce6cf --- /dev/null +++ b/fpdf16/doc/gety.htm @@ -0,0 +1,20 @@ + + + + +GetY + + + +

GetY

+float GetY() +

Description

+Returns the ordinate of the current position. +

See also

+SetY(), +GetX(), +SetX(). +
+ + + diff --git a/fpdf16/doc/header.htm b/fpdf16/doc/header.htm new file mode 100755 index 0000000..f320e13 --- /dev/null +++ b/fpdf16/doc/header.htm @@ -0,0 +1,37 @@ + + + + +Header + + + +

Header

+Header() +

Description

+This method is used to render the page header. It is automatically called by AddPage() and +should not be called directly by the application. The implementation in FPDF is empty, so +you have to subclass it and override the method if you want a specific processing. +

Example

+
+
class PDF extends FPDF
+{
+function Header()
+{
+    //Select Arial bold 15
+    $this->SetFont('Arial','B',15);
+    //Move to the right
+    $this->Cell(80);
+    //Framed title
+    $this->Cell(30,10,'Title',1,0,'C');
+    //Line break
+    $this->Ln(20);
+}
+}
+
+

See also

+Footer(). +
+ + + diff --git a/fpdf16/doc/image.htm b/fpdf16/doc/image.htm new file mode 100755 index 0000000..3375dad --- /dev/null +++ b/fpdf16/doc/image.htm @@ -0,0 +1,86 @@ + + + + +Image + + + +

Image

+Image(string file [, float x [, float y [, float w [, float h [, string type [, mixed link]]]]]]) +

Description

+Puts an image. The size it will take on the page can be specified in different ways: +
    +
  • explicit width and height (expressed in user unit)
  • +
  • one explicit dimension, the other being calculated automatically in order to keep the original proportions
  • +
  • no explicit dimension, in which case the image is put at 72 dpi
  • +
+Supported formats are JPEG, PNG and GIF. The GD extension is required for GIF. +
+
+For JPEGs, all flavors are allowed: +
    +
  • gray scales
  • +
  • true colors (24 bits)
  • +
  • CMYK (32 bits)
  • +
+For PNGs, are allowed: +
    +
  • gray scales on at most 8 bits (256 levels)
  • +
  • indexed colors
  • +
  • true colors (24 bits)
  • +
+but are not supported: +
    +
  • Interlacing
  • +
  • Alpha channel
  • +
+For GIFs: in case of an animated GIF, only the first frame is used.
+
+If a transparent color is defined, it is taken into account.
+
+The format can be specified explicitly or inferred from the file extension.
+It is possible to put a link on the image.
+
+Remark: if an image is used several times, only one copy is embedded in the file. +

Parameters

+
+
file
+
+Path or URL of the image. +
+
x
+
+Abscissa of the upper-left corner. If not specified or equal to null, the current abscissa +is used. +
+
y
+
+Ordinate of the upper-left corner. If not specified or equal to null, the current ordinate +is used; moreover, a page break is triggered first if necessary (in case automatic page breaking is enabled) +and, after the call, the current ordinate is moved to the bottom of the image. +
+
w
+
+Width of the image in the page. If not specified or equal to zero, it is automatically calculated. +
+
h
+
+Height of the image in the page. If not specified or equal to zero, it is automatically calculated. +
+
type
+
+Image format. Possible values are (case insensitive): JPG, JPEG, PNG and GIF. +If not specified, the type is inferred from the file extension. +
+
link
+
+URL or identifier returned by AddLink(). +
+
+

See also

+AddLink(). +
+ + + diff --git a/fpdf16/doc/index.htm b/fpdf16/doc/index.htm new file mode 100755 index 0000000..93d3e13 --- /dev/null +++ b/fpdf16/doc/index.htm @@ -0,0 +1,57 @@ + + + + +FPDF 1.6 Reference Manual + + + +

FPDF 1.6 Reference Manual

+AcceptPageBreak - accept or not automatic page break
+AddFont - add a new font
+AddLink - create an internal link
+AddPage - add a new page
+AliasNbPages - define an alias for number of pages
+Cell - print a cell
+Close - terminate the document
+Error - fatal error
+Footer - page footer
+FPDF - constructor
+GetStringWidth - compute string length
+GetX - get current x position
+GetY - get current y position
+Header - page header
+Image - output an image
+Line - draw a line
+Link - put a link
+Ln - line break
+MultiCell - print text with line breaks
+Output - save or send the document
+PageNo - page number
+Rect - draw a rectangle
+SetAuthor - set the document author
+SetAutoPageBreak - set the automatic page breaking mode
+SetCompression - turn compression on or off
+SetCreator - set document creator
+SetDisplayMode - set display mode
+SetDrawColor - set drawing color
+SetFillColor - set filling color
+SetFont - set font
+SetFontSize - set font size
+SetKeywords - associate keywords with document
+SetLeftMargin - set left margin
+SetLineWidth - set line width
+SetLink - set internal link destination
+SetMargins - set margins
+SetRightMargin - set right margin
+SetSubject - set document subject
+SetTextColor - set text color
+SetTitle - set document title
+SetTopMargin - set top margin
+SetX - set current x position
+SetXY - set current x and y positions
+SetY - set current y position
+Text - print a string
+Write - print flowing text
+ + diff --git a/fpdf16/doc/line.htm b/fpdf16/doc/line.htm new file mode 100755 index 0000000..a9c5194 --- /dev/null +++ b/fpdf16/doc/line.htm @@ -0,0 +1,38 @@ + + + + +Line + + + +

Line

+Line(float x1, float y1, float x2, float y2) +

Description

+Draws a line between two points. +

Parameters

+
+
x1
+
+Abscissa of first point. +
+
y1
+
+Ordinate of first point. +
+
x2
+
+Abscissa of second point. +
+
y2
+
+Ordinate of second point. +
+
+

See also

+SetLineWidth(), +SetDrawColor(). +
+ + + diff --git a/fpdf16/doc/link.htm b/fpdf16/doc/link.htm new file mode 100755 index 0000000..d6c728c --- /dev/null +++ b/fpdf16/doc/link.htm @@ -0,0 +1,46 @@ + + + + +Link + + + +

Link

+Link(float x, float y, float w, float h, mixed link) +

Description

+Puts a link on a rectangular area of the page. Text or image links are generally put via Cell(), +Write() or Image(), but this method can be useful for instance to define a clickable area inside +an image. +

Parameters

+
+
x
+
+Abscissa of the upper-left corner of the rectangle. +
+
y
+
+Ordinate of the upper-left corner of the rectangle. +
+
w
+
+Width of the rectangle. +
+
h
+
+Height of the rectangle. +
+
link
+
+URL or identifier returned by AddLink(). +
+
+

See also

+AddLink(), +Cell(), +Write(), +Image(). +
+ + + diff --git a/fpdf16/doc/ln.htm b/fpdf16/doc/ln.htm new file mode 100755 index 0000000..0b91b00 --- /dev/null +++ b/fpdf16/doc/ln.htm @@ -0,0 +1,28 @@ + + + + +Ln + + + +

Ln

+Ln([float h]) +

Description

+Performs a line break. The current abscissa goes back to the left margin and the ordinate +increases by the amount passed in parameter. +

Parameters

+
+
h
+
+The height of the break. +
+By default, the value equals the height of the last printed cell. +
+
+

See also

+Cell(). +
+ + + diff --git a/fpdf16/doc/multicell.htm b/fpdf16/doc/multicell.htm new file mode 100755 index 0000000..c41bbd7 --- /dev/null +++ b/fpdf16/doc/multicell.htm @@ -0,0 +1,76 @@ + + + + +MultiCell + + + +

MultiCell

+MultiCell(float w, float h, string txt [, mixed border [, string align [, boolean fill]]]) +

Description

+This method allows printing text with line breaks. They can be automatic (as soon as the +text reaches the right border of the cell) or explicit (via the \n character). As many cells +as necessary are output, one below the other. +
+Text can be aligned, centered or justified. The cell block can be framed and the background +painted. +

Parameters

+
+
w
+
+Width of cells. If 0, they extend up to the right margin of the page. +
+
h
+
+Height of cells. +
+
txt
+
+String to print. +
+
border
+
+Indicates if borders must be drawn around the cell block. The value can be either a number: +
    +
  • 0: no border
  • +
  • 1: frame
  • +
+or a string containing some or all of the following characters (in any order): +
    +
  • L: left
  • +
  • T: top
  • +
  • R: right
  • +
  • B: bottom
  • +
+Default value: 0. +
+
align
+
+Sets the text alignment. Possible values are: +
    +
  • L: left alignment
  • +
  • C: center
  • +
  • R: right alignment
  • +
  • J: justification (default value)
  • +
+
+
fill
+
+Indicates if the cell background must be painted (true) or transparent (false). +Default value: false. +
+
+

See also

+SetFont(), +SetDrawColor(), +SetFillColor(), +SetTextColor(), +SetLineWidth(), +Cell(), +Write(), +SetAutoPageBreak(). +
+ + + diff --git a/fpdf16/doc/output.htm b/fpdf16/doc/output.htm new file mode 100755 index 0000000..b62291c --- /dev/null +++ b/fpdf16/doc/output.htm @@ -0,0 +1,42 @@ + + + + +Output + + + +

Output

+string Output([string name, string dest]) +

Description

+Send the document to a given destination: browser, file or string. In the case of browser, the +plug-in may be used (if present) or a download ("Save as" dialog box) may be forced. +
+The method first calls Close() if necessary to terminate the document. +

Parameters

+
+
name
+
+The name of the file. If not specified, the document will be sent to the browser +(destination I) with the name doc.pdf. +
+
dest
+
+Destination where to send the document. It can take one of the following values: +
    +
  • I: send the file inline to the browser. The plug-in is used if available. +The name given by name is used when one selects the "Save as" option on the +link generating the PDF.
  • +
  • D: send to the browser and force a file download with the name given by +name.
  • +
  • F: save to a local file with the name given by name (may include a path).
  • +
  • S: return the document as a string. name is ignored.
  • +
+
+
+

See also

+Close(). +
+ + + diff --git a/fpdf16/doc/pageno.htm b/fpdf16/doc/pageno.htm new file mode 100755 index 0000000..84e0f22 --- /dev/null +++ b/fpdf16/doc/pageno.htm @@ -0,0 +1,18 @@ + + + + +PageNo + + + +

PageNo

+int PageNo() +

Description

+Returns the current page number. +

See also

+AliasNbPages(). +
+ + + diff --git a/fpdf16/doc/rect.htm b/fpdf16/doc/rect.htm new file mode 100755 index 0000000..fa71375 --- /dev/null +++ b/fpdf16/doc/rect.htm @@ -0,0 +1,48 @@ + + + + +Rect + + + +

Rect

+Rect(float x, float y, float w, float h [, string style]) +

Description

+Outputs a rectangle. It can be drawn (border only), filled (with no border) or both. +

Parameters

+
+
x
+
+Abscissa of upper-left corner. +
+
y
+
+Ordinate of upper-left corner. +
+
w
+
+Width. +
+
h
+
+Height. +
+
style
+
+Style of rendering. Possible values are: +
    +
  • D or empty string: draw. This is the default value.
  • +
  • F: fill
  • +
  • DF or FD: draw and fill
  • +
+
+
+

See also

+SetLineWidth(), +SetDrawColor(), +SetFillColor(). +
+ + + diff --git a/fpdf16/doc/setauthor.htm b/fpdf16/doc/setauthor.htm new file mode 100755 index 0000000..60d3b7c --- /dev/null +++ b/fpdf16/doc/setauthor.htm @@ -0,0 +1,33 @@ + + + + +SetAuthor + + + +

SetAuthor

+SetAuthor(string author [, boolean isUTF8]) +

Description

+Defines the author of the document. +

Parameters

+
+
author
+
+The name of the author. +
+
isUTF8
+
+Indicates if the string is encoded in ISO-8859-1 (false) or UTF-8 (true).
+Default value: false. +
+
+

See also

+SetCreator(), +SetKeywords(), +SetSubject(), +SetTitle(). +
+ + + diff --git a/fpdf16/doc/setautopagebreak.htm b/fpdf16/doc/setautopagebreak.htm new file mode 100755 index 0000000..71dec89 --- /dev/null +++ b/fpdf16/doc/setautopagebreak.htm @@ -0,0 +1,33 @@ + + + + +SetAutoPageBreak + + + +

SetAutoPageBreak

+SetAutoPageBreak(boolean auto [, float margin]) +

Description

+Enables or disables the automatic page breaking mode. When enabling, the second parameter is +the distance from the bottom of the page that defines the triggering limit. By default, the +mode is on and the margin is 2 cm. +

Parameters

+
+
auto
+
+Boolean indicating if mode should be on or off. +
+
margin
+
+Distance from the bottom of the page. +
+
+

See also

+Cell(), +MultiCell(), +AcceptPageBreak(). +
+ + + diff --git a/fpdf16/doc/setcompression.htm b/fpdf16/doc/setcompression.htm new file mode 100755 index 0000000..3f81ab0 --- /dev/null +++ b/fpdf16/doc/setcompression.htm @@ -0,0 +1,31 @@ + + + + +SetCompression + + + +

SetCompression

+SetCompression(boolean compress) +

Description

+Activates or deactivates page compression. When activated, the internal representation of +each page is compressed, which leads to a compression ratio of about 2 for the resulting +document. +
+Compression is on by default. +
+
+Note: the Zlib extension is required for this feature. If not present, compression +will be turned off. +

Parameters

+
+
compress
+
+Boolean indicating if compression must be enabled. +
+
+
+ + + diff --git a/fpdf16/doc/setcreator.htm b/fpdf16/doc/setcreator.htm new file mode 100755 index 0000000..2c0db3c --- /dev/null +++ b/fpdf16/doc/setcreator.htm @@ -0,0 +1,34 @@ + + + + +SetCreator + + + +

SetCreator

+SetCreator(string creator [, boolean isUTF8]) +

Description

+Defines the creator of the document. This is typically the name of the application that +generates the PDF. +

Parameters

+
+
creator
+
+The name of the creator. +
+
isUTF8
+
+Indicates if the string is encoded in ISO-8859-1 (false) or UTF-8 (true).
+Default value: false. +
+
+

See also

+SetAuthor(), +SetKeywords(), +SetSubject(), +SetTitle(). +
+ + + diff --git a/fpdf16/doc/setdisplaymode.htm b/fpdf16/doc/setdisplaymode.htm new file mode 100755 index 0000000..081e7d6 --- /dev/null +++ b/fpdf16/doc/setdisplaymode.htm @@ -0,0 +1,47 @@ + + + + +SetDisplayMode + + + +

SetDisplayMode

+SetDisplayMode(mixed zoom [, string layout]) +

Description

+Defines the way the document is to be displayed by the viewer. The zoom level can be set: pages can be +displayed entirely on screen, occupy the full width of the window, use real size, be scaled by a +specific zooming factor or use viewer default (configured in the Preferences menu of Acrobat). +The page layout can be specified too: single at once, continuous display, two columns or viewer +default. +
+By default, documents use the full width mode with continuous display. +

Parameters

+
+
zoom
+
+The zoom to use. It can be one of the following string values: +
    +
  • fullpage: displays the entire page on screen
  • +
  • fullwidth: uses maximum width of window
  • +
  • real: uses real size (equivalent to 100% zoom)
  • +
  • default: uses viewer default mode
  • +
+or a number indicating the zooming factor to use. +
+
layout
+
+The page layout. Possible values are: +
    +
  • single: displays one page at once
  • +
  • continuous: displays pages continuously
  • +
  • two: displays two pages on two columns
  • +
  • default: uses viewer default mode
  • +
+Default value is continuous. +
+
+
+ + + diff --git a/fpdf16/doc/setdrawcolor.htm b/fpdf16/doc/setdrawcolor.htm new file mode 100755 index 0000000..6be79c5 --- /dev/null +++ b/fpdf16/doc/setdrawcolor.htm @@ -0,0 +1,41 @@ + + + + +SetDrawColor + + + +

SetDrawColor

+SetDrawColor(int r [, int g, int b]) +

Description

+Defines the color used for all drawing operations (lines, rectangles and cell borders). It +can be expressed in RGB components or gray scale. The method can be called before the first +page is created and the value is retained from page to page. +

Parameters

+
+
r
+
+If g et b are given, red component; if not, indicates the gray level. +Value between 0 and 255. +
+
g
+
+Green component (between 0 and 255). +
+
b
+
+Blue component (between 0 and 255). +
+
+

See also

+SetFillColor(), +SetTextColor(), +Line(), +Rect(), +Cell(), +MultiCell(). +
+ + + diff --git a/fpdf16/doc/setfillcolor.htm b/fpdf16/doc/setfillcolor.htm new file mode 100755 index 0000000..64f66d3 --- /dev/null +++ b/fpdf16/doc/setfillcolor.htm @@ -0,0 +1,40 @@ + + + + +SetFillColor + + + +

SetFillColor

+SetFillColor(int r [, int g, int b]) +

Description

+Defines the color used for all filling operations (filled rectangles and cell backgrounds). +It can be expressed in RGB components or gray scale. The method can be called before the first +page is created and the value is retained from page to page. +

Parameters

+
+
r
+
+If g and b are given, red component; if not, indicates the gray level. +Value between 0 and 255. +
+
g
+
+Green component (between 0 and 255). +
+
b
+
+Blue component (between 0 and 255). +
+
+

See also

+SetDrawColor(), +SetTextColor(), +Rect(), +Cell(), +MultiCell(). +
+ + + diff --git a/fpdf16/doc/setfont.htm b/fpdf16/doc/setfont.htm new file mode 100755 index 0000000..5a13f51 --- /dev/null +++ b/fpdf16/doc/setfont.htm @@ -0,0 +1,92 @@ + + + + +SetFont + + + +

SetFont

+SetFont(string family [, string style [, float size]]) +

Description

+Sets the font used to print character strings. It is mandatory to call this method +at least once before printing text or the resulting document would not be valid. +
+The font can be either a standard one or a font added via the AddFont() method. Standard fonts +use Windows encoding cp1252 (Western Europe). +
+The method can be called before the first page is created and the font is retained from page +to page. +
+If you just wish to change the current font size, it is simpler to call SetFontSize(). +
+
+Note: the font metric files must be accessible. They are searched successively in: +
    +
  • The directory defined by the FPDF_FONTPATH constant (if this constant is defined)
  • +
  • The font directory located in the directory containing fpdf.php (if it exists)
  • +
  • The directories accessible through include()
  • +
+Example defining FPDF_FONTPATH (note the mandatory trailing slash): +
+
define('FPDF_FONTPATH','/home/www/font/');
+require('fpdf.php');
+
+If the file corresponding to the requested font is not found, the error "Could not include +font metric file" is issued. +

Parameters

+
+
family
+
+Family font. It can be either a name defined by AddFont() or one of the standard families (case +insensitive): +
    +
  • Courier (fixed-width)
  • +
  • Helvetica or Arial (synonymous; sans serif)
  • +
  • Times (serif)
  • +
  • Symbol (symbolic)
  • +
  • ZapfDingbats (symbolic)
  • +
+It is also possible to pass an empty string. In that case, the current family is retained. +
+
style
+
+Font style. Possible values are (case insensitive): +
    +
  • empty string: regular
  • +
  • B: bold
  • +
  • I: italic
  • +
  • U: underline
  • +
+or any combination. The default value is regular. +Bold and italic styles do not apply to Symbol and ZapfDingbats. +
+
size
+
+Font size in points. +
+The default value is the current size. If no size has been specified since the beginning of +the document, the value taken is 12. +
+
+

Example

+
+
//Times regular 12
+$pdf->SetFont('Times');
+//Arial bold 14
+$pdf->SetFont('Arial','B',14);
+//Removes bold
+$pdf->SetFont('');
+//Times bold, italic and underlined 14
+$pdf->SetFont('Times','BIU');
+
+

See also

+AddFont(), +SetFontSize(), +Cell(), +MultiCell(), +Write(). +
+ + + diff --git a/fpdf16/doc/setfontsize.htm b/fpdf16/doc/setfontsize.htm new file mode 100755 index 0000000..20b35cd --- /dev/null +++ b/fpdf16/doc/setfontsize.htm @@ -0,0 +1,25 @@ + + + + +SetFontSize + + + +

SetFontSize

+SetFontSize(float size) +

Description

+Defines the size of the current font. +

Parameters

+
+
size
+
+The size (in points). +
+
+

See also

+SetFont(). +
+ + + diff --git a/fpdf16/doc/setkeywords.htm b/fpdf16/doc/setkeywords.htm new file mode 100755 index 0000000..8b8897e --- /dev/null +++ b/fpdf16/doc/setkeywords.htm @@ -0,0 +1,33 @@ + + + + +SetKeywords + + + +

SetKeywords

+SetKeywords(string keywords [, boolean isUTF8]) +

Description

+Associates keywords with the document, generally in the form 'keyword1 keyword2 ...'. +

Parameters

+
+
keywords
+
+The list of keywords. +
+
isUTF8
+
+Indicates if the string is encoded in ISO-8859-1 (false) or UTF-8 (true).
+Default value: false. +
+
+

See also

+SetAuthor(), +SetCreator(), +SetSubject(), +SetTitle(). +
+ + + diff --git a/fpdf16/doc/setleftmargin.htm b/fpdf16/doc/setleftmargin.htm new file mode 100755 index 0000000..dde7a7c --- /dev/null +++ b/fpdf16/doc/setleftmargin.htm @@ -0,0 +1,30 @@ + + + + +SetLeftMargin + + + +

SetLeftMargin

+SetLeftMargin(float margin) +

Description

+Defines the left margin. The method can be called before creating the first page. +
+If the current abscissa gets out of page, it is brought back to the margin. +

Parameters

+
+
margin
+
+The margin. +
+
+

See also

+SetTopMargin(), +SetRightMargin(), +SetAutoPageBreak(), +SetMargins(). +
+ + + diff --git a/fpdf16/doc/setlinewidth.htm b/fpdf16/doc/setlinewidth.htm new file mode 100755 index 0000000..11e417c --- /dev/null +++ b/fpdf16/doc/setlinewidth.htm @@ -0,0 +1,29 @@ + + + + +SetLineWidth + + + +

SetLineWidth

+SetLineWidth(float width) +

Description

+Defines the line width. By default, the value equals 0.2 mm. The method can be called before +the first page is created and the value is retained from page to page. +

Parameters

+
+
width
+
+The width. +
+
+

See also

+Line(), +Rect(), +Cell(), +MultiCell(). +
+ + + diff --git a/fpdf16/doc/setlink.htm b/fpdf16/doc/setlink.htm new file mode 100755 index 0000000..b524525 --- /dev/null +++ b/fpdf16/doc/setlink.htm @@ -0,0 +1,34 @@ + + + + +SetLink + + + +

SetLink

+SetLink(int link [, float y [, int page]]) +

Description

+Defines the page and position a link points to. +

Parameters

+
+
link
+
+The link identifier returned by AddLink(). +
+
y
+
+Ordinate of target position; -1 indicates the current position. +The default value is 0 (top of page). +
+
page
+
+Number of target page; -1 indicates the current page. This is the default value. +
+
+

See also

+AddLink(). +
+ + + diff --git a/fpdf16/doc/setmargins.htm b/fpdf16/doc/setmargins.htm new file mode 100755 index 0000000..7cc8c6d --- /dev/null +++ b/fpdf16/doc/setmargins.htm @@ -0,0 +1,37 @@ + + + + +SetMargins + + + +

SetMargins

+SetMargins(float left, float top [, float right]) +

Description

+Defines the left, top and right margins. By default, they equal 1 cm. Call this method to change +them. +

Parameters

+
+
left
+
+Left margin. +
+
top
+
+Top margin. +
+
right
+
+Right margin. Default value is the left one. +
+
+

See also

+SetLeftMargin(), +SetTopMargin(), +SetRightMargin(), +SetAutoPageBreak(). +
+ + + diff --git a/fpdf16/doc/setrightmargin.htm b/fpdf16/doc/setrightmargin.htm new file mode 100755 index 0000000..7915647 --- /dev/null +++ b/fpdf16/doc/setrightmargin.htm @@ -0,0 +1,28 @@ + + + + +SetRightMargin + + + +

SetRightMargin

+SetRightMargin(float margin) +

Description

+Defines the right margin. The method can be called before creating the first page. +

Parameters

+
+
margin
+
+The margin. +
+
+

See also

+SetLeftMargin(), +SetTopMargin(), +SetAutoPageBreak(), +SetMargins(). +
+ + + diff --git a/fpdf16/doc/setsubject.htm b/fpdf16/doc/setsubject.htm new file mode 100755 index 0000000..e8c628c --- /dev/null +++ b/fpdf16/doc/setsubject.htm @@ -0,0 +1,33 @@ + + + + +SetSubject + + + +

SetSubject

+SetSubject(string subject [, boolean isUTF8]) +

Description

+Defines the subject of the document. +

Parameters

+
+
subject
+
+The subject. +
+
isUTF8
+
+Indicates if the string is encoded in ISO-8859-1 (false) or UTF-8 (true).
+Default value: false. +
+
+

See also

+SetAuthor(), +SetCreator(), +SetKeywords(), +SetTitle(). +
+ + + diff --git a/fpdf16/doc/settextcolor.htm b/fpdf16/doc/settextcolor.htm new file mode 100755 index 0000000..cb12fec --- /dev/null +++ b/fpdf16/doc/settextcolor.htm @@ -0,0 +1,40 @@ + + + + +SetTextColor + + + +

SetTextColor

+SetTextColor(int r [, int g, int b]) +

Description

+Defines the color used for text. It can be expressed in RGB components or gray scale. The +method can be called before the first page is created and the value is retained from page to +page. +

Parameters

+
+
r
+
+If g et b are given, red component; if not, indicates the gray level. +Value between 0 and 255. +
+
g
+
+Green component (between 0 and 255). +
+
b
+
+Blue component (between 0 and 255). +
+
+

See also

+SetDrawColor(), +SetFillColor(), +Text(), +Cell(), +MultiCell(). +
+ + + diff --git a/fpdf16/doc/settitle.htm b/fpdf16/doc/settitle.htm new file mode 100755 index 0000000..3bc0fe8 --- /dev/null +++ b/fpdf16/doc/settitle.htm @@ -0,0 +1,33 @@ + + + + +SetTitle + + + +

SetTitle

+SetTitle(string title [, boolean isUTF8]) +

Description

+Defines the title of the document. +

Parameters

+
+
title
+
+The title. +
+
isUTF8
+
+Indicates if the string is encoded in ISO-8859-1 (false) or UTF-8 (true).
+Default value: false. +
+
+

See also

+SetAuthor(), +SetCreator(), +SetKeywords(), +SetSubject(). +
+ + + diff --git a/fpdf16/doc/settopmargin.htm b/fpdf16/doc/settopmargin.htm new file mode 100755 index 0000000..65a4b7d --- /dev/null +++ b/fpdf16/doc/settopmargin.htm @@ -0,0 +1,28 @@ + + + + +SetTopMargin + + + +

SetTopMargin

+SetTopMargin(float margin) +

Description

+Defines the top margin. The method can be called before creating the first page. +

Parameters

+
+
margin
+
+The margin. +
+
+

See also

+SetLeftMargin(), +SetRightMargin(), +SetAutoPageBreak(), +SetMargins(). +
+ + + diff --git a/fpdf16/doc/setx.htm b/fpdf16/doc/setx.htm new file mode 100755 index 0000000..7c92465 --- /dev/null +++ b/fpdf16/doc/setx.htm @@ -0,0 +1,29 @@ + + + + +SetX + + + +

SetX

+SetX(float x) +

Description

+Defines the abscissa of the current position. If the passed value is negative, it is relative +to the right of the page. +

Parameters

+
+
x
+
+The value of the abscissa. +
+
+

See also

+GetX(), +GetY(), +SetY(), +SetXY(). +
+ + + diff --git a/fpdf16/doc/setxy.htm b/fpdf16/doc/setxy.htm new file mode 100755 index 0000000..c0602e5 --- /dev/null +++ b/fpdf16/doc/setxy.htm @@ -0,0 +1,31 @@ + + + + +SetXY + + + +

SetXY

+SetXY(float x, float y) +

Description

+Defines the abscissa and ordinate of the current position. If the passed values are negative, +they are relative respectively to the right and bottom of the page. +

Parameters

+
+
x
+
+The value of the abscissa. +
+
y
+
+The value of the ordinate. +
+
+

See also

+SetX(), +SetY(). +
+ + + diff --git a/fpdf16/doc/sety.htm b/fpdf16/doc/sety.htm new file mode 100755 index 0000000..e9afe11 --- /dev/null +++ b/fpdf16/doc/sety.htm @@ -0,0 +1,29 @@ + + + + +SetY + + + +

SetY

+SetY(float y) +

Description

+Moves the current abscissa back to the left margin and sets the ordinate. If the passed value +is negative, it is relative to the bottom of the page. +

Parameters

+
+
y
+
+The value of the ordinate. +
+
+

See also

+GetX(), +GetY(), +SetX(), +SetXY(). +
+ + + diff --git a/fpdf16/doc/text.htm b/fpdf16/doc/text.htm new file mode 100755 index 0000000..ccd86eb --- /dev/null +++ b/fpdf16/doc/text.htm @@ -0,0 +1,39 @@ + + + + +Text + + + +

Text

+Text(float x, float y, string txt) +

Description

+Prints a character string. The origin is on the left of the first character, on the baseline. +This method allows to place a string precisely on the page, but it is usually easier to use +Cell(), MultiCell() or Write() which are the standard methods to print text. +

Parameters

+
+
x
+
+Abscissa of the origin. +
+
y
+
+Ordinate of the origin. +
+
txt
+
+String to print. +
+
+

See also

+SetFont(), +SetTextColor(), +Cell(), +MultiCell(), +Write(). +
+ + + diff --git a/fpdf16/doc/write.htm b/fpdf16/doc/write.htm new file mode 100755 index 0000000..dd14799 --- /dev/null +++ b/fpdf16/doc/write.htm @@ -0,0 +1,51 @@ + + + + +Write + + + +

Write

+Write(float h, string txt [, mixed link]) +

Description

+This method prints text from the current position. When the right margin is reached (or the \n +character is met) a line break occurs and text continues from the left margin. Upon method exit, +the current position is left just at the end of the text. +
+It is possible to put a link on the text. +

Parameters

+
+
h
+
+Line height. +
+
txt
+
+String to print. +
+
link
+
+URL or identifier returned by AddLink(). +
+
+

Example

+
+
//Begin with regular font
+$pdf->SetFont('Arial','',14);
+$pdf->Write(5,'Visit ');
+//Then put a blue underlined link
+$pdf->SetTextColor(0,0,255);
+$pdf->SetFont('','U');
+$pdf->Write(5,'www.fpdf.org','http://www.fpdf.org');
+
+

See also

+SetFont(), +SetTextColor(), +AddLink(), +MultiCell(), +SetAutoPageBreak(). +
+ + + diff --git a/fpdf16/font/courier.php b/fpdf16/font/courier.php new file mode 100755 index 0000000..913f9a4 --- /dev/null +++ b/fpdf16/font/courier.php @@ -0,0 +1,7 @@ + diff --git a/fpdf16/font/desktop.ini b/fpdf16/font/desktop.ini new file mode 100755 index 0000000..8a96fbb --- /dev/null +++ b/fpdf16/font/desktop.ini @@ -0,0 +1,4 @@ +[ViewState] +Mode= +Vid= +FolderType=NotSpecified diff --git a/fpdf16/font/helvetica.php b/fpdf16/font/helvetica.php new file mode 100755 index 0000000..ca94cdf --- /dev/null +++ b/fpdf16/font/helvetica.php @@ -0,0 +1,15 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/fpdf16/font/helveticab.php b/fpdf16/font/helveticab.php new file mode 100755 index 0000000..276cfa8 --- /dev/null +++ b/fpdf16/font/helveticab.php @@ -0,0 +1,15 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); +?> diff --git a/fpdf16/font/helveticabi.php b/fpdf16/font/helveticabi.php new file mode 100755 index 0000000..8d21774 --- /dev/null +++ b/fpdf16/font/helveticabi.php @@ -0,0 +1,15 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); +?> diff --git a/fpdf16/font/helveticai.php b/fpdf16/font/helveticai.php new file mode 100755 index 0000000..88bf437 --- /dev/null +++ b/fpdf16/font/helveticai.php @@ -0,0 +1,15 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/fpdf16/font/makefont/cp1250.map b/fpdf16/font/makefont/cp1250.map new file mode 100755 index 0000000..ec110af --- /dev/null +++ b/fpdf16/font/makefont/cp1250.map @@ -0,0 +1,251 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+015A Sacute +!8D U+0164 Tcaron +!8E U+017D Zcaron +!8F U+0179 Zacute +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+015B sacute +!9D U+0165 tcaron +!9E U+017E zcaron +!9F U+017A zacute +!A0 U+00A0 space +!A1 U+02C7 caron +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+0104 Aogonek +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+015E Scedilla +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+0105 aogonek +!BA U+015F scedilla +!BB U+00BB guillemotright +!BC U+013D Lcaron +!BD U+02DD hungarumlaut +!BE U+013E lcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcommaaccent +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcommaaccent +!FF U+02D9 dotaccent diff --git a/fpdf16/font/makefont/cp1251.map b/fpdf16/font/makefont/cp1251.map new file mode 100755 index 0000000..de6a198 --- /dev/null +++ b/fpdf16/font/makefont/cp1251.map @@ -0,0 +1,255 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0402 afii10051 +!81 U+0403 afii10052 +!82 U+201A quotesinglbase +!83 U+0453 afii10100 +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+20AC Euro +!89 U+2030 perthousand +!8A U+0409 afii10058 +!8B U+2039 guilsinglleft +!8C U+040A afii10059 +!8D U+040C afii10061 +!8E U+040B afii10060 +!8F U+040F afii10145 +!90 U+0452 afii10099 +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0459 afii10106 +!9B U+203A guilsinglright +!9C U+045A afii10107 +!9D U+045C afii10109 +!9E U+045B afii10108 +!9F U+045F afii10193 +!A0 U+00A0 space +!A1 U+040E afii10062 +!A2 U+045E afii10110 +!A3 U+0408 afii10057 +!A4 U+00A4 currency +!A5 U+0490 afii10050 +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+0401 afii10023 +!A9 U+00A9 copyright +!AA U+0404 afii10053 +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+0407 afii10056 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+0406 afii10055 +!B3 U+0456 afii10103 +!B4 U+0491 afii10098 +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0451 afii10071 +!B9 U+2116 afii61352 +!BA U+0454 afii10101 +!BB U+00BB guillemotright +!BC U+0458 afii10105 +!BD U+0405 afii10054 +!BE U+0455 afii10102 +!BF U+0457 afii10104 +!C0 U+0410 afii10017 +!C1 U+0411 afii10018 +!C2 U+0412 afii10019 +!C3 U+0413 afii10020 +!C4 U+0414 afii10021 +!C5 U+0415 afii10022 +!C6 U+0416 afii10024 +!C7 U+0417 afii10025 +!C8 U+0418 afii10026 +!C9 U+0419 afii10027 +!CA U+041A afii10028 +!CB U+041B afii10029 +!CC U+041C afii10030 +!CD U+041D afii10031 +!CE U+041E afii10032 +!CF U+041F afii10033 +!D0 U+0420 afii10034 +!D1 U+0421 afii10035 +!D2 U+0422 afii10036 +!D3 U+0423 afii10037 +!D4 U+0424 afii10038 +!D5 U+0425 afii10039 +!D6 U+0426 afii10040 +!D7 U+0427 afii10041 +!D8 U+0428 afii10042 +!D9 U+0429 afii10043 +!DA U+042A afii10044 +!DB U+042B afii10045 +!DC U+042C afii10046 +!DD U+042D afii10047 +!DE U+042E afii10048 +!DF U+042F afii10049 +!E0 U+0430 afii10065 +!E1 U+0431 afii10066 +!E2 U+0432 afii10067 +!E3 U+0433 afii10068 +!E4 U+0434 afii10069 +!E5 U+0435 afii10070 +!E6 U+0436 afii10072 +!E7 U+0437 afii10073 +!E8 U+0438 afii10074 +!E9 U+0439 afii10075 +!EA U+043A afii10076 +!EB U+043B afii10077 +!EC U+043C afii10078 +!ED U+043D afii10079 +!EE U+043E afii10080 +!EF U+043F afii10081 +!F0 U+0440 afii10082 +!F1 U+0441 afii10083 +!F2 U+0442 afii10084 +!F3 U+0443 afii10085 +!F4 U+0444 afii10086 +!F5 U+0445 afii10087 +!F6 U+0446 afii10088 +!F7 U+0447 afii10089 +!F8 U+0448 afii10090 +!F9 U+0449 afii10091 +!FA U+044A afii10092 +!FB U+044B afii10093 +!FC U+044C afii10094 +!FD U+044D afii10095 +!FE U+044E afii10096 +!FF U+044F afii10097 diff --git a/fpdf16/font/makefont/cp1252.map b/fpdf16/font/makefont/cp1252.map new file mode 100755 index 0000000..dd490e5 --- /dev/null +++ b/fpdf16/font/makefont/cp1252.map @@ -0,0 +1,251 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!8E U+017D Zcaron +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9E U+017E zcaron +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/fpdf16/font/makefont/cp1253.map b/fpdf16/font/makefont/cp1253.map new file mode 100755 index 0000000..4bd826f --- /dev/null +++ b/fpdf16/font/makefont/cp1253.map @@ -0,0 +1,239 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+0385 dieresistonos +!A2 U+0386 Alphatonos +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/fpdf16/font/makefont/cp1254.map b/fpdf16/font/makefont/cp1254.map new file mode 100755 index 0000000..829473b --- /dev/null +++ b/fpdf16/font/makefont/cp1254.map @@ -0,0 +1,249 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/fpdf16/font/makefont/cp1255.map b/fpdf16/font/makefont/cp1255.map new file mode 100755 index 0000000..079e10c --- /dev/null +++ b/fpdf16/font/makefont/cp1255.map @@ -0,0 +1,233 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AA afii57636 +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00D7 multiply +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD sfthyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 middot +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00F7 divide +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+05B0 afii57799 +!C1 U+05B1 afii57801 +!C2 U+05B2 afii57800 +!C3 U+05B3 afii57802 +!C4 U+05B4 afii57793 +!C5 U+05B5 afii57794 +!C6 U+05B6 afii57795 +!C7 U+05B7 afii57798 +!C8 U+05B8 afii57797 +!C9 U+05B9 afii57806 +!CB U+05BB afii57796 +!CC U+05BC afii57807 +!CD U+05BD afii57839 +!CE U+05BE afii57645 +!CF U+05BF afii57841 +!D0 U+05C0 afii57842 +!D1 U+05C1 afii57804 +!D2 U+05C2 afii57803 +!D3 U+05C3 afii57658 +!D4 U+05F0 afii57716 +!D5 U+05F1 afii57717 +!D6 U+05F2 afii57718 +!D7 U+05F3 gereshhebrew +!D8 U+05F4 gershayimhebrew +!E0 U+05D0 afii57664 +!E1 U+05D1 afii57665 +!E2 U+05D2 afii57666 +!E3 U+05D3 afii57667 +!E4 U+05D4 afii57668 +!E5 U+05D5 afii57669 +!E6 U+05D6 afii57670 +!E7 U+05D7 afii57671 +!E8 U+05D8 afii57672 +!E9 U+05D9 afii57673 +!EA U+05DA afii57674 +!EB U+05DB afii57675 +!EC U+05DC afii57676 +!ED U+05DD afii57677 +!EE U+05DE afii57678 +!EF U+05DF afii57679 +!F0 U+05E0 afii57680 +!F1 U+05E1 afii57681 +!F2 U+05E2 afii57682 +!F3 U+05E3 afii57683 +!F4 U+05E4 afii57684 +!F5 U+05E5 afii57685 +!F6 U+05E6 afii57686 +!F7 U+05E7 afii57687 +!F8 U+05E8 afii57688 +!F9 U+05E9 afii57689 +!FA U+05EA afii57690 +!FD U+200E afii299 +!FE U+200F afii300 diff --git a/fpdf16/font/makefont/cp1257.map b/fpdf16/font/makefont/cp1257.map new file mode 100755 index 0000000..2f2ecfa --- /dev/null +++ b/fpdf16/font/makefont/cp1257.map @@ -0,0 +1,244 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8D U+00A8 dieresis +!8E U+02C7 caron +!8F U+00B8 cedilla +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!9D U+00AF macron +!9E U+02DB ogonek +!A0 U+00A0 space +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00D8 Oslash +!A9 U+00A9 copyright +!AA U+0156 Rcommaaccent +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00C6 AE +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00F8 oslash +!B9 U+00B9 onesuperior +!BA U+0157 rcommaaccent +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00E6 ae +!C0 U+0104 Aogonek +!C1 U+012E Iogonek +!C2 U+0100 Amacron +!C3 U+0106 Cacute +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+0118 Eogonek +!C7 U+0112 Emacron +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0179 Zacute +!CB U+0116 Edotaccent +!CC U+0122 Gcommaaccent +!CD U+0136 Kcommaaccent +!CE U+012A Imacron +!CF U+013B Lcommaaccent +!D0 U+0160 Scaron +!D1 U+0143 Nacute +!D2 U+0145 Ncommaaccent +!D3 U+00D3 Oacute +!D4 U+014C Omacron +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0172 Uogonek +!D9 U+0141 Lslash +!DA U+015A Sacute +!DB U+016A Umacron +!DC U+00DC Udieresis +!DD U+017B Zdotaccent +!DE U+017D Zcaron +!DF U+00DF germandbls +!E0 U+0105 aogonek +!E1 U+012F iogonek +!E2 U+0101 amacron +!E3 U+0107 cacute +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+0119 eogonek +!E7 U+0113 emacron +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+017A zacute +!EB U+0117 edotaccent +!EC U+0123 gcommaaccent +!ED U+0137 kcommaaccent +!EE U+012B imacron +!EF U+013C lcommaaccent +!F0 U+0161 scaron +!F1 U+0144 nacute +!F2 U+0146 ncommaaccent +!F3 U+00F3 oacute +!F4 U+014D omacron +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0173 uogonek +!F9 U+0142 lslash +!FA U+015B sacute +!FB U+016B umacron +!FC U+00FC udieresis +!FD U+017C zdotaccent +!FE U+017E zcaron +!FF U+02D9 dotaccent diff --git a/fpdf16/font/makefont/cp1258.map b/fpdf16/font/makefont/cp1258.map new file mode 100755 index 0000000..fed915f --- /dev/null +++ b/fpdf16/font/makefont/cp1258.map @@ -0,0 +1,247 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+0300 gravecomb +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+00D1 Ntilde +!D2 U+0309 hookabovecomb +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+01A0 Ohorn +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+01AF Uhorn +!DE U+0303 tildecomb +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+0301 acutecomb +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+00F1 ntilde +!F2 U+0323 dotbelowcomb +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+01A1 ohorn +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+01B0 uhorn +!FE U+20AB dong +!FF U+00FF ydieresis diff --git a/fpdf16/font/makefont/cp874.map b/fpdf16/font/makefont/cp874.map new file mode 100755 index 0000000..1006e6b --- /dev/null +++ b/fpdf16/font/makefont/cp874.map @@ -0,0 +1,225 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!85 U+2026 ellipsis +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/fpdf16/font/makefont/iso-8859-1.map b/fpdf16/font/makefont/iso-8859-1.map new file mode 100755 index 0000000..61740a3 --- /dev/null +++ b/fpdf16/font/makefont/iso-8859-1.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/fpdf16/font/makefont/iso-8859-11.map b/fpdf16/font/makefont/iso-8859-11.map new file mode 100755 index 0000000..9168812 --- /dev/null +++ b/fpdf16/font/makefont/iso-8859-11.map @@ -0,0 +1,248 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/fpdf16/font/makefont/iso-8859-15.map b/fpdf16/font/makefont/iso-8859-15.map new file mode 100755 index 0000000..6c2b571 --- /dev/null +++ b/fpdf16/font/makefont/iso-8859-15.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AC Euro +!A5 U+00A5 yen +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+017D Zcaron +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/fpdf16/font/makefont/iso-8859-16.map b/fpdf16/font/makefont/iso-8859-16.map new file mode 100755 index 0000000..202c8fe --- /dev/null +++ b/fpdf16/font/makefont/iso-8859-16.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0105 aogonek +!A3 U+0141 Lslash +!A4 U+20AC Euro +!A5 U+201E quotedblbase +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+0218 Scommaaccent +!AB U+00AB guillemotleft +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017A zacute +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+010C Ccaron +!B3 U+0142 lslash +!B4 U+017D Zcaron +!B5 U+201D quotedblright +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+010D ccaron +!BA U+0219 scommaaccent +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+017C zdotaccent +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0106 Cacute +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+015A Sacute +!D8 U+0170 Uhungarumlaut +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0118 Eogonek +!DE U+021A Tcommaaccent +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+0107 cacute +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+015B sacute +!F8 U+0171 uhungarumlaut +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0119 eogonek +!FE U+021B tcommaaccent +!FF U+00FF ydieresis diff --git a/fpdf16/font/makefont/iso-8859-2.map b/fpdf16/font/makefont/iso-8859-2.map new file mode 100755 index 0000000..65ae09f --- /dev/null +++ b/fpdf16/font/makefont/iso-8859-2.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+013D Lcaron +!A6 U+015A Sacute +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+015E Scedilla +!AB U+0164 Tcaron +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+013E lcaron +!B6 U+015B sacute +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+015F scedilla +!BB U+0165 tcaron +!BC U+017A zacute +!BD U+02DD hungarumlaut +!BE U+017E zcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcommaaccent +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcommaaccent +!FF U+02D9 dotaccent diff --git a/fpdf16/font/makefont/iso-8859-4.map b/fpdf16/font/makefont/iso-8859-4.map new file mode 100755 index 0000000..a7d87bf --- /dev/null +++ b/fpdf16/font/makefont/iso-8859-4.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0138 kgreenlandic +!A3 U+0156 Rcommaaccent +!A4 U+00A4 currency +!A5 U+0128 Itilde +!A6 U+013B Lcommaaccent +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+0112 Emacron +!AB U+0122 Gcommaaccent +!AC U+0166 Tbar +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0157 rcommaaccent +!B4 U+00B4 acute +!B5 U+0129 itilde +!B6 U+013C lcommaaccent +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+0113 emacron +!BB U+0123 gcommaaccent +!BC U+0167 tbar +!BD U+014A Eng +!BE U+017E zcaron +!BF U+014B eng +!C0 U+0100 Amacron +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+012E Iogonek +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+0116 Edotaccent +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+012A Imacron +!D0 U+0110 Dcroat +!D1 U+0145 Ncommaaccent +!D2 U+014C Omacron +!D3 U+0136 Kcommaaccent +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+0172 Uogonek +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0168 Utilde +!DE U+016A Umacron +!DF U+00DF germandbls +!E0 U+0101 amacron +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+012F iogonek +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+0117 edotaccent +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+012B imacron +!F0 U+0111 dcroat +!F1 U+0146 ncommaaccent +!F2 U+014D omacron +!F3 U+0137 kcommaaccent +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+0173 uogonek +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0169 utilde +!FE U+016B umacron +!FF U+02D9 dotaccent diff --git a/fpdf16/font/makefont/iso-8859-5.map b/fpdf16/font/makefont/iso-8859-5.map new file mode 100755 index 0000000..f9cd4ed --- /dev/null +++ b/fpdf16/font/makefont/iso-8859-5.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0401 afii10023 +!A2 U+0402 afii10051 +!A3 U+0403 afii10052 +!A4 U+0404 afii10053 +!A5 U+0405 afii10054 +!A6 U+0406 afii10055 +!A7 U+0407 afii10056 +!A8 U+0408 afii10057 +!A9 U+0409 afii10058 +!AA U+040A afii10059 +!AB U+040B afii10060 +!AC U+040C afii10061 +!AD U+00AD hyphen +!AE U+040E afii10062 +!AF U+040F afii10145 +!B0 U+0410 afii10017 +!B1 U+0411 afii10018 +!B2 U+0412 afii10019 +!B3 U+0413 afii10020 +!B4 U+0414 afii10021 +!B5 U+0415 afii10022 +!B6 U+0416 afii10024 +!B7 U+0417 afii10025 +!B8 U+0418 afii10026 +!B9 U+0419 afii10027 +!BA U+041A afii10028 +!BB U+041B afii10029 +!BC U+041C afii10030 +!BD U+041D afii10031 +!BE U+041E afii10032 +!BF U+041F afii10033 +!C0 U+0420 afii10034 +!C1 U+0421 afii10035 +!C2 U+0422 afii10036 +!C3 U+0423 afii10037 +!C4 U+0424 afii10038 +!C5 U+0425 afii10039 +!C6 U+0426 afii10040 +!C7 U+0427 afii10041 +!C8 U+0428 afii10042 +!C9 U+0429 afii10043 +!CA U+042A afii10044 +!CB U+042B afii10045 +!CC U+042C afii10046 +!CD U+042D afii10047 +!CE U+042E afii10048 +!CF U+042F afii10049 +!D0 U+0430 afii10065 +!D1 U+0431 afii10066 +!D2 U+0432 afii10067 +!D3 U+0433 afii10068 +!D4 U+0434 afii10069 +!D5 U+0435 afii10070 +!D6 U+0436 afii10072 +!D7 U+0437 afii10073 +!D8 U+0438 afii10074 +!D9 U+0439 afii10075 +!DA U+043A afii10076 +!DB U+043B afii10077 +!DC U+043C afii10078 +!DD U+043D afii10079 +!DE U+043E afii10080 +!DF U+043F afii10081 +!E0 U+0440 afii10082 +!E1 U+0441 afii10083 +!E2 U+0442 afii10084 +!E3 U+0443 afii10085 +!E4 U+0444 afii10086 +!E5 U+0445 afii10087 +!E6 U+0446 afii10088 +!E7 U+0447 afii10089 +!E8 U+0448 afii10090 +!E9 U+0449 afii10091 +!EA U+044A afii10092 +!EB U+044B afii10093 +!EC U+044C afii10094 +!ED U+044D afii10095 +!EE U+044E afii10096 +!EF U+044F afii10097 +!F0 U+2116 afii61352 +!F1 U+0451 afii10071 +!F2 U+0452 afii10099 +!F3 U+0453 afii10100 +!F4 U+0454 afii10101 +!F5 U+0455 afii10102 +!F6 U+0456 afii10103 +!F7 U+0457 afii10104 +!F8 U+0458 afii10105 +!F9 U+0459 afii10106 +!FA U+045A afii10107 +!FB U+045B afii10108 +!FC U+045C afii10109 +!FD U+00A7 section +!FE U+045E afii10110 +!FF U+045F afii10193 diff --git a/fpdf16/font/makefont/iso-8859-7.map b/fpdf16/font/makefont/iso-8859-7.map new file mode 100755 index 0000000..e163796 --- /dev/null +++ b/fpdf16/font/makefont/iso-8859-7.map @@ -0,0 +1,250 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+2018 quoteleft +!A2 U+2019 quoteright +!A3 U+00A3 sterling +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+0385 dieresistonos +!B6 U+0386 Alphatonos +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/fpdf16/font/makefont/iso-8859-9.map b/fpdf16/font/makefont/iso-8859-9.map new file mode 100755 index 0000000..48c123a --- /dev/null +++ b/fpdf16/font/makefont/iso-8859-9.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/fpdf16/font/makefont/koi8-r.map b/fpdf16/font/makefont/koi8-r.map new file mode 100755 index 0000000..6ad5d05 --- /dev/null +++ b/fpdf16/font/makefont/koi8-r.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2219 periodcentered +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+2553 SF520000 +!A5 U+2554 SF390000 +!A6 U+2555 SF220000 +!A7 U+2556 SF210000 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+255C SF270000 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+2562 SF200000 +!B5 U+2563 SF230000 +!B6 U+2564 SF470000 +!B7 U+2565 SF480000 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+256B SF530000 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/fpdf16/font/makefont/koi8-u.map b/fpdf16/font/makefont/koi8-u.map new file mode 100755 index 0000000..40a7e4f --- /dev/null +++ b/fpdf16/font/makefont/koi8-u.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2022 bullet +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+0454 afii10101 +!A5 U+2554 SF390000 +!A6 U+0456 afii10103 +!A7 U+0457 afii10104 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+0491 afii10098 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+0404 afii10053 +!B5 U+2563 SF230000 +!B6 U+0406 afii10055 +!B7 U+0407 afii10056 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+0490 afii10050 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/fpdf16/font/makefont/makefont.php b/fpdf16/font/makefont/makefont.php new file mode 100755 index 0000000..7e7ed56 --- /dev/null +++ b/fpdf16/font/makefont/makefont.php @@ -0,0 +1,419 @@ +Error: encoding not found: '.$enc); + $cc2gn=array(); + foreach($a as $l) + { + if($l[0]=='!') + { + $e=preg_split('/[ \\t]+/',rtrim($l)); + $cc=hexdec(substr($e[0],1)); + $gn=$e[2]; + $cc2gn[$cc]=$gn; + } + } + for($i=0;$i<=255;$i++) + { + if(!isset($cc2gn[$i])) + $cc2gn[$i]='.notdef'; + } + return $cc2gn; +} + +function ReadAFM($file, &$map) +{ + //Read a font metric file + $a=file($file); + if(empty($a)) + die('File not found'); + $widths=array(); + $fm=array(); + $fix=array('Edot'=>'Edotaccent','edot'=>'edotaccent','Idot'=>'Idotaccent','Zdot'=>'Zdotaccent','zdot'=>'zdotaccent', + 'Odblacute'=>'Ohungarumlaut','odblacute'=>'ohungarumlaut','Udblacute'=>'Uhungarumlaut','udblacute'=>'uhungarumlaut', + 'Gcedilla'=>'Gcommaaccent','gcedilla'=>'gcommaaccent','Kcedilla'=>'Kcommaaccent','kcedilla'=>'kcommaaccent', + 'Lcedilla'=>'Lcommaaccent','lcedilla'=>'lcommaaccent','Ncedilla'=>'Ncommaaccent','ncedilla'=>'ncommaaccent', + 'Rcedilla'=>'Rcommaaccent','rcedilla'=>'rcommaaccent','Scedilla'=>'Scommaaccent','scedilla'=>'scommaaccent', + 'Tcedilla'=>'Tcommaaccent','tcedilla'=>'tcommaaccent','Dslash'=>'Dcroat','dslash'=>'dcroat','Dmacron'=>'Dcroat','dmacron'=>'dcroat', + 'combininggraveaccent'=>'gravecomb','combininghookabove'=>'hookabovecomb','combiningtildeaccent'=>'tildecomb', + 'combiningacuteaccent'=>'acutecomb','combiningdotbelow'=>'dotbelowcomb','dongsign'=>'dong'); + foreach($a as $l) + { + $e=explode(' ',rtrim($l)); + if(count($e)<2) + continue; + $code=$e[0]; + $param=$e[1]; + if($code=='C') + { + //Character metrics + $cc=(int)$e[1]; + $w=$e[4]; + $gn=$e[7]; + if(substr($gn,-4)=='20AC') + $gn='Euro'; + if(isset($fix[$gn])) + { + //Fix incorrect glyph name + foreach($map as $c=>$n) + { + if($n==$fix[$gn]) + $map[$c]=$gn; + } + } + if(empty($map)) + { + //Symbolic font: use built-in encoding + $widths[$cc]=$w; + } + else + { + $widths[$gn]=$w; + if($gn=='X') + $fm['CapXHeight']=$e[13]; + } + if($gn=='.notdef') + $fm['MissingWidth']=$w; + } + elseif($code=='FontName') + $fm['FontName']=$param; + elseif($code=='Weight') + $fm['Weight']=$param; + elseif($code=='ItalicAngle') + $fm['ItalicAngle']=(double)$param; + elseif($code=='Ascender') + $fm['Ascender']=(int)$param; + elseif($code=='Descender') + $fm['Descender']=(int)$param; + elseif($code=='UnderlineThickness') + $fm['UnderlineThickness']=(int)$param; + elseif($code=='UnderlinePosition') + $fm['UnderlinePosition']=(int)$param; + elseif($code=='IsFixedPitch') + $fm['IsFixedPitch']=($param=='true'); + elseif($code=='FontBBox') + $fm['FontBBox']=array($e[1],$e[2],$e[3],$e[4]); + elseif($code=='CapHeight') + $fm['CapHeight']=(int)$param; + elseif($code=='StdVW') + $fm['StdVW']=(int)$param; + } + if(!isset($fm['FontName'])) + die('FontName not found'); + if(!empty($map)) + { + if(!isset($widths['.notdef'])) + $widths['.notdef']=600; + if(!isset($widths['Delta']) && isset($widths['increment'])) + $widths['Delta']=$widths['increment']; + //Order widths according to map + for($i=0;$i<=255;$i++) + { + if(!isset($widths[$map[$i]])) + { + echo 'Warning: character '.$map[$i].' is missing
'; + $widths[$i]=$widths['.notdef']; + } + else + $widths[$i]=$widths[$map[$i]]; + } + } + $fm['Widths']=$widths; + return $fm; +} + +function MakeFontDescriptor($fm, $symbolic) +{ + //Ascent + $asc=(isset($fm['Ascender']) ? $fm['Ascender'] : 1000); + $fd="array('Ascent'=>".$asc; + //Descent + $desc=(isset($fm['Descender']) ? $fm['Descender'] : -200); + $fd.=",'Descent'=>".$desc; + //CapHeight + if(isset($fm['CapHeight'])) + $ch=$fm['CapHeight']; + elseif(isset($fm['CapXHeight'])) + $ch=$fm['CapXHeight']; + else + $ch=$asc; + $fd.=",'CapHeight'=>".$ch; + //Flags + $flags=0; + if(isset($fm['IsFixedPitch']) && $fm['IsFixedPitch']) + $flags+=1<<0; + if($symbolic) + $flags+=1<<2; + if(!$symbolic) + $flags+=1<<5; + if(isset($fm['ItalicAngle']) && $fm['ItalicAngle']!=0) + $flags+=1<<6; + $fd.=",'Flags'=>".$flags; + //FontBBox + if(isset($fm['FontBBox'])) + $fbb=$fm['FontBBox']; + else + $fbb=array(0,$desc-100,1000,$asc+100); + $fd.=",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'"; + //ItalicAngle + $ia=(isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0); + $fd.=",'ItalicAngle'=>".$ia; + //StemV + if(isset($fm['StdVW'])) + $stemv=$fm['StdVW']; + elseif(isset($fm['Weight']) && preg_match('/bold|black/i',$fm['Weight'])) + $stemv=120; + else + $stemv=70; + $fd.=",'StemV'=>".$stemv; + //MissingWidth + if(isset($fm['MissingWidth'])) + $fd.=",'MissingWidth'=>".$fm['MissingWidth']; + $fd.=')'; + return $fd; +} + +function MakeWidthArray($fm) +{ + //Make character width array + $s="array(\n\t"; + $cw=$fm['Widths']; + for($i=0;$i<=255;$i++) + { + if(chr($i)=="'") + $s.="'\\''"; + elseif(chr($i)=="\\") + $s.="'\\\\'"; + elseif($i>=32 && $i<=126) + $s.="'".chr($i)."'"; + else + $s.="chr($i)"; + $s.='=>'.$fm['Widths'][$i]; + if($i<255) + $s.=','; + if(($i+1)%22==0) + $s.="\n\t"; + } + $s.=')'; + return $s; +} + +function MakeFontEncoding($map) +{ + //Build differences from reference encoding + $ref=ReadMap('cp1252'); + $s=''; + $last=0; + for($i=32;$i<=255;$i++) + { + if($map[$i]!=$ref[$i]) + { + if($i!=$last+1) + $s.=$i.' '; + $last=$i; + $s.='/'.$map[$i].' '; + } + } + return rtrim($s); +} + +function SaveToFile($file, $s, $mode) +{ + $f=fopen($file,'w'.$mode); + if(!$f) + die('Can\'t write to file '.$file); + fwrite($f,$s,strlen($s)); + fclose($f); +} + +function ReadShort($f) +{ + $a=unpack('n1n',fread($f,2)); + return $a['n']; +} + +function ReadLong($f) +{ + $a=unpack('N1N',fread($f,4)); + return $a['N']; +} + +function CheckTTF($file) +{ + //Check if font license allows embedding + $f=fopen($file,'rb'); + if(!$f) + die('Error: Can\'t open '.$file); + //Extract number of tables + fseek($f,4,SEEK_CUR); + $nb=ReadShort($f); + fseek($f,6,SEEK_CUR); + //Seek OS/2 table + $found=false; + for($i=0;$i<$nb;$i++) + { + if(fread($f,4)=='OS/2') + { + $found=true; + break; + } + fseek($f,12,SEEK_CUR); + } + if(!$found) + { + fclose($f); + return; + } + fseek($f,4,SEEK_CUR); + $offset=ReadLong($f); + fseek($f,$offset,SEEK_SET); + //Extract fsType flags + fseek($f,8,SEEK_CUR); + $fsType=ReadShort($f); + $rl=($fsType & 0x02)!=0; + $pp=($fsType & 0x04)!=0; + $e=($fsType & 0x08)!=0; + fclose($f); + if($rl && !$pp && !$e) + echo 'Warning: font license does not allow embedding'; +} + +/******************************************************************************* +* fontfile: path to TTF file (or empty string if not to be embedded) * +* afmfile: path to AFM file * +* enc: font encoding (or empty string for symbolic fonts) * +* patch: optional patch for encoding * +* type: font type if fontfile is empty * +*******************************************************************************/ +function MakeFont($fontfile, $afmfile, $enc='cp1252', $patch=array(), $type='TrueType') +{ + //Generate a font definition file + if(get_magic_quotes_runtime()) + @set_magic_quotes_runtime(0); + ini_set('auto_detect_line_endings','1'); + if($enc) + { + $map=ReadMap($enc); + foreach($patch as $cc=>$gn) + $map[$cc]=$gn; + } + else + $map=array(); + if(!file_exists($afmfile)) + die('Error: AFM file not found: '.$afmfile); + $fm=ReadAFM($afmfile,$map); + if($enc) + $diff=MakeFontEncoding($map); + else + $diff=''; + $fd=MakeFontDescriptor($fm,empty($map)); + //Find font type + if($fontfile) + { + $ext=strtolower(substr($fontfile,-3)); + if($ext=='ttf') + $type='TrueType'; + elseif($ext=='pfb') + $type='Type1'; + else + die('Error: unrecognized font file extension: '.$ext); + } + else + { + if($type!='TrueType' && $type!='Type1') + die('Error: incorrect font type: '.$type); + } + //Start generation + $s='Error: font file not found: '.$fontfile); + if($type=='TrueType') + CheckTTF($fontfile); + $f=fopen($fontfile,'rb'); + if(!$f) + die('Error: Can\'t open '.$fontfile); + $file=fread($f,filesize($fontfile)); + fclose($f); + if($type=='Type1') + { + //Find first two sections and discard third one + $header=(ord($file[0])==128); + if($header) + { + //Strip first binary header + $file=substr($file,6); + } + $pos=strpos($file,'eexec'); + if(!$pos) + die('Error: font file does not seem to be valid Type1'); + $size1=$pos+6; + if($header && ord($file[$size1])==128) + { + //Strip second binary header + $file=substr($file,0,$size1).substr($file,$size1+6); + } + $pos=strpos($file,'00000000'); + if(!$pos) + die('Error: font file does not seem to be valid Type1'); + $size2=$pos-$size1; + $file=substr($file,0,$size1+$size2); + } + if(function_exists('gzcompress')) + { + $cmp=$basename.'.z'; + SaveToFile($cmp,gzcompress($file),'b'); + $s.='$file=\''.$cmp."';\n"; + echo 'Font file compressed ('.$cmp.')
'; + } + else + { + $s.='$file=\''.basename($fontfile)."';\n"; + echo 'Notice: font file could not be compressed (zlib extension not available)
'; + } + if($type=='Type1') + { + $s.='$size1='.$size1.";\n"; + $s.='$size2='.$size2.";\n"; + } + else + $s.='$originalsize='.filesize($fontfile).";\n"; + } + else + { + //Not embedded font + $s.='$file='."'';\n"; + } + $s.="?>\n"; + SaveToFile($basename.'.php',$s,'t'); + echo 'Font definition file generated ('.$basename.'.php'.')
'; +} +?> diff --git a/fpdf16/font/symbol.php b/fpdf16/font/symbol.php new file mode 100755 index 0000000..43b50e4 --- /dev/null +++ b/fpdf16/font/symbol.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549, + ','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722, + 'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768, + 'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576, + 'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0, + chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603, + chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768, + chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042, + chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329, + chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0); +?> diff --git a/fpdf16/font/times.php b/fpdf16/font/times.php new file mode 100755 index 0000000..837c706 --- /dev/null +++ b/fpdf16/font/times.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722, + 'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944, + 'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500); +?> diff --git a/fpdf16/font/timesb.php b/fpdf16/font/timesb.php new file mode 100755 index 0000000..09cff86 --- /dev/null +++ b/fpdf16/font/timesb.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000, + 'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833, + 'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/fpdf16/font/timesbi.php b/fpdf16/font/timesbi.php new file mode 100755 index 0000000..b4e38d7 --- /dev/null +++ b/fpdf16/font/timesbi.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667, + 'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889, + 'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444); +?> diff --git a/fpdf16/font/timesi.php b/fpdf16/font/timesi.php new file mode 100755 index 0000000..0ba2b77 --- /dev/null +++ b/fpdf16/font/timesi.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611, + 'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833, + 'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444); +?> diff --git a/fpdf16/font/zapfdingbats.php b/fpdf16/font/zapfdingbats.php new file mode 100755 index 0000000..1f926a8 --- /dev/null +++ b/fpdf16/font/zapfdingbats.php @@ -0,0 +1,15 @@ +0,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0, + chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939, + ','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692, + 'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776, + 'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873, + 'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317, + chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788, + chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788, + chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918, + chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874, + chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0); +?> diff --git a/fpdf16/fpdf.css b/fpdf16/fpdf.css new file mode 100755 index 0000000..dd2c540 --- /dev/null +++ b/fpdf16/fpdf.css @@ -0,0 +1,21 @@ +body {font-family:"Times New Roman",serif} +h1 {font:bold 135% Arial,sans-serif; color:#4000A0; margin-bottom:0.9em} +h2 {font:bold 95% Arial,sans-serif; color:#900000; margin-top:1.5em; margin-bottom:1em} +dl.param dt {text-decoration:underline} +dl.param dd {margin-top:1em; margin-bottom:1em} +dl.param ul {margin-top:1em; margin-bottom:1em} +tt, code, kbd {font-family:"Courier New",Courier,monospace; font-size:82%} +div.source {margin-top:1.4em; margin-bottom:1.3em} +div.source pre {display:table; border:1px solid #24246A; width:100%; margin:0em; font-family:inherit; font-size:100%} +div.source code {display:block; border:1px solid #C5C5EC; background-color:#F0F5FF; padding:6px; color:#000000} +div.doc-source {margin-top:1.4em; margin-bottom:1.3em} +div.doc-source pre {display:table; width:100%; margin:0em; font-family:inherit; font-size:100%} +div.doc-source code {display:block; background-color:#E0E0E0; padding:4px} +.kw {color:#000080; font-weight:bold} +.str {color:#CC0000} +.cmt {color:#008000} +p.demo {text-align:center; margin-top:-0.9em} +a.demo {text-decoration:none; font-weight:bold; color:#0000CC} +a.demo:link {text-decoration:none; font-weight:bold; color:#0000CC} +a.demo:hover {text-decoration:none; font-weight:bold; color:#0000FF} +a.demo:active {text-decoration:none; font-weight:bold; color:#0000FF} diff --git a/fpdf16/fpdf.php b/fpdf16/fpdf.php new file mode 100755 index 0000000..b27ca6d --- /dev/null +++ b/fpdf16/fpdf.php @@ -0,0 +1,1732 @@ +_dochecks(); + //Initialization of properties + $this->page=0; + $this->n=2; + $this->buffer=''; + $this->pages=array(); + $this->PageSizes=array(); + $this->state=0; + $this->fonts=array(); + $this->FontFiles=array(); + $this->diffs=array(); + $this->images=array(); + $this->links=array(); + $this->InHeader=false; + $this->InFooter=false; + $this->lasth=0; + $this->FontFamily=''; + $this->FontStyle=''; + $this->FontSizePt=12; + $this->underline=false; + $this->DrawColor='0 G'; + $this->FillColor='0 g'; + $this->TextColor='0 g'; + $this->ColorFlag=false; + $this->ws=0; + //Standard fonts + $this->CoreFonts=array('courier'=>'Courier', 'courierB'=>'Courier-Bold', 'courierI'=>'Courier-Oblique', 'courierBI'=>'Courier-BoldOblique', + 'helvetica'=>'Helvetica', 'helveticaB'=>'Helvetica-Bold', 'helveticaI'=>'Helvetica-Oblique', 'helveticaBI'=>'Helvetica-BoldOblique', + 'times'=>'Times-Roman', 'timesB'=>'Times-Bold', 'timesI'=>'Times-Italic', 'timesBI'=>'Times-BoldItalic', + 'symbol'=>'Symbol', 'zapfdingbats'=>'ZapfDingbats'); + //Scale factor + if($unit=='pt') + $this->k=1; + elseif($unit=='mm') + $this->k=72/25.4; + elseif($unit=='cm') + $this->k=72/2.54; + elseif($unit=='in') + $this->k=72; + else + $this->Error('Incorrect unit: '.$unit); + //Page format + $this->PageFormats=array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28), + 'letter'=>array(612,792), 'legal'=>array(612,1008)); + if(is_string($format)) + $format=$this->_getpageformat($format); + $this->DefPageFormat=$format; + $this->CurPageFormat=$format; + //Page orientation + $orientation=strtolower($orientation); + if($orientation=='p' || $orientation=='portrait') + { + $this->DefOrientation='P'; + $this->w=$this->DefPageFormat[0]; + $this->h=$this->DefPageFormat[1]; + } + elseif($orientation=='l' || $orientation=='landscape') + { + $this->DefOrientation='L'; + $this->w=$this->DefPageFormat[1]; + $this->h=$this->DefPageFormat[0]; + } + else + $this->Error('Incorrect orientation: '.$orientation); + $this->CurOrientation=$this->DefOrientation; + $this->wPt=$this->w*$this->k; + $this->hPt=$this->h*$this->k; + //Page margins (1 cm) + $margin=28.35/$this->k; + $this->SetMargins($margin,$margin); + //Interior cell margin (1 mm) + $this->cMargin=$margin/10; + //Line width (0.2 mm) + $this->LineWidth=.567/$this->k; + //Automatic page break + $this->SetAutoPageBreak(true,2*$margin); + //Full width display mode + $this->SetDisplayMode('fullwidth'); + //Enable compression + $this->SetCompression(true); + //Set default PDF version number + $this->PDFVersion='1.3'; +} + +function SetMargins($left, $top, $right=null) +{ + //Set left, top and right margins + $this->lMargin=$left; + $this->tMargin=$top; + if($right===null) + $right=$left; + $this->rMargin=$right; +} + +function SetLeftMargin($margin) +{ + //Set left margin + $this->lMargin=$margin; + if($this->page>0 && $this->x<$margin) + $this->x=$margin; +} + +function SetTopMargin($margin) +{ + //Set top margin + $this->tMargin=$margin; +} + +function SetRightMargin($margin) +{ + //Set right margin + $this->rMargin=$margin; +} + +function SetAutoPageBreak($auto, $margin=0) +{ + //Set auto page break mode and triggering margin + $this->AutoPageBreak=$auto; + $this->bMargin=$margin; + $this->PageBreakTrigger=$this->h-$margin; +} + +function SetDisplayMode($zoom, $layout='continuous') +{ + //Set display mode in viewer + if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom)) + $this->ZoomMode=$zoom; + else + $this->Error('Incorrect zoom display mode: '.$zoom); + if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default') + $this->LayoutMode=$layout; + else + $this->Error('Incorrect layout display mode: '.$layout); +} + +function SetCompression($compress) +{ + //Set page compression + if(function_exists('gzcompress')) + $this->compress=$compress; + else + $this->compress=false; +} + +function SetTitle($title, $isUTF8=false) +{ + //Title of document + if($isUTF8) + $title=$this->_UTF8toUTF16($title); + $this->title=$title; +} + +function SetSubject($subject, $isUTF8=false) +{ + //Subject of document + if($isUTF8) + $subject=$this->_UTF8toUTF16($subject); + $this->subject=$subject; +} + +function SetAuthor($author, $isUTF8=false) +{ + //Author of document + if($isUTF8) + $author=$this->_UTF8toUTF16($author); + $this->author=$author; +} + +function SetKeywords($keywords, $isUTF8=false) +{ + //Keywords of document + if($isUTF8) + $keywords=$this->_UTF8toUTF16($keywords); + $this->keywords=$keywords; +} + +function SetCreator($creator, $isUTF8=false) +{ + //Creator of document + if($isUTF8) + $creator=$this->_UTF8toUTF16($creator); + $this->creator=$creator; +} + +function AliasNbPages($alias='{nb}') +{ + //Define an alias for total number of pages + $this->AliasNbPages=$alias; +} + +function Error($msg) +{ + //Fatal error + die('FPDF error: '.$msg); +} + +function Open() +{ + //Begin document + $this->state=1; +} + +function Close() +{ + //Terminate document + if($this->state==3) + return; + if($this->page==0) + $this->AddPage(); + //Page footer + $this->InFooter=true; + $this->Footer(); + $this->InFooter=false; + //Close page + $this->_endpage(); + //Close document + $this->_enddoc(); +} + +function AddPage($orientation='', $format='') +{ + //Start a new page + if($this->state==0) + $this->Open(); + $family=$this->FontFamily; + $style=$this->FontStyle.($this->underline ? 'U' : ''); + $size=$this->FontSizePt; + $lw=$this->LineWidth; + $dc=$this->DrawColor; + $fc=$this->FillColor; + $tc=$this->TextColor; + $cf=$this->ColorFlag; + if($this->page>0) + { + //Page footer + $this->InFooter=true; + $this->Footer(); + $this->InFooter=false; + //Close page + $this->_endpage(); + } + //Start new page + $this->_beginpage($orientation,$format); + //Set line cap style to square + $this->_out('2 J'); + //Set line width + $this->LineWidth=$lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + //Set font + if($family) + $this->SetFont($family,$style,$size); + //Set colors + $this->DrawColor=$dc; + if($dc!='0 G') + $this->_out($dc); + $this->FillColor=$fc; + if($fc!='0 g') + $this->_out($fc); + $this->TextColor=$tc; + $this->ColorFlag=$cf; + //Page header + $this->InHeader=true; + $this->Header(); + $this->InHeader=false; + //Restore line width + if($this->LineWidth!=$lw) + { + $this->LineWidth=$lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + } + //Restore font + if($family) + $this->SetFont($family,$style,$size); + //Restore colors + if($this->DrawColor!=$dc) + { + $this->DrawColor=$dc; + $this->_out($dc); + } + if($this->FillColor!=$fc) + { + $this->FillColor=$fc; + $this->_out($fc); + } + $this->TextColor=$tc; + $this->ColorFlag=$cf; +} + +function Header() +{ + //To be implemented in your own inherited class +} + +function Footer() +{ + //To be implemented in your own inherited class +} + +function PageNo() +{ + //Get current page number + return $this->page; +} + +function SetDrawColor($r, $g=null, $b=null) +{ + //Set color for all stroking operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->DrawColor=sprintf('%.3F G',$r/255); + else + $this->DrawColor=sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255); + if($this->page>0) + $this->_out($this->DrawColor); +} + +function SetFillColor($r, $g=null, $b=null) +{ + //Set color for all filling operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->FillColor=sprintf('%.3F g',$r/255); + else + $this->FillColor=sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag=($this->FillColor!=$this->TextColor); + if($this->page>0) + $this->_out($this->FillColor); +} + +function SetTextColor($r, $g=null, $b=null) +{ + //Set color for text + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->TextColor=sprintf('%.3F g',$r/255); + else + $this->TextColor=sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag=($this->FillColor!=$this->TextColor); +} + +function GetStringWidth($s) +{ + //Get width of a string in the current font + $s=(string)$s; + $cw=&$this->CurrentFont['cw']; + $w=0; + $l=strlen($s); + for($i=0;$i<$l;$i++) + $w+=$cw[$s[$i]]; + return $w*$this->FontSize/1000; +} + +function SetLineWidth($width) +{ + //Set line width + $this->LineWidth=$width; + if($this->page>0) + $this->_out(sprintf('%.2F w',$width*$this->k)); +} + +function Line($x1, $y1, $x2, $y2) +{ + //Draw a line + $this->_out(sprintf('%.2F %.2F m %.2F %.2F l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k)); +} + +function Rect($x, $y, $w, $h, $style='') +{ + //Draw a rectangle + if($style=='F') + $op='f'; + elseif($style=='FD' || $style=='DF') + $op='B'; + else + $op='S'; + $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op)); +} + +function AddFont($family, $style='', $file='') +{ + //Add a TrueType or Type1 font + $family=strtolower($family); + if($file=='') + $file=str_replace(' ','',$family).strtolower($style).'.php'; + if($family=='arial') + $family='helvetica'; + $style=strtoupper($style); + if($style=='IB') + $style='BI'; + $fontkey=$family.$style; + if(isset($this->fonts[$fontkey])) + return; + include($this->_getfontpath().$file); + if(!isset($name)) + $this->Error('Could not include font definition file'); + $i=count($this->fonts)+1; + $this->fonts[$fontkey]=array('i'=>$i, 'type'=>$type, 'name'=>$name, 'desc'=>$desc, 'up'=>$up, 'ut'=>$ut, 'cw'=>$cw, 'enc'=>$enc, 'file'=>$file); + if($diff) + { + //Search existing encodings + $d=0; + $nb=count($this->diffs); + for($i=1;$i<=$nb;$i++) + { + if($this->diffs[$i]==$diff) + { + $d=$i; + break; + } + } + if($d==0) + { + $d=$nb+1; + $this->diffs[$d]=$diff; + } + $this->fonts[$fontkey]['diff']=$d; + } + if($file) + { + if($type=='TrueType') + $this->FontFiles[$file]=array('length1'=>$originalsize); + else + $this->FontFiles[$file]=array('length1'=>$size1, 'length2'=>$size2); + } +} + +function SetFont($family, $style='', $size=0) +{ + //Select a font; size given in points + global $fpdf_charwidths; + + $family=strtolower($family); + if($family=='') + $family=$this->FontFamily; + if($family=='arial') + $family='helvetica'; + elseif($family=='symbol' || $family=='zapfdingbats') + $style=''; + $style=strtoupper($style); + if(strpos($style,'U')!==false) + { + $this->underline=true; + $style=str_replace('U','',$style); + } + else + $this->underline=false; + if($style=='IB') + $style='BI'; + if($size==0) + $size=$this->FontSizePt; + //Test if font is already selected + if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size) + return; + //Test if used for the first time + $fontkey=$family.$style; + if(!isset($this->fonts[$fontkey])) + { + //Check if one of the standard fonts + if(isset($this->CoreFonts[$fontkey])) + { + if(!isset($fpdf_charwidths[$fontkey])) + { + //Load metric file + $file=$family; + if($family=='times' || $family=='helvetica') + $file.=strtolower($style); + include($this->_getfontpath().$file.'.php'); + if(!isset($fpdf_charwidths[$fontkey])) + $this->Error('Could not include font metric file'); + } + $i=count($this->fonts)+1; + $name=$this->CoreFonts[$fontkey]; + $cw=$fpdf_charwidths[$fontkey]; + $this->fonts[$fontkey]=array('i'=>$i, 'type'=>'core', 'name'=>$name, 'up'=>-100, 'ut'=>50, 'cw'=>$cw); + } + else + $this->Error('Undefined font: '.$family.' '.$style); + } + //Select it + $this->FontFamily=$family; + $this->FontStyle=$style; + $this->FontSizePt=$size; + $this->FontSize=$size/$this->k; + $this->CurrentFont=&$this->fonts[$fontkey]; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function SetFontSize($size) +{ + //Set font size in points + if($this->FontSizePt==$size) + return; + $this->FontSizePt=$size; + $this->FontSize=$size/$this->k; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function AddLink() +{ + //Create a new internal link + $n=count($this->links)+1; + $this->links[$n]=array(0, 0); + return $n; +} + +function SetLink($link, $y=0, $page=-1) +{ + //Set destination of internal link + if($y==-1) + $y=$this->y; + if($page==-1) + $page=$this->page; + $this->links[$link]=array($page, $y); +} + +function Link($x, $y, $w, $h, $link) +{ + //Put a link on the page + $this->PageLinks[$this->page][]=array($x*$this->k, $this->hPt-$y*$this->k, $w*$this->k, $h*$this->k, $link); +} + +function Text($x, $y, $txt) +{ + //Output a string + $s=sprintf('BT %.2F %.2F Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt)); + if($this->underline && $txt!='') + $s.=' '.$this->_dounderline($x,$y,$txt); + if($this->ColorFlag) + $s='q '.$this->TextColor.' '.$s.' Q'; + $this->_out($s); +} + +function AcceptPageBreak() +{ + //Accept automatic page break or not + return $this->AutoPageBreak; +} + +function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='') +{ + //Output a cell + $k=$this->k; + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + //Automatic page break + $x=$this->x; + $ws=$this->ws; + if($ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->AddPage($this->CurOrientation,$this->CurPageFormat); + $this->x=$x; + if($ws>0) + { + $this->ws=$ws; + $this->_out(sprintf('%.3F Tw',$ws*$k)); + } + } + if($w==0) + $w=$this->w-$this->rMargin-$this->x; + $s=''; + if($fill || $border==1) + { + if($fill) + $op=($border==1) ? 'B' : 'f'; + else + $op='S'; + $s=sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op); + } + if(is_string($border)) + { + $x=$this->x; + $y=$this->y; + if(strpos($border,'L')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k); + if(strpos($border,'T')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k); + if(strpos($border,'R')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + if(strpos($border,'B')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + } + if($txt!=='') + { + if($align=='R') + $dx=$w-$this->cMargin-$this->GetStringWidth($txt); + elseif($align=='C') + $dx=($w-$this->GetStringWidth($txt))/2; + else + $dx=$this->cMargin; + if($this->ColorFlag) + $s.='q '.$this->TextColor.' '; + $txt2=str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt))); + $s.=sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2); + if($this->underline) + $s.=' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt); + if($this->ColorFlag) + $s.=' Q'; + if($link) + $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link); + } + if($s) + $this->_out($s); + $this->lasth=$h; + if($ln>0) + { + //Go to next line + $this->y+=$h; + if($ln==1) + $this->x=$this->lMargin; + } + else + $this->x+=$w; +} + +function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false) +{ + //Output text with automatic or explicit line breaks + $cw=&$this->CurrentFont['cw']; + if($w==0) + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $s=str_replace("\r",'',$txt); + $nb=strlen($s); + if($nb>0 && $s[$nb-1]=="\n") + $nb--; + $b=0; + if($border) + { + if($border==1) + { + $border='LTRB'; + $b='LRT'; + $b2='LR'; + } + else + { + $b2=''; + if(strpos($border,'L')!==false) + $b2.='L'; + if(strpos($border,'R')!==false) + $b2.='R'; + $b=(strpos($border,'T')!==false) ? $b2.'T' : $b2; + } + } + $sep=-1; + $i=0; + $j=0; + $l=0; + $ns=0; + $nl=1; + while($i<$nb) + { + //Get next character + $c=$s[$i]; + if($c=="\n") + { + //Explicit line break + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $i++; + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border && $nl==2) + $b=$b2; + continue; + } + if($c==' ') + { + $sep=$i; + $ls=$l; + $ns++; + } + $l+=$cw[$c]; + if($l>$wmax) + { + //Automatic line break + if($sep==-1) + { + if($i==$j) + $i++; + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + } + else + { + if($align=='J') + { + $this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; + $this->_out(sprintf('%.3F Tw',$this->ws*$this->k)); + } + $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border && $nl==2) + $b=$b2; + } + else + $i++; + } + //Last chunk + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + if($border && strpos($border,'B')!==false) + $b.='B'; + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $this->x=$this->lMargin; +} + +function Write($h, $txt, $link='') +{ + //Output text in flowing mode + $cw=&$this->CurrentFont['cw']; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $s=str_replace("\r",'',$txt); + $nb=strlen($s); + $sep=-1; + $i=0; + $j=0; + $l=0; + $nl=1; + while($i<$nb) + { + //Get next character + $c=$s[$i]; + if($c=="\n") + { + //Explicit line break + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); + $i++; + $sep=-1; + $j=$i; + $l=0; + if($nl==1) + { + $this->x=$this->lMargin; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + continue; + } + if($c==' ') + $sep=$i; + $l+=$cw[$c]; + if($l>$wmax) + { + //Automatic line break + if($sep==-1) + { + if($this->x>$this->lMargin) + { + //Move to next line + $this->x=$this->lMargin; + $this->y+=$h; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $i++; + $nl++; + continue; + } + if($i==$j) + $i++; + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); + } + else + { + $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + if($nl==1) + { + $this->x=$this->lMargin; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + } + else + $i++; + } + //Last chunk + if($i!=$j) + $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link); +} + +function Ln($h=null) +{ + //Line feed; default value is last cell height + $this->x=$this->lMargin; + if($h===null) + $this->y+=$this->lasth; + else + $this->y+=$h; +} + +function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='') +{ + //Put an image on the page + if(!isset($this->images[$file])) + { + //First use of this image, get info + if($type=='') + { + $pos=strrpos($file,'.'); + if(!$pos) + $this->Error('Image file has no extension and no type was specified: '.$file); + $type=substr($file,$pos+1); + } + $type=strtolower($type); + if($type=='jpeg') + $type='jpg'; + $mtd='_parse'.$type; + if(!method_exists($this,$mtd)) + $this->Error('Unsupported image type: '.$type); + $info=$this->$mtd($file); + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + else + $info=$this->images[$file]; + //Automatic width and height calculation if needed + if($w==0 && $h==0) + { + //Put image at 72 dpi + $w=$info['w']/$this->k; + $h=$info['h']/$this->k; + } + elseif($w==0) + $w=$h*$info['w']/$info['h']; + elseif($h==0) + $h=$w*$info['h']/$info['w']; + //Flowing mode + if($y===null) + { + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + //Automatic page break + $x2=$this->x; + $this->AddPage($this->CurOrientation,$this->CurPageFormat); + $this->x=$x2; + } + $y=$this->y; + $this->y+=$h; + } + if($x===null) + $x=$this->x; + $this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i'])); + if($link) + $this->Link($x,$y,$w,$h,$link); +} + +function GetX() +{ + //Get x position + return $this->x; +} + +function SetX($x) +{ + //Set x position + if($x>=0) + $this->x=$x; + else + $this->x=$this->w+$x; +} + +function GetY() +{ + //Get y position + return $this->y; +} + +function SetY($y) +{ + //Set y position and reset x + $this->x=$this->lMargin; + if($y>=0) + $this->y=$y; + else + $this->y=$this->h+$y; +} + +function SetXY($x, $y) +{ + //Set x and y positions + $this->SetY($y); + $this->SetX($x); +} + +function Output($name='', $dest='') +{ + //Output PDF to some destination + if($this->state<3) + $this->Close(); + $dest=strtoupper($dest); + if($dest=='') + { + if($name=='') + { + $name='doc.pdf'; + $dest='I'; + } + else + $dest='F'; + } + switch($dest) + { + case 'I': + //Send to standard output + if(ob_get_length()) + $this->Error('Some data has already been output, can\'t send PDF file'); + if(php_sapi_name()!='cli') + { + //We send to a browser + header('Content-Type: application/pdf'); + if(headers_sent()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Length: '.strlen($this->buffer)); + header('Content-Disposition: inline; filename="'.$name.'"'); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + ini_set('zlib.output_compression','0'); + } + echo $this->buffer; + break; + case 'D': + //Download file + if(ob_get_length()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Type: application/x-download'); + if(headers_sent()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Length: '.strlen($this->buffer)); + header('Content-Disposition: attachment; filename="'.$name.'"'); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + ini_set('zlib.output_compression','0'); + echo $this->buffer; + break; + case 'F': + //Save to local file + $f=fopen($name,'wb'); + if(!$f) + $this->Error('Unable to create output file: '.$name); + fwrite($f,$this->buffer,strlen($this->buffer)); + fclose($f); + break; + case 'S': + //Return as a string + return $this->buffer; + default: + $this->Error('Incorrect output destination: '.$dest); + } + return ''; +} + +/******************************************************************************* +* * +* Protected methods * +* * +*******************************************************************************/ +function _dochecks() +{ + //Check availability of %F + if(sprintf('%.1F',1.0)!='1.0') + $this->Error('This version of PHP is not supported'); + //Check mbstring overloading + if(ini_get('mbstring.func_overload') & 2) + $this->Error('mbstring overloading must be disabled'); + //Disable runtime magic quotes + if(get_magic_quotes_runtime()) + @set_magic_quotes_runtime(0); +} + +function _getpageformat($format) +{ + $format=strtolower($format); + if(!isset($this->PageFormats[$format])) + $this->Error('Unknown page format: '.$format); + $a=$this->PageFormats[$format]; + return array($a[0]/$this->k, $a[1]/$this->k); +} + +function _getfontpath() +{ + if(!defined('FPDF_FONTPATH') && is_dir(dirname(__FILE__).'/font')) + define('FPDF_FONTPATH',dirname(__FILE__).'/font/'); + return defined('FPDF_FONTPATH') ? FPDF_FONTPATH : ''; +} + +function _beginpage($orientation, $format) +{ + $this->page++; + $this->pages[$this->page]=''; + $this->state=2; + $this->x=$this->lMargin; + $this->y=$this->tMargin; + $this->FontFamily=''; + //Check page size + if($orientation=='') + $orientation=$this->DefOrientation; + else + $orientation=strtoupper($orientation[0]); + if($format=='') + $format=$this->DefPageFormat; + else + { + if(is_string($format)) + $format=$this->_getpageformat($format); + } + if($orientation!=$this->CurOrientation || $format[0]!=$this->CurPageFormat[0] || $format[1]!=$this->CurPageFormat[1]) + { + //New size + if($orientation=='P') + { + $this->w=$format[0]; + $this->h=$format[1]; + } + else + { + $this->w=$format[1]; + $this->h=$format[0]; + } + $this->wPt=$this->w*$this->k; + $this->hPt=$this->h*$this->k; + $this->PageBreakTrigger=$this->h-$this->bMargin; + $this->CurOrientation=$orientation; + $this->CurPageFormat=$format; + } + if($orientation!=$this->DefOrientation || $format[0]!=$this->DefPageFormat[0] || $format[1]!=$this->DefPageFormat[1]) + $this->PageSizes[$this->page]=array($this->wPt, $this->hPt); +} + +function _endpage() +{ + $this->state=1; +} + +function _escape($s) +{ + //Escape special characters in strings + $s=str_replace('\\','\\\\',$s); + $s=str_replace('(','\\(',$s); + $s=str_replace(')','\\)',$s); + $s=str_replace("\r",'\\r',$s); + return $s; +} + +function _textstring($s) +{ + //Format a text string + return '('.$this->_escape($s).')'; +} + +function _UTF8toUTF16($s) +{ + //Convert UTF-8 to UTF-16BE with BOM + $res="\xFE\xFF"; + $nb=strlen($s); + $i=0; + while($i<$nb) + { + $c1=ord($s[$i++]); + if($c1>=224) + { + //3-byte character + $c2=ord($s[$i++]); + $c3=ord($s[$i++]); + $res.=chr((($c1 & 0x0F)<<4) + (($c2 & 0x3C)>>2)); + $res.=chr((($c2 & 0x03)<<6) + ($c3 & 0x3F)); + } + elseif($c1>=192) + { + //2-byte character + $c2=ord($s[$i++]); + $res.=chr(($c1 & 0x1C)>>2); + $res.=chr((($c1 & 0x03)<<6) + ($c2 & 0x3F)); + } + else + { + //Single-byte character + $res.="\0".chr($c1); + } + } + return $res; +} + +function _dounderline($x, $y, $txt) +{ + //Underline text + $up=$this->CurrentFont['up']; + $ut=$this->CurrentFont['ut']; + $w=$this->GetStringWidth($txt)+$this->ws*substr_count($txt,' '); + return sprintf('%.2F %.2F %.2F %.2F re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt); +} + +function _parsejpg($file) +{ + //Extract info from a JPEG file + $a=GetImageSize($file); + if(!$a) + $this->Error('Missing or incorrect image file: '.$file); + if($a[2]!=2) + $this->Error('Not a JPEG file: '.$file); + if(!isset($a['channels']) || $a['channels']==3) + $colspace='DeviceRGB'; + elseif($a['channels']==4) + $colspace='DeviceCMYK'; + else + $colspace='DeviceGray'; + $bpc=isset($a['bits']) ? $a['bits'] : 8; + //Read whole file + $f=fopen($file,'rb'); + $data=''; + while(!feof($f)) + $data.=fread($f,8192); + fclose($f); + return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data); +} + +function _parsepng($file) +{ + //Extract info from a PNG file + $f=fopen($file,'rb'); + if(!$f) + $this->Error('Can\'t open image file: '.$file); + //Check signature + if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) + $this->Error('Not a PNG file: '.$file); + //Read header chunk + $this->_readstream($f,4); + if($this->_readstream($f,4)!='IHDR') + $this->Error('Incorrect PNG file: '.$file); + $w=$this->_readint($f); + $h=$this->_readint($f); + $bpc=ord($this->_readstream($f,1)); + if($bpc>8) + $this->Error('16-bit depth not supported: '.$file); + $ct=ord($this->_readstream($f,1)); + if($ct==0) + $colspace='DeviceGray'; + elseif($ct==2) + $colspace='DeviceRGB'; + elseif($ct==3) + $colspace='Indexed'; + else + $this->Error('Alpha channel not supported: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown compression method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown filter method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Interlacing not supported: '.$file); + $this->_readstream($f,4); + $parms='/DecodeParms <>'; + //Scan chunks looking for palette, transparency and image data + $pal=''; + $trns=''; + $data=''; + do + { + $n=$this->_readint($f); + $type=$this->_readstream($f,4); + if($type=='PLTE') + { + //Read palette + $pal=$this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='tRNS') + { + //Read transparency info + $t=$this->_readstream($f,$n); + if($ct==0) + $trns=array(ord(substr($t,1,1))); + elseif($ct==2) + $trns=array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1))); + else + { + $pos=strpos($t,chr(0)); + if($pos!==false) + $trns=array($pos); + } + $this->_readstream($f,4); + } + elseif($type=='IDAT') + { + //Read image data block + $data.=$this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='IEND') + break; + else + $this->_readstream($f,$n+4); + } + while($n); + if($colspace=='Indexed' && empty($pal)) + $this->Error('Missing palette in '.$file); + fclose($f); + return array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'parms'=>$parms, 'pal'=>$pal, 'trns'=>$trns, 'data'=>$data); +} + +function _readstream($f, $n) +{ + //Read n bytes from stream + $res=''; + while($n>0 && !feof($f)) + { + $s=fread($f,$n); + if($s===false) + $this->Error('Error while reading stream'); + $n-=strlen($s); + $res.=$s; + } + if($n>0) + $this->Error('Unexpected end of stream'); + return $res; +} + +function _readint($f) +{ + //Read a 4-byte integer from stream + $a=unpack('Ni',$this->_readstream($f,4)); + return $a['i']; +} + +function _parsegif($file) +{ + //Extract info from a GIF file (via PNG conversion) + if(!function_exists('imagepng')) + $this->Error('GD extension is required for GIF support'); + if(!function_exists('imagecreatefromgif')) + $this->Error('GD has no GIF read support'); + $im=imagecreatefromgif($file); + if(!$im) + $this->Error('Missing or incorrect image file: '.$file); + imageinterlace($im,0); + $tmp=tempnam('.','gif'); + if(!$tmp) + $this->Error('Unable to create a temporary file'); + if(!imagepng($im,$tmp)) + $this->Error('Error while saving to temporary file'); + imagedestroy($im); + $info=$this->_parsepng($tmp); + unlink($tmp); + return $info; +} + +function _newobj() +{ + //Begin a new object + $this->n++; + $this->offsets[$this->n]=strlen($this->buffer); + $this->_out($this->n.' 0 obj'); +} + +function _putstream($s) +{ + $this->_out('stream'); + $this->_out($s); + $this->_out('endstream'); +} + +function _out($s) +{ + //Add a line to the document + if($this->state==2) + $this->pages[$this->page].=$s."\n"; + else + $this->buffer.=$s."\n"; +} + +function _putpages() +{ + $nb=$this->page; + if(!empty($this->AliasNbPages)) + { + //Replace number of pages + for($n=1;$n<=$nb;$n++) + $this->pages[$n]=str_replace($this->AliasNbPages,$nb,$this->pages[$n]); + } + if($this->DefOrientation=='P') + { + $wPt=$this->DefPageFormat[0]*$this->k; + $hPt=$this->DefPageFormat[1]*$this->k; + } + else + { + $wPt=$this->DefPageFormat[1]*$this->k; + $hPt=$this->DefPageFormat[0]*$this->k; + } + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + for($n=1;$n<=$nb;$n++) + { + //Page + $this->_newobj(); + $this->_out('<_out('/Parent 1 0 R'); + if(isset($this->PageSizes[$n])) + $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageSizes[$n][0],$this->PageSizes[$n][1])); + $this->_out('/Resources 2 0 R'); + if(isset($this->PageLinks[$n])) + { + //Links + $annots='/Annots ['; + foreach($this->PageLinks[$n] as $pl) + { + $rect=sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); + $annots.='<_textstring($pl[4]).'>>>>'; + else + { + $l=$this->links[$pl[4]]; + $h=isset($this->PageSizes[$l[0]]) ? $this->PageSizes[$l[0]][1] : $hPt; + $annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',1+2*$l[0],$h-$l[1]*$this->k); + } + } + $this->_out($annots.']'); + } + $this->_out('/Contents '.($this->n+1).' 0 R>>'); + $this->_out('endobj'); + //Page content + $p=($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n]; + $this->_newobj(); + $this->_out('<<'.$filter.'/Length '.strlen($p).'>>'); + $this->_putstream($p); + $this->_out('endobj'); + } + //Pages root + $this->offsets[1]=strlen($this->buffer); + $this->_out('1 0 obj'); + $this->_out('<_out($kids.']'); + $this->_out('/Count '.$nb); + $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$wPt,$hPt)); + $this->_out('>>'); + $this->_out('endobj'); +} + +function _putfonts() +{ + $nf=$this->n; + foreach($this->diffs as $diff) + { + //Encodings + $this->_newobj(); + $this->_out('<>'); + $this->_out('endobj'); + } + foreach($this->FontFiles as $file=>$info) + { + //Font file embedding + $this->_newobj(); + $this->FontFiles[$file]['n']=$this->n; + $font=''; + $f=fopen($this->_getfontpath().$file,'rb',1); + if(!$f) + $this->Error('Font file not found'); + while(!feof($f)) + $font.=fread($f,8192); + fclose($f); + $compressed=(substr($file,-2)=='.z'); + if(!$compressed && isset($info['length2'])) + { + $header=(ord($font[0])==128); + if($header) + { + //Strip first binary header + $font=substr($font,6); + } + if($header && ord($font[$info['length1']])==128) + { + //Strip second binary header + $font=substr($font,0,$info['length1']).substr($font,$info['length1']+6); + } + } + $this->_out('<_out('/Filter /FlateDecode'); + $this->_out('/Length1 '.$info['length1']); + if(isset($info['length2'])) + $this->_out('/Length2 '.$info['length2'].' /Length3 0'); + $this->_out('>>'); + $this->_putstream($font); + $this->_out('endobj'); + } + foreach($this->fonts as $k=>$font) + { + //Font objects + $this->fonts[$k]['n']=$this->n+1; + $type=$font['type']; + $name=$font['name']; + if($type=='core') + { + //Standard font + $this->_newobj(); + $this->_out('<_out('/BaseFont /'.$name); + $this->_out('/Subtype /Type1'); + if($name!='Symbol' && $name!='ZapfDingbats') + $this->_out('/Encoding /WinAnsiEncoding'); + $this->_out('>>'); + $this->_out('endobj'); + } + elseif($type=='Type1' || $type=='TrueType') + { + //Additional Type1 or TrueType font + $this->_newobj(); + $this->_out('<_out('/BaseFont /'.$name); + $this->_out('/Subtype /'.$type); + $this->_out('/FirstChar 32 /LastChar 255'); + $this->_out('/Widths '.($this->n+1).' 0 R'); + $this->_out('/FontDescriptor '.($this->n+2).' 0 R'); + if($font['enc']) + { + if(isset($font['diff'])) + $this->_out('/Encoding '.($nf+$font['diff']).' 0 R'); + else + $this->_out('/Encoding /WinAnsiEncoding'); + } + $this->_out('>>'); + $this->_out('endobj'); + //Widths + $this->_newobj(); + $cw=&$font['cw']; + $s='['; + for($i=32;$i<=255;$i++) + $s.=$cw[chr($i)].' '; + $this->_out($s.']'); + $this->_out('endobj'); + //Descriptor + $this->_newobj(); + $s='<$v) + $s.=' /'.$k.' '.$v; + $file=$font['file']; + if($file) + $s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R'; + $this->_out($s.'>>'); + $this->_out('endobj'); + } + else + { + //Allow for additional types + $mtd='_put'.strtolower($type); + if(!method_exists($this,$mtd)) + $this->Error('Unsupported font type: '.$type); + $this->$mtd($font); + } + } +} + +function _putimages() +{ + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->images); + while(list($file,$info)=each($this->images)) + { + $this->_newobj(); + $this->images[$file]['n']=$this->n; + $this->_out('<_out('/Subtype /Image'); + $this->_out('/Width '.$info['w']); + $this->_out('/Height '.$info['h']); + if($info['cs']=='Indexed') + $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]'); + else + { + $this->_out('/ColorSpace /'.$info['cs']); + if($info['cs']=='DeviceCMYK') + $this->_out('/Decode [1 0 1 0 1 0 1 0]'); + } + $this->_out('/BitsPerComponent '.$info['bpc']); + if(isset($info['f'])) + $this->_out('/Filter /'.$info['f']); + if(isset($info['parms'])) + $this->_out($info['parms']); + if(isset($info['trns']) && is_array($info['trns'])) + { + $trns=''; + for($i=0;$i_out('/Mask ['.$trns.']'); + } + $this->_out('/Length '.strlen($info['data']).'>>'); + $this->_putstream($info['data']); + unset($this->images[$file]['data']); + $this->_out('endobj'); + //Palette + if($info['cs']=='Indexed') + { + $this->_newobj(); + $pal=($this->compress) ? gzcompress($info['pal']) : $info['pal']; + $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>'); + $this->_putstream($pal); + $this->_out('endobj'); + } + } +} + +function _putxobjectdict() +{ + foreach($this->images as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); +} + +function _putresourcedict() +{ + $this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + $this->_out('/Font <<'); + foreach($this->fonts as $font) + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_out('>>'); + $this->_out('/XObject <<'); + $this->_putxobjectdict(); + $this->_out('>>'); +} + +function _putresources() +{ + $this->_putfonts(); + $this->_putimages(); + //Resource dictionary + $this->offsets[2]=strlen($this->buffer); + $this->_out('2 0 obj'); + $this->_out('<<'); + $this->_putresourcedict(); + $this->_out('>>'); + $this->_out('endobj'); +} + +function _putinfo() +{ + $this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION)); + if(!empty($this->title)) + $this->_out('/Title '.$this->_textstring($this->title)); + if(!empty($this->subject)) + $this->_out('/Subject '.$this->_textstring($this->subject)); + if(!empty($this->author)) + $this->_out('/Author '.$this->_textstring($this->author)); + if(!empty($this->keywords)) + $this->_out('/Keywords '.$this->_textstring($this->keywords)); + if(!empty($this->creator)) + $this->_out('/Creator '.$this->_textstring($this->creator)); + $this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis'))); +} + +function _putcatalog() +{ + $this->_out('/Type /Catalog'); + $this->_out('/Pages 1 0 R'); + if($this->ZoomMode=='fullpage') + $this->_out('/OpenAction [3 0 R /Fit]'); + elseif($this->ZoomMode=='fullwidth') + $this->_out('/OpenAction [3 0 R /FitH null]'); + elseif($this->ZoomMode=='real') + $this->_out('/OpenAction [3 0 R /XYZ null null 1]'); + elseif(!is_string($this->ZoomMode)) + $this->_out('/OpenAction [3 0 R /XYZ null null '.($this->ZoomMode/100).']'); + if($this->LayoutMode=='single') + $this->_out('/PageLayout /SinglePage'); + elseif($this->LayoutMode=='continuous') + $this->_out('/PageLayout /OneColumn'); + elseif($this->LayoutMode=='two') + $this->_out('/PageLayout /TwoColumnLeft'); +} + +function _putheader() +{ + $this->_out('%PDF-'.$this->PDFVersion); +} + +function _puttrailer() +{ + $this->_out('/Size '.($this->n+1)); + $this->_out('/Root '.$this->n.' 0 R'); + $this->_out('/Info '.($this->n-1).' 0 R'); +} + +function _enddoc() +{ + $this->_putheader(); + $this->_putpages(); + $this->_putresources(); + //Info + $this->_newobj(); + $this->_out('<<'); + $this->_putinfo(); + $this->_out('>>'); + $this->_out('endobj'); + //Catalog + $this->_newobj(); + $this->_out('<<'); + $this->_putcatalog(); + $this->_out('>>'); + $this->_out('endobj'); + //Cross-ref + $o=strlen($this->buffer); + $this->_out('xref'); + $this->_out('0 '.($this->n+1)); + $this->_out('0000000000 65535 f '); + for($i=1;$i<=$this->n;$i++) + $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i])); + //Trailer + $this->_out('trailer'); + $this->_out('<<'); + $this->_puttrailer(); + $this->_out('>>'); + $this->_out('startxref'); + $this->_out($o); + $this->_out('%%EOF'); + $this->state=3; +} +//End of class +} + +//Handle special IE contype request +if(isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT']=='contype') +{ + header('Content-Type: application/pdf'); + exit; +} + +?> diff --git a/fpdf16/histo.htm b/fpdf16/histo.htm new file mode 100755 index 0000000..7097fd8 --- /dev/null +++ b/fpdf16/histo.htm @@ -0,0 +1,128 @@ + + + + +History + + + + +

History

+
+
v1.6 (2008-08-03)
+
+- GIF image support.
+- Images can now trigger page breaks.
+- Possibility to have different page formats in a single document.
+- Document properties (author, creator, keywords, subject and title) can now be specified in UTF-8.
+- Fixed a bug: when a PNG was inserted through a URL, an error sometimes occurred.
+- An automatic page break in Header() doesn't cause an infinite loop any more.
+- Removed some warning messages appearing with recent PHP versions.
+- Added HTTP headers to reduce problems with IE.
+
+
v1.53 (2004-12-31)
+
+- When the font subdirectory is in the same directory as fpdf.php, it is no longer necessary to define the FPDF_FONTPATH constant.
+- The array $HTTP_SERVER_VARS is no longer used. It could cause trouble on PHP5-based configurations with the register_long_arrays option disabled.
+- Fixed a problem related to Type1 font embedding which caused trouble to some PDF processors.
+- The file name sent to the browser could not contain a space character.
+- The Cell() method could not print the number 0 (you had to pass the string '0').
+
+
v1.52 (2003-12-30)
+
+- Image() now displays the image at 72 dpi if no dimension is given.
+- Output() takes a string as second parameter to indicate destination.
+- Open() is now called automatically by AddPage().
+- Inserting remote JPEG images doesn't generate an error any longer.
+- Decimal separator is forced to dot in the constructor.
+- Added several encodings (Turkish, Thai, Hebrew, Ukrainian and Vietnamese).
+- The last line of a right-aligned MultiCell() was not correctly aligned if it was terminated by a carriage return.
+- No more error message about already sent headers when outputting the PDF to the standard output from the command line.
+- The underlining was going too far for text containing characters \, ( or ).
+- $HTTP_ENV_VARS has been replaced by $HTTP_SERVER_VARS.
+
+
v1.51 (2002-08-03)
+
+- Type1 font support.
+- Added Baltic encoding.
+- The class now works internally in points with the origin at the bottom in order to avoid two bugs occurring with Acrobat 5 :
  * The line thickness was too large when printed under Windows 98 SE and ME.
  * TrueType fonts didn't appear immediately inside the plug-in (a substitution font was used), one had to cause a window refresh to make them show up.
+- It is no longer necessary to set the decimal separator as dot to produce valid documents.
+- The clickable area in a cell was always on the left independently from the text alignment.
+- JPEG images in CMYK mode appeared in inverted colors.
+- Transparent PNG images in grayscale or true color mode were incorrectly handled.
+- Adding new fonts now works correctly even with the magic_quotes_runtime option set to on.
+
+
v1.5 (2002-05-28)
+
+- TrueType font (AddFont()) and encoding support (Western and Eastern Europe, Cyrillic and Greek).
+- Added Write() method.
+- Added underlined style.
+- Internal and external link support (AddLink(), SetLink(), Link()).
+- Added right margin management and methods SetRightMargin(), SetTopMargin().
+- Modification of SetDisplayMode() to select page layout.
+- The border parameter of MultiCell() now lets choose borders to draw as Cell().
+- When a document contains no page, Close() now calls AddPage() instead of causing a fatal error.
+
+
v1.41 (2002-03-13)
+
+- Fixed SetDisplayMode() which no longer worked (the PDF viewer used its default display).
+
+
v1.4 (2002-03-02)
+
+- PHP3 is no longer supported.
+- Page compression (SetCompression()).
+- Choice of page format and possibility to change orientation inside document.
+- Added AcceptPageBreak() method.
+- Ability to print the total number of pages (AliasNbPages()).
+- Choice of cell borders to draw.
+- New mode for Cell(): the current position can now move under the cell.
+- Ability to include an image by specifying height only (width is calculated automatically).
+- Fixed a bug: when a justified line triggered a page break, the footer inherited the corresponding word spacing.
+
+
v1.31 (2002-01-12)
+
+- Fixed a bug in drawing frame with MultiCell(): the last line always started from the left margin.
+- Removed Expires HTTP header (gives trouble in some situations).
+- Added Content-disposition HTTP header (seems to help in some situations).
+
+
v1.3 (2001-12-03)
+
+- Line break and text justification support (MultiCell()).
+- Color support (SetDrawColor(), SetFillColor(), SetTextColor()). Possibility to draw filled rectangles and paint cell background.
+- A cell whose width is declared null extends up to the right margin of the page.
+- Line width is now retained from page to page and defaults to 0.2 mm.
+- Added SetXY() method.
+- Fixed a passing by reference done in a deprecated manner for PHP4.
+
+
v1.2 (2001-11-11)
+
+- Added font metric files and GetStringWidth() method.
+- Centering and right-aligning text in cells.
+- Display mode control (SetDisplayMode()).
+- Added methods to set document properties (SetAuthor(), SetCreator(), SetKeywords(), SetSubject(), SetTitle()).
+- Possibility to force PDF download by browser.
+- Added SetX() and GetX() methods.
+- During automatic page break, current abscissa is now retained.
+
+
v1.11 (2001-10-20)
+
+- PNG support doesn't require PHP4/zlib any more. Data are now put directly into PDF without any decompression/recompression stage.
+- Image insertion now works correctly even with magic_quotes_runtime option set to on.
+
+
v1.1 (2001-10-07)
+
+- JPEG and PNG image support.
+
+
v1.01 (2001-10-03)
+
+- Fixed a bug involving page break: in case when Header() doesn't specify a font, the one from previous page was not restored and produced an incorrect document.
+
+
v1.0 (2001-09-17)
+
+- First version.
+
+
+ + diff --git a/fpdf16/install.txt b/fpdf16/install.txt new file mode 100755 index 0000000..8ee326b --- /dev/null +++ b/fpdf16/install.txt @@ -0,0 +1,26 @@ +The FPDF library is made up of the following elements: + +- the main file, fpdf.php, which contains the class +- the font metric files (located in the font directory of this archive) + +The metric files are necessary as soon as you want to output some text in a document. +They can be accessed from three different locations: + +- the directory defined by the FPDF_FONTPATH constant (if this constant is defined) +- the font directory located in the directory containing fpdf.php (as it is the case in this archive) +- the directories accessible through include() + +Here is an example defining FPDF_FONTPATH (note the mandatory final slash): + +define('FPDF_FONTPATH','/home/www/font/'); +require('fpdf.php'); + +If the files are not accessible, the SetFont() method will produce the following error: + +FPDF error: Could not include font metric file + + +Remarks: + +- Only the files corresponding to the fonts actually used are necessary +- The tutorials provided in this package are ready to be executed diff --git a/fpdf16/license.txt b/fpdf16/license.txt new file mode 100755 index 0000000..fd811c6 --- /dev/null +++ b/fpdf16/license.txt @@ -0,0 +1,6 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software to use, copy, modify, distribute, sublicense, and/or sell +copies of the software, and to permit persons to whom the software is furnished +to do so. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. \ No newline at end of file diff --git a/fpdf16/tutorial/20k_c1.txt b/fpdf16/tutorial/20k_c1.txt new file mode 100755 index 0000000..0b09f26 --- /dev/null +++ b/fpdf16/tutorial/20k_c1.txt @@ -0,0 +1,10 @@ +The year 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten. Without getting into those rumors that upset civilians in the seaports and deranged the public mind even far inland, it must be said that professional seamen were especially alarmed. Traders, shipowners, captains of vessels, skippers, and master mariners from Europe and America, naval officers from every country, and at their heels the various national governments on these two continents, were all extremely disturbed by the business. +In essence, over a period of time several ships had encountered "an enormous thing" at sea, a long spindle-shaped object, sometimes giving off a phosphorescent glow, infinitely bigger and faster than any whale. +The relevant data on this apparition, as recorded in various logbooks, agreed pretty closely as to the structure of the object or creature in question, its unprecedented speed of movement, its startling locomotive power, and the unique vitality with which it seemed to be gifted. If it was a cetacean, it exceeded in bulk any whale previously classified by science. No naturalist, neither Cuvier nor Lacépède, neither Professor Dumeril nor Professor de Quatrefages, would have accepted the existence of such a monster sight unseen -- specifically, unseen by their own scientific eyes. +Striking an average of observations taken at different times -- rejecting those timid estimates that gave the object a length of 200 feet, and ignoring those exaggerated views that saw it as a mile wide and three long--you could still assert that this phenomenal creature greatly exceeded the dimensions of anything then known to ichthyologists, if it existed at all. +Now then, it did exist, this was an undeniable fact; and since the human mind dotes on objects of wonder, you can understand the worldwide excitement caused by this unearthly apparition. As for relegating it to the realm of fiction, that charge had to be dropped. +In essence, on July 20, 1866, the steamer Governor Higginson, from the Calcutta & Burnach Steam Navigation Co., encountered this moving mass five miles off the eastern shores of Australia. Captain Baker at first thought he was in the presence of an unknown reef; he was even about to fix its exact position when two waterspouts shot out of this inexplicable object and sprang hissing into the air some 150 feet. So, unless this reef was subject to the intermittent eruptions of a geyser, the Governor Higginson had fair and honest dealings with some aquatic mammal, until then unknown, that could spurt from its blowholes waterspouts mixed with air and steam. +Similar events were likewise observed in Pacific seas, on July 23 of the same year, by the Christopher Columbus from the West India & Pacific Steam Navigation Co. Consequently, this extraordinary cetacean could transfer itself from one locality to another with startling swiftness, since within an interval of just three days, the Governor Higginson and the Christopher Columbus had observed it at two positions on the charts separated by a distance of more than 700 nautical leagues. +Fifteen days later and 2,000 leagues farther, the Helvetia from the Compagnie Nationale and the Shannon from the Royal Mail line, running on opposite tacks in that part of the Atlantic lying between the United States and Europe, respectively signaled each other that the monster had been sighted in latitude 42 degrees 15' north and longitude 60 degrees 35' west of the meridian of Greenwich. From their simultaneous observations, they were able to estimate the mammal's minimum length at more than 350 English feet; this was because both the Shannon and the Helvetia were of smaller dimensions, although each measured 100 meters stem to stern. Now then, the biggest whales, those rorqual whales that frequent the waterways of the Aleutian Islands, have never exceeded a length of 56 meters--if they reach even that. +One after another, reports arrived that would profoundly affect public opinion: new observations taken by the transatlantic liner Pereire, the Inman line's Etna running afoul of the monster, an official report drawn up by officers on the French frigate Normandy, dead-earnest reckonings obtained by the general staff of Commodore Fitz-James aboard the Lord Clyde. In lighthearted countries, people joked about this phenomenon, but such serious, practical countries as England, America, and Germany were deeply concerned. +In every big city the monster was the latest rage; they sang about it in the coffee houses, they ridiculed it in the newspapers, they dramatized it in the theaters. The tabloids found it a fine opportunity for hatching all sorts of hoaxes. In those newspapers short of copy, you saw the reappearance of every gigantic imaginary creature, from "Moby Dick," that dreadful white whale from the High Arctic regions, to the stupendous kraken whose tentacles could entwine a 500-ton craft and drag it into the ocean depths. They even reprinted reports from ancient times: the views of Aristotle and Pliny accepting the existence of such monsters, then the Norwegian stories of Bishop Pontoppidan, the narratives of Paul Egede, and finally the reports of Captain Harrington -- whose good faith is above suspicion--in which he claims he saw, while aboard the Castilian in 1857, one of those enormous serpents that, until then, had frequented only the seas of France's old extremist newspaper, The Constitutionalist. diff --git a/fpdf16/tutorial/20k_c2.txt b/fpdf16/tutorial/20k_c2.txt new file mode 100755 index 0000000..096dbd1 --- /dev/null +++ b/fpdf16/tutorial/20k_c2.txt @@ -0,0 +1,23 @@ +During the period in which these developments were occurring, I had returned from a scientific undertaking organized to explore the Nebraska badlands in the United States. In my capacity as Assistant Professor at the Paris Museum of Natural History, I had been attached to this expedition by the French government. After spending six months in Nebraska, I arrived in New York laden with valuable collections near the end of March. My departure for France was set for early May. In the meantime, then, I was busy classifying my mineralogical, botanical, and zoological treasures when that incident took place with the Scotia. +I was perfectly abreast of this question, which was the big news of the day, and how could I not have been? I had read and reread every American and European newspaper without being any farther along. This mystery puzzled me. Finding it impossible to form any views, I drifted from one extreme to the other. Something was out there, that much was certain, and any doubting Thomas was invited to place his finger on the Scotia's wound. +When I arrived in New York, the question was at the boiling point. The hypothesis of a drifting islet or an elusive reef, put forward by people not quite in their right minds, was completely eliminated. And indeed, unless this reef had an engine in its belly, how could it move about with such prodigious speed? +Also discredited was the idea of a floating hull or some other enormous wreckage, and again because of this speed of movement. +So only two possible solutions to the question were left, creating two very distinct groups of supporters: on one side, those favoring a monster of colossal strength; on the other, those favoring an "underwater boat" of tremendous motor power. +Now then, although the latter hypothesis was completely admissible, it couldn't stand up to inquiries conducted in both the New World and the Old. That a private individual had such a mechanism at his disposal was less than probable. Where and when had he built it, and how could he have built it in secret? +Only some government could own such an engine of destruction, and in these disaster-filled times, when men tax their ingenuity to build increasingly powerful aggressive weapons, it was possible that, unknown to the rest of the world, some nation could have been testing such a fearsome machine. The Chassepot rifle led to the torpedo, and the torpedo has led to this underwater battering ram, which in turn will lead to the world putting its foot down. At least I hope it will. +But this hypothesis of a war machine collapsed in the face of formal denials from the various governments. Since the public interest was at stake and transoceanic travel was suffering, the sincerity of these governments could not be doubted. Besides, how could the assembly of this underwater boat have escaped public notice? Keeping a secret under such circumstances would be difficult enough for an individual, and certainly impossible for a nation whose every move is under constant surveillance by rival powers. +So, after inquiries conducted in England, France, Russia, Prussia, Spain, Italy, America, and even Turkey, the hypothesis of an underwater Monitor was ultimately rejected. +After I arrived in New York, several people did me the honor of consulting me on the phenomenon in question. In France I had published a two-volume work, in quarto, entitled The Mysteries of the Great Ocean Depths. Well received in scholarly circles, this book had established me as a specialist in this pretty obscure field of natural history. My views were in demand. As long as I could deny the reality of the business, I confined myself to a flat "no comment." But soon, pinned to the wall, I had to explain myself straight out. And in this vein, "the honorable Pierre Aronnax, Professor at the Paris Museum," was summoned by The New York Herald to formulate his views no matter what. +I complied. Since I could no longer hold my tongue, I let it wag. I discussed the question in its every aspect, both political and scientific, and this is an excerpt from the well-padded article I published in the issue of April 30. + +"Therefore," I wrote, "after examining these different hypotheses one by one, we are forced, every other supposition having been refuted, to accept the existence of an extremely powerful marine animal. +"The deepest parts of the ocean are totally unknown to us. No soundings have been able to reach them. What goes on in those distant depths? What creatures inhabit, or could inhabit, those regions twelve or fifteen miles beneath the surface of the water? What is the constitution of these animals? It's almost beyond conjecture. +"However, the solution to this problem submitted to me can take the form of a choice between two alternatives. +"Either we know every variety of creature populating our planet, or we do not. +"If we do not know every one of them, if nature still keeps ichthyological secrets from us, nothing is more admissible than to accept the existence of fish or cetaceans of new species or even new genera, animals with a basically 'cast-iron' constitution that inhabit strata beyond the reach of our soundings, and which some development or other, an urge or a whim if you prefer, can bring to the upper level of the ocean for long intervals. +"If, on the other hand, we do know every living species, we must look for the animal in question among those marine creatures already cataloged, and in this event I would be inclined to accept the existence of a giant narwhale. +"The common narwhale, or sea unicorn, often reaches a length of sixty feet. Increase its dimensions fivefold or even tenfold, then give this cetacean a strength in proportion to its size while enlarging its offensive weapons, and you have the animal we're looking for. It would have the proportions determined by the officers of the Shannon, the instrument needed to perforate the Scotia, and the power to pierce a steamer's hull. +"In essence, the narwhale is armed with a sort of ivory sword, or lance, as certain naturalists have expressed it. It's a king-sized tooth as hard as steel. Some of these teeth have been found buried in the bodies of baleen whales, which the narwhale attacks with invariable success. Others have been wrenched, not without difficulty, from the undersides of vessels that narwhales have pierced clean through, as a gimlet pierces a wine barrel. The museum at the Faculty of Medicine in Paris owns one of these tusks with a length of 2.25 meters and a width at its base of forty-eight centimeters! +"All right then! Imagine this weapon to be ten times stronger and the animal ten times more powerful, launch it at a speed of twenty miles per hour, multiply its mass times its velocity, and you get just the collision we need to cause the specified catastrophe. +"So, until information becomes more abundant, I plump for a sea unicorn of colossal dimensions, no longer armed with a mere lance but with an actual spur, like ironclad frigates or those warships called 'rams,' whose mass and motor power it would possess simultaneously. +"This inexplicable phenomenon is thus explained away--unless it's something else entirely, which, despite everything that has been sighted, studied, explored and experienced, is still possible!" diff --git a/fpdf16/tutorial/calligra.afm b/fpdf16/tutorial/calligra.afm new file mode 100755 index 0000000..806685e --- /dev/null +++ b/fpdf16/tutorial/calligra.afm @@ -0,0 +1,275 @@ +StartFontMetrics 4.1 +FontName Calligrapher-Regular +FullName Calligrapher Regular +Notice Generated by Fontographer 3.5 +EncodingScheme FontSpecific +FamilyName Calligrapher +Weight Regular +Version (Altsys Fontographer 3.5 5/26/92) +Characters 215 +ItalicAngle 0.0 +Ascender 899 +Descender -234 +UnderlineThickness 20 +UnderlinePosition -200 +IsFixedPitch false +FontBBox -50 -234 1328 899 +StartCharMetrics 256 +C 0 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 1 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 2 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 3 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 4 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 5 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 6 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 7 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 8 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 9 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 10 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 11 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 12 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 13 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 14 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 15 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 16 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 17 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 18 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 19 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 20 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 21 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 22 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 23 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 24 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 25 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 26 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 27 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 28 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 29 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 30 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 31 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 32 ; WX 282 ; N space ; B 67 -16 251 718 ; +C 33 ; WX 324 ; N exclam ; B 67 -16 251 718 ; +C 34 ; WX 405 ; N quotedbl ; B 60 460 353 718 ; +C 35 ; WX 584 ; N numbersign ; B 35 0 549 701 ; +C 36 ; WX 632 ; N dollar ; B 32 -126 595 814 ; +C 37 ; WX 980 ; N percent ; B 35 -16 945 703 ; +C 38 ; WX 776 ; N ampersand ; B 41 -17 811 670 ; +C 39 ; WX 259 ; N quotesingle ; B 72 460 206 718 ; +C 40 ; WX 299 ; N parenleft ; B 57 -119 299 785 ; +C 41 ; WX 299 ; N parenright ; B 0 -119 242 785 ; +C 42 ; WX 377 ; N asterisk ; B 35 407 342 714 ; +C 43 ; WX 600 ; N plus ; B 47 0 553 506 ; +C 44 ; WX 259 ; N comma ; B 35 -67 224 162 ; +C 45 ; WX 432 ; N hyphen ; B 28 249 404 377 ; +C 46 ; WX 254 ; N period ; B 43 -16 227 162 ; +C 47 ; WX 597 ; N slash ; B 7 -14 591 714 ; +C 48 ; WX 529 ; N zero ; B 21 -18 508 583 ; +C 49 ; WX 298 ; N one ; B 8 -15 233 582 ; +C 50 ; WX 451 ; N two ; B 17 -8 430 588 ; +C 51 ; WX 359 ; N three ; B 11 -54 337 582 ; +C 52 ; WX 525 ; N four ; B 18 -20 519 602 ; +C 53 ; WX 423 ; N five ; B 10 -55 420 582 ; +C 54 ; WX 464 ; N six ; B 23 -14 447 589 ; +C 55 ; WX 417 ; N seven ; B 8 -18 415 589 ; +C 56 ; WX 457 ; N eight ; B 19 -16 432 583 ; +C 57 ; WX 479 ; N nine ; B 26 -16 450 588 ; +C 58 ; WX 275 ; N colon ; B 59 -16 242 491 ; +C 59 ; WX 282 ; N semicolon ; B 54 -67 245 491 ; +C 60 ; WX 600 ; N less ; B 47 -8 553 514 ; +C 61 ; WX 600 ; N equal ; B 47 98 553 408 ; +C 62 ; WX 600 ; N greater ; B 47 -8 553 514 ; +C 63 ; WX 501 ; N question ; B 21 -16 473 721 ; +C 64 ; WX 800 ; N at ; B 29 -12 771 730 ; +C 65 ; WX 743 ; N A ; B -23 -14 754 723 ; +C 66 ; WX 636 ; N B ; B -42 -7 608 706 ; +C 67 ; WX 598 ; N C ; B 27 -12 572 712 ; +C 68 ; WX 712 ; N D ; B -42 -11 684 705 ; +C 69 ; WX 608 ; N E ; B -21 0 608 708 ; +C 70 ; WX 562 ; N F ; B -21 -18 584 716 ; +C 71 ; WX 680 ; N G ; B 29 -8 668 714 ; +C 72 ; WX 756 ; N H ; B 70 -17 777 728 ; +C 73 ; WX 308 ; N I ; B 14 -15 238 718 ; +C 74 ; WX 314 ; N J ; B 7 -223 244 727 ; +C 75 ; WX 676 ; N K ; B 14 -16 683 725 ; +C 76 ; WX 552 ; N L ; B 14 -8 580 713 ; +C 77 ; WX 1041 ; N M ; B 42 -17 1017 739 ; +C 78 ; WX 817 ; N N ; B -42 -17 747 736 ; +C 79 ; WX 729 ; N O ; B 32 -16 698 709 ; +C 80 ; WX 569 ; N P ; B -35 -15 570 716 ; +C 81 ; WX 698 ; N Q ; B 27 -201 1328 715 ; +C 82 ; WX 674 ; N R ; B -35 -20 696 712 ; +C 83 ; WX 618 ; N S ; B 31 -16 589 709 ; +C 84 ; WX 673 ; N T ; B -21 -20 702 714 ; +C 85 ; WX 805 ; N U ; B 0 -19 804 722 ; +C 86 ; WX 753 ; N V ; B -28 -20 788 729 ; +C 87 ; WX 1238 ; N W ; B -28 -17 1273 736 ; +C 88 ; WX 716 ; N X ; B 7 -38 709 731 ; +C 89 ; WX 754 ; N Y ; B -35 -17 789 747 ; +C 90 ; WX 599 ; N Z ; B 30 -5 584 748 ; +C 91 ; WX 315 ; N bracketleft ; B 93 -124 322 718 ; +C 92 ; WX 463 ; N backslash ; B -21 -18 484 736 ; +C 93 ; WX 315 ; N bracketright ; B -7 -124 222 718 ; +C 94 ; WX 600 ; N asciicircum ; B 63 266 537 658 ; +C 95 ; WX 547 ; N underscore ; B -7 -198 554 -163 ; +C 96 ; WX 278 ; N grave ; B -1 541 214 693 ; +C 97 ; WX 581 ; N a ; B 21 -16 581 494 ; +C 98 ; WX 564 ; N b ; B -24 -17 543 793 ; +C 99 ; WX 440 ; N c ; B 21 -17 422 490 ; +C 100 ; WX 571 ; N d ; B 0 -15 550 659 ; +C 101 ; WX 450 ; N e ; B 28 -23 428 493 ; +C 102 ; WX 347 ; N f ; B -35 -14 474 785 ; +C 103 ; WX 628 ; N g ; B 19 -219 612 496 ; +C 104 ; WX 611 ; N h ; B -29 -18 569 785 ; +C 105 ; WX 283 ; N i ; B -14 -15 241 679 ; +C 106 ; WX 283 ; N j ; B -14 -234 241 679 ; +C 107 ; WX 560 ; N k ; B -24 -15 582 789 ; +C 108 ; WX 252 ; N l ; B -28 -15 210 789 ; +C 109 ; WX 976 ; N m ; B -21 -16 927 494 ; +C 110 ; WX 595 ; N n ; B -28 -15 574 493 ; +C 111 ; WX 508 ; N o ; B 27 -17 485 490 ; +C 112 ; WX 549 ; N p ; B -28 -216 526 496 ; +C 113 ; WX 540 ; N q ; B 28 -219 491 493 ; +C 114 ; WX 395 ; N r ; B -21 -19 430 492 ; +C 115 ; WX 441 ; N s ; B 34 -15 413 493 ; +C 116 ; WX 307 ; N t ; B -21 -16 378 621 ; +C 117 ; WX 614 ; N u ; B -14 -18 558 501 ; +C 118 ; WX 556 ; N v ; B -28 -20 569 483 ; +C 119 ; WX 915 ; N w ; B -28 -17 928 495 ; +C 120 ; WX 559 ; N x ; B 14 -17 546 500 ; +C 121 ; WX 597 ; N y ; B -21 -227 541 500 ; +C 122 ; WX 452 ; N z ; B 28 -5 442 515 ; +C 123 ; WX 315 ; N braceleft ; B 6 -118 309 718 ; +C 124 ; WX 222 ; N bar ; B 63 -18 159 730 ; +C 125 ; WX 315 ; N braceright ; B 6 -118 309 718 ; +C 126 ; WX 600 ; N asciitilde ; B 69 166 531 340 ; +C 127 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 128 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 129 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 130 ; WX 0 ; N quotesinglbase ; B -23 -14 754 877 ; +C 131 ; WX 0 ; N florin ; B 0 -19 804 854 ; +C 132 ; WX 0 ; N quotedblbase ; B -23 -14 754 877 ; +C 133 ; WX 780 ; N ellipsis ; B 43 -16 747 162 ; +C 134 ; WX 0 ; N dagger ; B 27 -122 437 592 ; +C 135 ; WX 0 ; N daggerdbl ; B 43 278 227 456 ; +C 136 ; WX 278 ; N circumflex ; B -14 557 292 677 ; +C 137 ; WX 0 ; N perthousand ; B -23 -14 754 877 ; +C 138 ; WX 0 ; N Scaron ; B 0 0 0 100 ; +C 139 ; WX 0 ; N guilsinglleft ; B 43 278 227 456 ; +C 140 ; WX 1064 ; N OE ; B 32 -16 1055 709 ; +C 141 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 142 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 143 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 144 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 145 ; WX 259 ; N quoteleft ; B 35 489 224 717 ; +C 146 ; WX 259 ; N quoteright ; B 35 489 224 717 ; +C 147 ; WX 470 ; N quotedblleft ; B 35 489 443 717 ; +C 148 ; WX 470 ; N quotedblright ; B 35 487 443 717 ; +C 149 ; WX 500 ; N bullet ; B 70 179 430 539 ; +C 150 ; WX 300 ; N endash ; B 0 245 300 350 ; +C 151 ; WX 600 ; N emdash ; B 0 245 600 350 ; +C 152 ; WX 278 ; N tilde ; B -44 563 326 689 ; +C 153 ; WX 990 ; N trademark ; B 62 306 928 718 ; +C 154 ; WX 0 ; N scaron ; B 0 0 0 100 ; +C 155 ; WX 0 ; N guilsinglright ; B 43 278 227 456 ; +C 156 ; WX 790 ; N oe ; B 27 -23 764 493 ; +C 157 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 158 ; WX 800 ; N .notdef ; B 50 0 750 800 ; +C 159 ; WX 754 ; N Ydieresis ; B -35 -17 789 882 ; +C 160 ; WX 282 ; N nbspace ; B -23 -14 754 893 ; +C 161 ; WX 324 ; N exclamdown ; B 69 -203 253 531 ; +C 162 ; WX 450 ; N cent ; B 27 -122 437 592 ; +C 163 ; WX 640 ; N sterling ; B 0 -9 619 716 ; +C 164 ; WX 518 ; N currency ; B 3 72 515 586 ; +C 165 ; WX 603 ; N yen ; B -28 -65 631 747 ; +C 166 ; WX 0 ; N brokenbar ; B 0 0 0 100 ; +C 167 ; WX 519 ; N section ; B -50 -216 524 762 ; +C 168 ; WX 254 ; N dieresis ; B -20 554 308 682 ; +C 169 ; WX 800 ; N copyright ; B 29 -12 771 730 ; +C 170 ; WX 349 ; N ordfeminine ; B 13 385 349 717 ; +C 171 ; WX 0 ; N guillemotleft ; B 43 -16 747 162 ; +C 172 ; WX 0 ; N logicalnot ; B 30 0 730 700 ; +C 173 ; WX 432 ; N hyphen ; B 28 249 404 377 ; +C 174 ; WX 800 ; N registered ; B 29 -12 771 730 ; +C 175 ; WX 278 ; N macron ; B -47 584 325 665 ; +C 176 ; WX 0 ; N degree ; B 27 -122 437 592 ; +C 177 ; WX 0 ; N plusminus ; B 29 -8 668 877 ; +C 178 ; WX 0 ; N twosuperior ; B 0 0 0 100 ; +C 179 ; WX 0 ; N threesuperior ; B 0 0 0 100 ; +C 180 ; WX 278 ; N acute ; B 49 536 279 693 ; +C 181 ; WX 614 ; N mu ; B -14 -231 558 501 ; +C 182 ; WX 0 ; N paragraph ; B -35 -15 668 785 ; +C 183 ; WX 254 ; N periodcentered ; B 43 278 227 456 ; +C 184 ; WX 278 ; N cedilla ; B -8 -216 231 6 ; +C 185 ; WX 0 ; N onesuperior ; B 0 0 0 100 ; +C 186 ; WX 305 ; N ordmasculine ; B 16 373 291 702 ; +C 187 ; WX 0 ; N guillemotright ; B 43 -16 747 162 ; +C 188 ; WX 0 ; N onequarter ; B 0 0 0 100 ; +C 189 ; WX 0 ; N onehalf ; B 0 0 0 100 ; +C 190 ; WX 0 ; N threequarters ; B 0 0 0 100 ; +C 191 ; WX 501 ; N questiondown ; B 15 -196 467 541 ; +C 192 ; WX 743 ; N Agrave ; B -23 -14 754 893 ; +C 193 ; WX 743 ; N Aacute ; B -23 -14 754 893 ; +C 194 ; WX 743 ; N Acircumflex ; B -23 -14 754 877 ; +C 195 ; WX 743 ; N Atilde ; B -23 -14 754 889 ; +C 196 ; WX 743 ; N Adieresis ; B -23 -14 754 882 ; +C 197 ; WX 743 ; N Aring ; B -23 -14 754 899 ; +C 198 ; WX 1060 ; N AE ; B -29 -14 1053 708 ; +C 199 ; WX 598 ; N Ccedilla ; B 27 -183 572 712 ; +C 200 ; WX 608 ; N Egrave ; B -21 0 608 893 ; +C 201 ; WX 608 ; N Eacute ; B -21 0 608 893 ; +C 202 ; WX 608 ; N Ecircumflex ; B -21 0 608 877 ; +C 203 ; WX 608 ; N Edieresis ; B -21 0 608 882 ; +C 204 ; WX 308 ; N Igrave ; B 14 -15 264 893 ; +C 205 ; WX 308 ; N Iacute ; B 14 -15 274 893 ; +C 206 ; WX 308 ; N Icircumflex ; B 1 -15 307 877 ; +C 207 ; WX 308 ; N Idieresis ; B -15 -15 313 882 ; +C 208 ; WX 0 ; N Eth ; B 0 0 0 100 ; +C 209 ; WX 817 ; N Ntilde ; B -42 -17 747 889 ; +C 210 ; WX 729 ; N Ograve ; B 32 -16 698 893 ; +C 211 ; WX 729 ; N Oacute ; B 32 -16 698 893 ; +C 212 ; WX 729 ; N Ocircumflex ; B 32 -16 698 877 ; +C 213 ; WX 729 ; N Otilde ; B 32 -16 698 889 ; +C 214 ; WX 729 ; N Odieresis ; B 32 -16 698 882 ; +C 215 ; WX 0 ; N multiply ; B 0 0 0 100 ; +C 216 ; WX 729 ; N Oslash ; B 14 -24 724 709 ; +C 217 ; WX 805 ; N Ugrave ; B 0 -19 804 893 ; +C 218 ; WX 805 ; N Uacute ; B 0 -19 804 893 ; +C 219 ; WX 805 ; N Ucircumflex ; B 0 -19 804 877 ; +C 220 ; WX 805 ; N Udieresis ; B 0 -19 804 882 ; +C 221 ; WX 0 ; N _235 ; B 0 0 0 100 ; +C 222 ; WX 0 ; N Thorn ; B 0 0 0 100 ; +C 223 ; WX 688 ; N germandbls ; B -35 -15 668 785 ; +C 224 ; WX 581 ; N agrave ; B 21 -16 581 693 ; +C 225 ; WX 581 ; N aacute ; B 21 -16 581 693 ; +C 226 ; WX 581 ; N acircumflex ; B 21 -16 581 677 ; +C 227 ; WX 581 ; N atilde ; B 21 -16 581 689 ; +C 228 ; WX 581 ; N adieresis ; B 21 -16 581 682 ; +C 229 ; WX 581 ; N aring ; B 21 -16 581 734 ; +C 230 ; WX 792 ; N ae ; B 21 -23 773 494 ; +C 231 ; WX 440 ; N ccedilla ; B 21 -183 422 490 ; +C 232 ; WX 450 ; N egrave ; B 28 -23 428 693 ; +C 233 ; WX 450 ; N eacute ; B 28 -23 428 693 ; +C 234 ; WX 450 ; N ecircumflex ; B 28 -23 432 677 ; +C 235 ; WX 450 ; N edieresis ; B 28 -23 428 682 ; +C 236 ; WX 283 ; N igrave ; B -14 -15 244 693 ; +C 237 ; WX 283 ; N iacute ; B -14 -15 269 693 ; +C 238 ; WX 283 ; N icircumflex ; B -14 -15 297 677 ; +C 239 ; WX 283 ; N idieresis ; B -25 -15 303 682 ; +C 240 ; WX 0 ; N Yacute ; B 0 0 0 100 ; +C 241 ; WX 595 ; N ntilde ; B -28 -15 574 689 ; +C 242 ; WX 508 ; N ograve ; B 27 -17 485 693 ; +C 243 ; WX 508 ; N oacute ; B 27 -17 485 693 ; +C 244 ; WX 508 ; N ocircumflex ; B 27 -17 485 677 ; +C 245 ; WX 508 ; N otilde ; B 27 -17 485 689 ; +C 246 ; WX 508 ; N odieresis ; B 27 -17 485 682 ; +C 247 ; WX 0 ; N divide ; B 35 0 760 727 ; +C 248 ; WX 508 ; N oslash ; B -8 -54 496 589 ; +C 249 ; WX 614 ; N ugrave ; B -14 -18 558 693 ; +C 250 ; WX 614 ; N uacute ; B -14 -18 558 693 ; +C 251 ; WX 614 ; N ucircumflex ; B -14 -18 558 677 ; +C 252 ; WX 614 ; N udieresis ; B -14 -18 558 682 ; +C 253 ; WX 0 ; N yacute ; B 0 0 0 100 ; +C 254 ; WX 0 ; N thorn ; B 0 0 0 100 ; +C 255 ; WX 597 ; N ydieresis ; B -21 -227 541 682 ; +EndCharMetrics +EndFontMetrics diff --git a/fpdf16/tutorial/calligra.php b/fpdf16/tutorial/calligra.php new file mode 100755 index 0000000..1af82ac --- /dev/null +++ b/fpdf16/tutorial/calligra.php @@ -0,0 +1,24 @@ +899,'Descent'=>-234,'CapHeight'=>731,'Flags'=>32,'FontBBox'=>'[-50 -234 1328 899]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>800); +$up=-200; +$ut=20; +$cw=array( + chr(0)=>800,chr(1)=>800,chr(2)=>800,chr(3)=>800,chr(4)=>800,chr(5)=>800,chr(6)=>800,chr(7)=>800,chr(8)=>800,chr(9)=>800,chr(10)=>800,chr(11)=>800,chr(12)=>800,chr(13)=>800,chr(14)=>800,chr(15)=>800,chr(16)=>800,chr(17)=>800,chr(18)=>800,chr(19)=>800,chr(20)=>800,chr(21)=>800, + chr(22)=>800,chr(23)=>800,chr(24)=>800,chr(25)=>800,chr(26)=>800,chr(27)=>800,chr(28)=>800,chr(29)=>800,chr(30)=>800,chr(31)=>800,' '=>282,'!'=>324,'"'=>405,'#'=>584,'$'=>632,'%'=>980,'&'=>776,'\''=>259,'('=>299,')'=>299,'*'=>377,'+'=>600, + ','=>259,'-'=>432,'.'=>254,'/'=>597,'0'=>529,'1'=>298,'2'=>451,'3'=>359,'4'=>525,'5'=>423,'6'=>464,'7'=>417,'8'=>457,'9'=>479,':'=>275,';'=>282,'<'=>600,'='=>600,'>'=>600,'?'=>501,'@'=>800,'A'=>743, + 'B'=>636,'C'=>598,'D'=>712,'E'=>608,'F'=>562,'G'=>680,'H'=>756,'I'=>308,'J'=>314,'K'=>676,'L'=>552,'M'=>1041,'N'=>817,'O'=>729,'P'=>569,'Q'=>698,'R'=>674,'S'=>618,'T'=>673,'U'=>805,'V'=>753,'W'=>1238, + 'X'=>716,'Y'=>754,'Z'=>599,'['=>315,'\\'=>463,']'=>315,'^'=>600,'_'=>547,'`'=>278,'a'=>581,'b'=>564,'c'=>440,'d'=>571,'e'=>450,'f'=>347,'g'=>628,'h'=>611,'i'=>283,'j'=>283,'k'=>560,'l'=>252,'m'=>976, + 'n'=>595,'o'=>508,'p'=>549,'q'=>540,'r'=>395,'s'=>441,'t'=>307,'u'=>614,'v'=>556,'w'=>915,'x'=>559,'y'=>597,'z'=>452,'{'=>315,'|'=>222,'}'=>315,'~'=>600,chr(127)=>800,chr(128)=>800,chr(129)=>800,chr(130)=>0,chr(131)=>0, + chr(132)=>0,chr(133)=>780,chr(134)=>0,chr(135)=>0,chr(136)=>278,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>1064,chr(141)=>800,chr(142)=>800,chr(143)=>800,chr(144)=>800,chr(145)=>259,chr(146)=>259,chr(147)=>470,chr(148)=>470,chr(149)=>500,chr(150)=>300,chr(151)=>600,chr(152)=>278,chr(153)=>990, + chr(154)=>0,chr(155)=>0,chr(156)=>790,chr(157)=>800,chr(158)=>800,chr(159)=>754,chr(160)=>282,chr(161)=>324,chr(162)=>450,chr(163)=>640,chr(164)=>518,chr(165)=>603,chr(166)=>0,chr(167)=>519,chr(168)=>254,chr(169)=>800,chr(170)=>349,chr(171)=>0,chr(172)=>0,chr(173)=>432,chr(174)=>800,chr(175)=>278, + chr(176)=>0,chr(177)=>0,chr(178)=>0,chr(179)=>0,chr(180)=>278,chr(181)=>614,chr(182)=>0,chr(183)=>254,chr(184)=>278,chr(185)=>0,chr(186)=>305,chr(187)=>0,chr(188)=>0,chr(189)=>0,chr(190)=>0,chr(191)=>501,chr(192)=>743,chr(193)=>743,chr(194)=>743,chr(195)=>743,chr(196)=>743,chr(197)=>743, + chr(198)=>1060,chr(199)=>598,chr(200)=>608,chr(201)=>608,chr(202)=>608,chr(203)=>608,chr(204)=>308,chr(205)=>308,chr(206)=>308,chr(207)=>308,chr(208)=>0,chr(209)=>817,chr(210)=>729,chr(211)=>729,chr(212)=>729,chr(213)=>729,chr(214)=>729,chr(215)=>0,chr(216)=>729,chr(217)=>805,chr(218)=>805,chr(219)=>805, + chr(220)=>805,chr(221)=>0,chr(222)=>0,chr(223)=>688,chr(224)=>581,chr(225)=>581,chr(226)=>581,chr(227)=>581,chr(228)=>581,chr(229)=>581,chr(230)=>792,chr(231)=>440,chr(232)=>450,chr(233)=>450,chr(234)=>450,chr(235)=>450,chr(236)=>283,chr(237)=>283,chr(238)=>283,chr(239)=>283,chr(240)=>800,chr(241)=>595, + chr(242)=>508,chr(243)=>508,chr(244)=>508,chr(245)=>508,chr(246)=>508,chr(247)=>0,chr(248)=>508,chr(249)=>614,chr(250)=>614,chr(251)=>614,chr(252)=>614,chr(253)=>0,chr(254)=>0,chr(255)=>597); +$enc='cp1252'; +$diff=''; +$file='calligra.z'; +$originalsize=40120; +?> diff --git a/fpdf16/tutorial/calligra.ttf b/fpdf16/tutorial/calligra.ttf new file mode 100755 index 0000000..9713c46 Binary files /dev/null and b/fpdf16/tutorial/calligra.ttf differ diff --git a/fpdf16/tutorial/calligra.z b/fpdf16/tutorial/calligra.z new file mode 100755 index 0000000..1c0bebd Binary files /dev/null and b/fpdf16/tutorial/calligra.z differ diff --git a/fpdf16/tutorial/countries.txt b/fpdf16/tutorial/countries.txt new file mode 100755 index 0000000..aa8886c --- /dev/null +++ b/fpdf16/tutorial/countries.txt @@ -0,0 +1,15 @@ +Austria;Vienna;83859;8075 +Belgium;Brussels;30518;10192 +Denmark;Copenhagen;43094;5295 +Finland;Helsinki;304529;5147 +France;Paris;543965;58728 +Germany;Berlin;357022;82057 +Greece;Athens;131625;10511 +Ireland;Dublin;70723;3694 +Italy;Roma;301316;57563 +Luxembourg;Luxembourg;2586;424 +Netherlands;Amsterdam;41526;15654 +Portugal;Lisbon;91906;9957 +Spain;Madrid;504790;39348 +Sweden;Stockholm;410934;8839 +United Kingdom;London;243820;58862 diff --git a/fpdf16/tutorial/index.htm b/fpdf16/tutorial/index.htm new file mode 100755 index 0000000..0861878 --- /dev/null +++ b/fpdf16/tutorial/index.htm @@ -0,0 +1,21 @@ + + + + +Tutorials + + + +

Tutorials

+

The different examples rapidly show how to use FPDF. You will find all main features explained.

+ + + diff --git a/fpdf16/tutorial/logo.png b/fpdf16/tutorial/logo.png new file mode 100755 index 0000000..284a007 Binary files /dev/null and b/fpdf16/tutorial/logo.png differ diff --git a/fpdf16/tutorial/logo_pb.png b/fpdf16/tutorial/logo_pb.png new file mode 100755 index 0000000..e6827c1 Binary files /dev/null and b/fpdf16/tutorial/logo_pb.png differ diff --git a/fpdf16/tutorial/makefont.php b/fpdf16/tutorial/makefont.php new file mode 100755 index 0000000..3773429 --- /dev/null +++ b/fpdf16/tutorial/makefont.php @@ -0,0 +1,6 @@ + diff --git a/fpdf16/tutorial/tuto1.htm b/fpdf16/tutorial/tuto1.htm new file mode 100755 index 0000000..7f1779f --- /dev/null +++ b/fpdf16/tutorial/tuto1.htm @@ -0,0 +1,77 @@ + + + + +Minimal example + + + +

Minimal example

+Let's start with the classic example: +
+
<?php
+require('fpdf.php');
+
+$pdf=new FPDF();
+$pdf->AddPage();
+$pdf->SetFont('Arial','B',16);
+$pdf->Cell(40,10,'Hello World!');
+$pdf->Output();
+?>
+
+

[Demo]

+After including the library file, we create an FPDF object. +The FPDF() constructor is used here with the default values: pages are in A4 portrait and +the unit of measure is millimeter. It could have been specified explicitly with: +
+
$pdf=new FPDF('P','mm','A4');
+
+
+It is possible to use landscape (L), other page formats (such as Letter and +Legal) and units of measure (pt, cm, in). +
+
+There is no page for the moment, so we have to add one with AddPage(). The origin +is at the upper-left corner and the current position is by default placed at 1 cm from the +borders; the margins can be changed with SetMargins(). +
+
+Before we can print text, it is mandatory to select a font with SetFont(), otherwise the +document would be invalid. We choose Arial bold 16: +
+
$pdf->SetFont('Arial','B',16);
+
+
+We could have specified italics with I, underlined with U or a regular font with an empty string +(or any combination). Note that the font size is given in points, not millimeters (or another +user unit); it is the only exception. The other standard fonts are Times, Courier, Symbol and +ZapfDingbats. +
+
+We can now print a cell with Cell(). A cell is a rectangular area, possibly framed, +which contains a line of text. It is output at the current position. We specify its dimensions, +its text (centered or aligned), if borders should be drawn, and where the current position +moves after it (to the right, below or to the beginning of the next line). To add a frame, we would do this: +
+
$pdf->Cell(40,10,'Hello World !',1);
+
+
+To add a new cell next to it with centered text and go to the next line, we would do: +
+
$pdf->Cell(60,10,'Powered by FPDF.',0,1,'C');
+
+
+Remark: the line break can also be done with Ln(). This method additionnaly allows to specify +the height of the break. +
+
+Finally, the document is closed and sent to the browser with Output(). We could have saved +it to a file by passing the desired file name. +
+
+Caution: in case when the PDF is sent to the browser, nothing else must be output by the +script, neither before nor after (no HTML, not even a space or a carriage return). If you send something +before, you will get the error message: "Some data has already been output, can't send PDF file". If you +send something after, the document might not display. + + diff --git a/fpdf16/tutorial/tuto1.php b/fpdf16/tutorial/tuto1.php new file mode 100755 index 0000000..39db1fd --- /dev/null +++ b/fpdf16/tutorial/tuto1.php @@ -0,0 +1,9 @@ +AddPage(); +$pdf->SetFont('Arial','B',16); +$pdf->Cell(40,10,'Hello World!'); +$pdf->Output(); +?> diff --git a/fpdf16/tutorial/tuto2.htm b/fpdf16/tutorial/tuto2.htm new file mode 100755 index 0000000..6cff8f4 --- /dev/null +++ b/fpdf16/tutorial/tuto2.htm @@ -0,0 +1,80 @@ + + + + +Header, footer, page break and image + + + +

Header, footer, page break and image

+Here is a two page example with header, footer and logo: +
+
<?php
+require('fpdf.php');
+
+class PDF extends FPDF
+{
+//Page header
+function Header()
+{
+    //Logo
+    $this->Image('logo_pb.png',10,8,33);
+    //Arial bold 15
+    $this->SetFont('Arial','B',15);
+    //Move to the right
+    $this->Cell(80);
+    //Title
+    $this->Cell(30,10,'Title',1,0,'C');
+    //Line break
+    $this->Ln(20);
+}
+
+//Page footer
+function Footer()
+{
+    //Position at 1.5 cm from bottom
+    $this->SetY(-15);
+    //Arial italic 8
+    $this->SetFont('Arial','I',8);
+    //Page number
+    $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
+}
+}
+
+//Instanciation of inherited class
+$pdf=new PDF();
+$pdf->AliasNbPages();
+$pdf->AddPage();
+$pdf->SetFont('Times','',12);
+for($i=1;$i<=40;$i++)
+    $pdf->Cell(0,10,'Printing line number '.$i,0,1);
+$pdf->Output();
+?>
+
+

[Demo]

+This example makes use of the Header() and Footer() methods to process page headers and +footers. They are called automatically. They already exist in the FPDF class but do nothing, +therefore we have to extend the class and override them. +
+
+The logo is printed with the Image() method by specifying its upper-left corner and +its width. The height is calculated automatically to respect the image proportions. +
+
+To print the page number, a null value is passed as the cell width. It means that the cell +should extend up to the right margin of the page; it is handy to center text. The current page +number is returned by the PageNo() method; as for the total number of pages, it is obtained +by means of the special value {nb} which will be substituted on document closure +(provided you first called AliasNbPages()). +
+Note the use of the SetY() method which allows to set position at an absolute location in +the page, starting from the top or the bottom. +
+
+Another interesting feature is used here: the automatic page breaking. As soon as a cell would +cross a limit in the page (at 2 centimeters from the bottom by default), a break is performed +and the font restored. Although the header and footer select their own font (Arial), the body +continues with Times. This mechanism of automatic restoration also applies to colors and line +width. The limit which triggers page breaks can be set with SetAutoPageBreak(). + + diff --git a/fpdf16/tutorial/tuto2.php b/fpdf16/tutorial/tuto2.php new file mode 100755 index 0000000..f400713 --- /dev/null +++ b/fpdf16/tutorial/tuto2.php @@ -0,0 +1,41 @@ +Image('logo_pb.png',10,8,33); + //Arial bold 15 + $this->SetFont('Arial','B',15); + //Move to the right + $this->Cell(80); + //Title + $this->Cell(30,10,'Title',1,0,'C'); + //Line break + $this->Ln(20); +} + +//Page footer +function Footer() +{ + //Position at 1.5 cm from bottom + $this->SetY(-15); + //Arial italic 8 + $this->SetFont('Arial','I',8); + //Page number + $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C'); +} +} + +//Instanciation of inherited class +$pdf=new PDF(); +$pdf->AliasNbPages(); +$pdf->AddPage(); +$pdf->SetFont('Times','',12); +for($i=1;$i<=40;$i++) + $pdf->Cell(0,10,'Printing line number '.$i,0,1); +$pdf->Output(); +?> diff --git a/fpdf16/tutorial/tuto3.htm b/fpdf16/tutorial/tuto3.htm new file mode 100755 index 0000000..b85cad9 --- /dev/null +++ b/fpdf16/tutorial/tuto3.htm @@ -0,0 +1,116 @@ + + + + +Line breaks and colors + + + +

Line breaks and colors

+Let's continue with an example which prints justified paragraphs. It also illustrates the use +of colors. +
+
<?php
+require('fpdf.php');
+
+class PDF extends FPDF
+{
+function Header()
+{
+    global $title;
+
+    //Arial bold 15
+    $this->SetFont('Arial','B',15);
+    //Calculate width of title and position
+    $w=$this->GetStringWidth($title)+6;
+    $this->SetX((210-$w)/2);
+    //Colors of frame, background and text
+    $this->SetDrawColor(0,80,180);
+    $this->SetFillColor(230,230,0);
+    $this->SetTextColor(220,50,50);
+    //Thickness of frame (1 mm)
+    $this->SetLineWidth(1);
+    //Title
+    $this->Cell($w,9,$title,1,1,'C',true);
+    //Line break
+    $this->Ln(10);
+}
+
+function Footer()
+{
+    //Position at 1.5 cm from bottom
+    $this->SetY(-15);
+    //Arial italic 8
+    $this->SetFont('Arial','I',8);
+    //Text color in gray
+    $this->SetTextColor(128);
+    //Page number
+    $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
+}
+
+function ChapterTitle($num,$label)
+{
+    //Arial 12
+    $this->SetFont('Arial','',12);
+    //Background color
+    $this->SetFillColor(200,220,255);
+    //Title
+    $this->Cell(0,6,"Chapter $num : $label",0,1,'L',true);
+    //Line break
+    $this->Ln(4);
+}
+
+function ChapterBody($file)
+{
+    //Read text file
+    $f=fopen($file,'r');
+    $txt=fread($f,filesize($file));
+    fclose($f);
+    //Times 12
+    $this->SetFont('Times','',12);
+    //Output justified text
+    $this->MultiCell(0,5,$txt);
+    //Line break
+    $this->Ln();
+    //Mention in italics
+    $this->SetFont('','I');
+    $this->Cell(0,5,'(end of excerpt)');
+}
+
+function PrintChapter($num,$title,$file)
+{
+    $this->AddPage();
+    $this->ChapterTitle($num,$title);
+    $this->ChapterBody($file);
+}
+}
+
+$pdf=new PDF();
+$title='20000 Leagues Under the Seas';
+$pdf->SetTitle($title);
+$pdf->SetAuthor('Jules Verne');
+$pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt');
+$pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt');
+$pdf->Output();
+?>
+
+

[Demo]

+The GetStringWidth() method allows to determine the length of a string in the current font, +which is used here to calculate the position and the width of the frame surrounding the title. +Then colors are set (via SetDrawColor(), SetFillColor() and SetTextColor()) and the +thickness of the line is set to 1 mm (against 0.2 by default) with SetLineWidth(). Finally, +we output the cell (the last parameter to true indicates that the background must +be filled). +
+
+The method used to print the paragraphs is MultiCell(). Each time a line reaches the +right extremity of the cell or a carriage return character is met, a line break is issued +and a new cell automatically created under the current one. Text is justified by default. +
+
+Two document properties are defined: the title (SetTitle()) and the author (SetAuthor()). +Properties can be viewed by two means. First is to open the document directly with Acrobat Reader, +go to the File menu and choose the Document Properties option. The second, also available from +the plug-in, is to right-click and select Document Properties. + + diff --git a/fpdf16/tutorial/tuto3.php b/fpdf16/tutorial/tuto3.php new file mode 100755 index 0000000..f84589a --- /dev/null +++ b/fpdf16/tutorial/tuto3.php @@ -0,0 +1,83 @@ +SetFont('Arial','B',15); + //Calculate width of title and position + $w=$this->GetStringWidth($title)+6; + $this->SetX((210-$w)/2); + //Colors of frame, background and text + $this->SetDrawColor(0,80,180); + $this->SetFillColor(230,230,0); + $this->SetTextColor(220,50,50); + //Thickness of frame (1 mm) + $this->SetLineWidth(1); + //Title + $this->Cell($w,9,$title,1,1,'C',true); + //Line break + $this->Ln(10); +} + +function Footer() +{ + //Position at 1.5 cm from bottom + $this->SetY(-15); + //Arial italic 8 + $this->SetFont('Arial','I',8); + //Text color in gray + $this->SetTextColor(128); + //Page number + $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C'); +} + +function ChapterTitle($num,$label) +{ + //Arial 12 + $this->SetFont('Arial','',12); + //Background color + $this->SetFillColor(200,220,255); + //Title + $this->Cell(0,6,"Chapter $num : $label",0,1,'L',true); + //Line break + $this->Ln(4); +} + +function ChapterBody($file) +{ + //Read text file + $f=fopen($file,'r'); + $txt=fread($f,filesize($file)); + fclose($f); + //Times 12 + $this->SetFont('Times','',12); + //Output justified text + $this->MultiCell(0,5,$txt); + //Line break + $this->Ln(); + //Mention in italics + $this->SetFont('','I'); + $this->Cell(0,5,'(end of excerpt)'); +} + +function PrintChapter($num,$title,$file) +{ + $this->AddPage(); + $this->ChapterTitle($num,$title); + $this->ChapterBody($file); +} +} + +$pdf=new PDF(); +$title='20000 Leagues Under the Seas'; +$pdf->SetTitle($title); +$pdf->SetAuthor('Jules Verne'); +$pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt'); +$pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt'); +$pdf->Output(); +?> diff --git a/fpdf16/tutorial/tuto4.htm b/fpdf16/tutorial/tuto4.htm new file mode 100755 index 0000000..f39b5b2 --- /dev/null +++ b/fpdf16/tutorial/tuto4.htm @@ -0,0 +1,136 @@ + + + + +Multi-columns + + + +

Multi-columns

+This example is a variant of the previous one showing how to lay the text across multiple +columns. +
+
<?php
+require('fpdf.php');
+
+class PDF extends FPDF
+{
+//Current column
+var $col=0;
+//Ordinate of column start
+var $y0;
+
+function Header()
+{
+    //Page header
+    global $title;
+
+    $this->SetFont('Arial','B',15);
+    $w=$this->GetStringWidth($title)+6;
+    $this->SetX((210-$w)/2);
+    $this->SetDrawColor(0,80,180);
+    $this->SetFillColor(230,230,0);
+    $this->SetTextColor(220,50,50);
+    $this->SetLineWidth(1);
+    $this->Cell($w,9,$title,1,1,'C',true);
+    $this->Ln(10);
+    //Save ordinate
+    $this->y0=$this->GetY();
+}
+
+function Footer()
+{
+    //Page footer
+    $this->SetY(-15);
+    $this->SetFont('Arial','I',8);
+    $this->SetTextColor(128);
+    $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
+}
+
+function SetCol($col)
+{
+    //Set position at a given column
+    $this->col=$col;
+    $x=10+$col*65;
+    $this->SetLeftMargin($x);
+    $this->SetX($x);
+}
+
+function AcceptPageBreak()
+{
+    //Method accepting or not automatic page break
+    if($this->col<2)
+    {
+        //Go to next column
+        $this->SetCol($this->col+1);
+        //Set ordinate to top
+        $this->SetY($this->y0);
+        //Keep on page
+        return false;
+    }
+    else
+    {
+        //Go back to first column
+        $this->SetCol(0);
+        //Page break
+        return true;
+    }
+}
+
+function ChapterTitle($num,$label)
+{
+    //Title
+    $this->SetFont('Arial','',12);
+    $this->SetFillColor(200,220,255);
+    $this->Cell(0,6,"Chapter $num : $label",0,1,'L',true);
+    $this->Ln(4);
+    //Save ordinate
+    $this->y0=$this->GetY();
+}
+
+function ChapterBody($file)
+{
+    //Read text file
+    $f=fopen($file,'r');
+    $txt=fread($f,filesize($file));
+    fclose($f);
+    //Font
+    $this->SetFont('Times','',12);
+    //Output text in a 6 cm width column
+    $this->MultiCell(60,5,$txt);
+    $this->Ln();
+    //Mention
+    $this->SetFont('','I');
+    $this->Cell(0,5,'(end of excerpt)');
+    //Go back to first column
+    $this->SetCol(0);
+}
+
+function PrintChapter($num,$title,$file)
+{
+    //Add chapter
+    $this->AddPage();
+    $this->ChapterTitle($num,$title);
+    $this->ChapterBody($file);
+}
+}
+
+$pdf=new PDF();
+$title='20000 Leagues Under the Seas';
+$pdf->SetTitle($title);
+$pdf->SetAuthor('Jules Verne');
+$pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt');
+$pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt');
+$pdf->Output();
+?>
+
+

[Demo]

+The key method used is AcceptPageBreak(). It allows to accept or not an automatic page +break. By refusing it and altering the margin and current position, the desired column layout +is achieved. +
+For the rest, not many changes; two properties have been added to the class to save the current +column number and the position where columns begin, and the MultiCell() call specifies a +6 centimeter width. + + diff --git a/fpdf16/tutorial/tuto4.php b/fpdf16/tutorial/tuto4.php new file mode 100755 index 0000000..d54bc8a --- /dev/null +++ b/fpdf16/tutorial/tuto4.php @@ -0,0 +1,113 @@ +SetFont('Arial','B',15); + $w=$this->GetStringWidth($title)+6; + $this->SetX((210-$w)/2); + $this->SetDrawColor(0,80,180); + $this->SetFillColor(230,230,0); + $this->SetTextColor(220,50,50); + $this->SetLineWidth(1); + $this->Cell($w,9,$title,1,1,'C',true); + $this->Ln(10); + //Save ordinate + $this->y0=$this->GetY(); +} + +function Footer() +{ + //Page footer + $this->SetY(-15); + $this->SetFont('Arial','I',8); + $this->SetTextColor(128); + $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C'); +} + +function SetCol($col) +{ + //Set position at a given column + $this->col=$col; + $x=10+$col*65; + $this->SetLeftMargin($x); + $this->SetX($x); +} + +function AcceptPageBreak() +{ + //Method accepting or not automatic page break + if($this->col<2) + { + //Go to next column + $this->SetCol($this->col+1); + //Set ordinate to top + $this->SetY($this->y0); + //Keep on page + return false; + } + else + { + //Go back to first column + $this->SetCol(0); + //Page break + return true; + } +} + +function ChapterTitle($num,$label) +{ + //Title + $this->SetFont('Arial','',12); + $this->SetFillColor(200,220,255); + $this->Cell(0,6,"Chapter $num : $label",0,1,'L',true); + $this->Ln(4); + //Save ordinate + $this->y0=$this->GetY(); +} + +function ChapterBody($file) +{ + //Read text file + $f=fopen($file,'r'); + $txt=fread($f,filesize($file)); + fclose($f); + //Font + $this->SetFont('Times','',12); + //Output text in a 6 cm width column + $this->MultiCell(60,5,$txt); + $this->Ln(); + //Mention + $this->SetFont('','I'); + $this->Cell(0,5,'(end of excerpt)'); + //Go back to first column + $this->SetCol(0); +} + +function PrintChapter($num,$title,$file) +{ + //Add chapter + $this->AddPage(); + $this->ChapterTitle($num,$title); + $this->ChapterBody($file); +} +} + +$pdf=new PDF(); +$title='20000 Leagues Under the Seas'; +$pdf->SetTitle($title); +$pdf->SetAuthor('Jules Verne'); +$pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt'); +$pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt'); +$pdf->Output(); +?> diff --git a/fpdf16/tutorial/tuto5.htm b/fpdf16/tutorial/tuto5.htm new file mode 100755 index 0000000..f22b175 --- /dev/null +++ b/fpdf16/tutorial/tuto5.htm @@ -0,0 +1,133 @@ + + + + +Tables + + + +

Tables

+This tutorial shows how to make tables easily. +
+
<?php
+require('fpdf.php');
+
+class PDF extends FPDF
+{
+//Load data
+function LoadData($file)
+{
+    //Read file lines
+    $lines=file($file);
+    $data=array();
+    foreach($lines as $line)
+        $data[]=explode(';',chop($line));
+    return $data;
+}
+
+//Simple table
+function BasicTable($header,$data)
+{
+    //Header
+    foreach($header as $col)
+        $this->Cell(40,7,$col,1);
+    $this->Ln();
+    //Data
+    foreach($data as $row)
+    {
+        foreach($row as $col)
+            $this->Cell(40,6,$col,1);
+        $this->Ln();
+    }
+}
+
+//Better table
+function ImprovedTable($header,$data)
+{
+    //Column widths
+    $w=array(40,35,40,45);
+    //Header
+    for($i=0;$i<count($header);$i++)
+        $this->Cell($w[$i],7,$header[$i],1,0,'C');
+    $this->Ln();
+    //Data
+    foreach($data as $row)
+    {
+        $this->Cell($w[0],6,$row[0],'LR');
+        $this->Cell($w[1],6,$row[1],'LR');
+        $this->Cell($w[2],6,number_format($row[2]),'LR',0,'R');
+        $this->Cell($w[3],6,number_format($row[3]),'LR',0,'R');
+        $this->Ln();
+    }
+    //Closure line
+    $this->Cell(array_sum($w),0,'','T');
+}
+
+//Colored table
+function FancyTable($header,$data)
+{
+    //Colors, line width and bold font
+    $this->SetFillColor(255,0,0);
+    $this->SetTextColor(255);
+    $this->SetDrawColor(128,0,0);
+    $this->SetLineWidth(.3);
+    $this->SetFont('','B');
+    //Header
+    $w=array(40,35,40,45);
+    for($i=0;$i<count($header);$i++)
+        $this->Cell($w[$i],7,$header[$i],1,0,'C',true);
+    $this->Ln();
+    //Color and font restoration
+    $this->SetFillColor(224,235,255);
+    $this->SetTextColor(0);
+    $this->SetFont('');
+    //Data
+    $fill=false;
+    foreach($data as $row)
+    {
+        $this->Cell($w[0],6,$row[0],'LR',0,'L',$fill);
+        $this->Cell($w[1],6,$row[1],'LR',0,'L',$fill);
+        $this->Cell($w[2],6,number_format($row[2]),'LR',0,'R',$fill);
+        $this->Cell($w[3],6,number_format($row[3]),'LR',0,'R',$fill);
+        $this->Ln();
+        $fill=!$fill;
+    }
+    $this->Cell(array_sum($w),0,'','T');
+}
+}
+
+$pdf=new PDF();
+//Column titles
+$header=array('Country','Capital','Area (sq km)','Pop. (thousands)');
+//Data loading
+$data=$pdf->LoadData('countries.txt');
+$pdf->SetFont('Arial','',14);
+$pdf->AddPage();
+$pdf->BasicTable($header,$data);
+$pdf->AddPage();
+$pdf->ImprovedTable($header,$data);
+$pdf->AddPage();
+$pdf->FancyTable($header,$data);
+$pdf->Output();
+?>
+
+

[Demo]

+A table being just a collection of cells, it is natural to build one from them. The first +example is achieved in the most basic way possible: simple framed cells, all of the same size +and left aligned. The result is rudimentary but very quick to obtain. +
+
+The second table brings some improvements: each column has its own width, titles are centered +and figures right aligned. Moreover, horizontal lines have been removed. This is done by means +of the border parameter of the Cell() method, which specifies which sides of the +cell must be drawn. Here we want the left (L) and right (R) ones. It remains +the problem of the horizontal line to finish the table. There are two possibilities: either +check for the last line in the loop, in which case we use LRB for the border +parameter; or, as done here, add the line once the loop is over. +
+
+The third table is similar to the second one but uses colors. Fill, text and line colors are +simply specified. Alternate coloring for rows is obtained by using alternatively transparent +and filled cells. + + diff --git a/fpdf16/tutorial/tuto5.php b/fpdf16/tutorial/tuto5.php new file mode 100755 index 0000000..eb13772 --- /dev/null +++ b/fpdf16/tutorial/tuto5.php @@ -0,0 +1,101 @@ +Cell(40,7,$col,1); + $this->Ln(); + //Data + foreach($data as $row) + { + foreach($row as $col) + $this->Cell(40,6,$col,1); + $this->Ln(); + } +} + +//Better table +function ImprovedTable($header,$data) +{ + //Column widths + $w=array(40,35,40,45); + //Header + for($i=0;$iCell($w[$i],7,$header[$i],1,0,'C'); + $this->Ln(); + //Data + foreach($data as $row) + { + $this->Cell($w[0],6,$row[0],'LR'); + $this->Cell($w[1],6,$row[1],'LR'); + $this->Cell($w[2],6,number_format($row[2]),'LR',0,'R'); + $this->Cell($w[3],6,number_format($row[3]),'LR',0,'R'); + $this->Ln(); + } + //Closure line + $this->Cell(array_sum($w),0,'','T'); +} + +//Colored table +function FancyTable($header,$data) +{ + //Colors, line width and bold font + $this->SetFillColor(255,0,0); + $this->SetTextColor(255); + $this->SetDrawColor(128,0,0); + $this->SetLineWidth(.3); + $this->SetFont('','B'); + //Header + $w=array(40,35,40,45); + for($i=0;$iCell($w[$i],7,$header[$i],1,0,'C',true); + $this->Ln(); + //Color and font restoration + $this->SetFillColor(224,235,255); + $this->SetTextColor(0); + $this->SetFont(''); + //Data + $fill=false; + foreach($data as $row) + { + $this->Cell($w[0],6,$row[0],'LR',0,'L',$fill); + $this->Cell($w[1],6,$row[1],'LR',0,'L',$fill); + $this->Cell($w[2],6,number_format($row[2]),'LR',0,'R',$fill); + $this->Cell($w[3],6,number_format($row[3]),'LR',0,'R',$fill); + $this->Ln(); + $fill=!$fill; + } + $this->Cell(array_sum($w),0,'','T'); +} +} + +$pdf=new PDF(); +//Column titles +$header=array('Country','Capital','Area (sq km)','Pop. (thousands)'); +//Data loading +$data=$pdf->LoadData('countries.txt'); +$pdf->SetFont('Arial','',14); +$pdf->AddPage(); +$pdf->BasicTable($header,$data); +$pdf->AddPage(); +$pdf->ImprovedTable($header,$data); +$pdf->AddPage(); +$pdf->FancyTable($header,$data); +$pdf->Output(); +?> diff --git a/fpdf16/tutorial/tuto6.htm b/fpdf16/tutorial/tuto6.htm new file mode 100755 index 0000000..d943b04 --- /dev/null +++ b/fpdf16/tutorial/tuto6.htm @@ -0,0 +1,163 @@ + + + + +Links and flowing text + + + +

Links and flowing text

+This tutorial explains how to insert links (internal and external) and shows a new text writing +mode. It also contains a basic HTML parser. +
+
<?php
+require('fpdf.php');
+
+class PDF extends FPDF
+{
+var $B;
+var $I;
+var $U;
+var $HREF;
+
+function PDF($orientation='P',$unit='mm',$format='A4')
+{
+    //Call parent constructor
+    $this->FPDF($orientation,$unit,$format);
+    //Initialization
+    $this->B=0;
+    $this->I=0;
+    $this->U=0;
+    $this->HREF='';
+}
+
+function WriteHTML($html)
+{
+    //HTML parser
+    $html=str_replace("\n",' ',$html);
+    $a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
+    foreach($a as $i=>$e)
+    {
+        if($i%2==0)
+        {
+            //Text
+            if($this->HREF)
+                $this->PutLink($this->HREF,$e);
+            else
+                $this->Write(5,$e);
+        }
+        else
+        {
+            //Tag
+            if($e{0}=='/')
+                $this->CloseTag(strtoupper(substr($e,1)));
+            else
+            {
+                //Extract attributes
+                $a2=explode(' ',$e);
+                $tag=strtoupper(array_shift($a2));
+                $attr=array();
+                foreach($a2 as $v)
+                {
+                    if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
+                        $attr[strtoupper($a3[1])]=$a3[2];
+                }
+                $this->OpenTag($tag,$attr);
+            }
+        }
+    }
+}
+
+function OpenTag($tag,$attr)
+{
+    //Opening tag
+    if($tag=='B' or $tag=='I' or $tag=='U')
+        $this->SetStyle($tag,true);
+    if($tag=='A')
+        $this->HREF=$attr['HREF'];
+    if($tag=='BR')
+        $this->Ln(5);
+}
+
+function CloseTag($tag)
+{
+    //Closing tag
+    if($tag=='B' or $tag=='I' or $tag=='U')
+        $this->SetStyle($tag,false);
+    if($tag=='A')
+        $this->HREF='';
+}
+
+function SetStyle($tag,$enable)
+{
+    //Modify style and select corresponding font
+    $this->$tag+=($enable ? 1 : -1);
+    $style='';
+    foreach(array('B','I','U') as $s)
+        if($this->$s>0)
+            $style.=$s;
+    $this->SetFont('',$style);
+}
+
+function PutLink($URL,$txt)
+{
+    //Put a hyperlink
+    $this->SetTextColor(0,0,255);
+    $this->SetStyle('U',true);
+    $this->Write(5,$txt,$URL);
+    $this->SetStyle('U',false);
+    $this->SetTextColor(0);
+}
+}
+
+$html='You can now easily print text mixing different styles: <b>bold</b>, <i>italic</i>,
+<u>underlined</u>, or <b><i><u>all at once</u></i></b>!<br><br>You can also insert links on
+text, such as <a href="http://www.fpdf.org">www.fpdf.org</a>, or on an image: click on the logo.';
+
+$pdf=new PDF();
+//First page
+$pdf->AddPage();
+$pdf->SetFont('Arial','',20);
+$pdf->Write(5,'To find out what\'s new in this tutorial, click ');
+$pdf->SetFont('','U');
+$link=$pdf->AddLink();
+$pdf->Write(5,'here',$link);
+$pdf->SetFont('');
+//Second page
+$pdf->AddPage();
+$pdf->SetLink($link);
+$pdf->Image('logo.png',10,12,30,0,'','http://www.fpdf.org');
+$pdf->SetLeftMargin(45);
+$pdf->SetFontSize(14);
+$pdf->WriteHTML($html);
+$pdf->Output();
+?>
+
+

[Demo]

+The new method to print text is Write(). It is very close to MultiCell(); the differences are: +
    +
  • The end of line is at the right margin and the next line begins at the left one
  • +
  • The current position moves at the end of the text
  • +
+So it allows to write a chunk of text, alter the font style, then continue from the exact +place we left it. On the other hand, you cannot justify it. +
+
+The method is used on the first page to put a link pointing to the second one. The beginning of +the sentence is written in regular style, then we switch to underline and finish it. The link +is created with AddLink(), which returns a link identifier. The identifier is +passed as third parameter of Write(). Once the second page is created, we use SetLink() to +make the link point to the beginning of the current page. +
+
+Then we put an image with a link on it. An external link points to an URL (HTTP, mailto...). +The URL is simply passed as last parameter of Image(). +
+
+Finally, the left margin is moved after the image with SetLeftMargin() and some text in +HTML format is output. A very simple HTML parser is used for this, based on regular expressions. +Recognized tags are <b>, <i>, <u>, <a> and <br>; the others are +ignored. The parser also makes use of the Write() method. An external link is put the same way as +an internal one (third parameter of Write()). Note that Cell() also allows to put links. + + diff --git a/fpdf16/tutorial/tuto6.php b/fpdf16/tutorial/tuto6.php new file mode 100755 index 0000000..bf021ba --- /dev/null +++ b/fpdf16/tutorial/tuto6.php @@ -0,0 +1,122 @@ +FPDF($orientation,$unit,$format); + //Initialization + $this->B=0; + $this->I=0; + $this->U=0; + $this->HREF=''; +} + +function WriteHTML($html) +{ + //HTML parser + $html=str_replace("\n",' ',$html); + $a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE); + foreach($a as $i=>$e) + { + if($i%2==0) + { + //Text + if($this->HREF) + $this->PutLink($this->HREF,$e); + else + $this->Write(5,$e); + } + else + { + //Tag + if($e{0}=='/') + $this->CloseTag(strtoupper(substr($e,1))); + else + { + //Extract attributes + $a2=explode(' ',$e); + $tag=strtoupper(array_shift($a2)); + $attr=array(); + foreach($a2 as $v) + { + if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3)) + $attr[strtoupper($a3[1])]=$a3[2]; + } + $this->OpenTag($tag,$attr); + } + } + } +} + +function OpenTag($tag,$attr) +{ + //Opening tag + if($tag=='B' or $tag=='I' or $tag=='U') + $this->SetStyle($tag,true); + if($tag=='A') + $this->HREF=$attr['HREF']; + if($tag=='BR') + $this->Ln(5); +} + +function CloseTag($tag) +{ + //Closing tag + if($tag=='B' or $tag=='I' or $tag=='U') + $this->SetStyle($tag,false); + if($tag=='A') + $this->HREF=''; +} + +function SetStyle($tag,$enable) +{ + //Modify style and select corresponding font + $this->$tag+=($enable ? 1 : -1); + $style=''; + foreach(array('B','I','U') as $s) + if($this->$s>0) + $style.=$s; + $this->SetFont('',$style); +} + +function PutLink($URL,$txt) +{ + //Put a hyperlink + $this->SetTextColor(0,0,255); + $this->SetStyle('U',true); + $this->Write(5,$txt,$URL); + $this->SetStyle('U',false); + $this->SetTextColor(0); +} +} + +$html='You can now easily print text mixing different styles: bold, italic, +underlined, or all at once!

You can also insert links on +text, such as www.fpdf.org, or on an image: click on the logo.'; + +$pdf=new PDF(); +//First page +$pdf->AddPage(); +$pdf->SetFont('Arial','',20); +$pdf->Write(5,'To find out what\'s new in this tutorial, click '); +$pdf->SetFont('','U'); +$link=$pdf->AddLink(); +$pdf->Write(5,'here',$link); +$pdf->SetFont(''); +//Second page +$pdf->AddPage(); +$pdf->SetLink($link); +$pdf->Image('logo.png',10,12,30,0,'','http://www.fpdf.org'); +$pdf->SetLeftMargin(45); +$pdf->SetFontSize(14); +$pdf->WriteHTML($html); +$pdf->Output(); +?> diff --git a/fpdf16/tutorial/tuto7.htm b/fpdf16/tutorial/tuto7.htm new file mode 100755 index 0000000..0212fb9 --- /dev/null +++ b/fpdf16/tutorial/tuto7.htm @@ -0,0 +1,303 @@ + + + + +Adding new fonts and encoding support + + + + +

Adding new fonts and encoding support

+This tutorial explains how to use TrueType or Type1 fonts so that you are not limited to the standard +fonts any more. The other interest is that you can choose the font encoding, which allows you to +use other languages than the Western ones (the standard fonts having too few available characters). +
+
+There are two ways to use a new font: embedding it in the PDF or not. When a font is not +embedded, it is searched in the system. The advantage is that the PDF file is lighter; on the other +hand, if it is not available, a substitution font is used. So it is preferable to ensure that the +needed font is installed on the client systems. If the file is to be viewed by a large audience, +it is recommended to embed. +
+
+Adding a new font requires three steps for TrueTypes: +
    +
  • Generation of the metric file (.afm)
  • +
  • Generation of the font definition file (.php)
  • +
  • Declaration of the font in the script
  • +
+For Type1, the first one is theoretically not necessary because the AFM file is usually shipped +with the font. In case you have only a metric file in PFM format, use the convertor available +here. +

Generation of the metric file

+The first step for a TrueType consists in generating the AFM file. A utility exists to do this +task: ttf2pt1. The Windows binary +is available here. The command line to use is +the following: +
+
+ttf2pt1 -a font.ttf font +
+
+For example, for Comic Sans MS Regular: +
+
+ttf2pt1 -a c:\windows\fonts\comic.ttf comic +
+
+Two files are created; the one we are interested in is comic.afm. +

Generation of the font definition file

+The second step consists in generating a PHP file containing all the information needed by FPDF; +in addition, the font file is compressed. To do this, a helper script is provided in the font/makefont/ +directory of the package: makefont.php. It contains the following function: +
+
+MakeFont(string fontfile, string afmfile [, string enc [, array patch [, string type]]]) +
+
fontfile
+
+

Path to the .ttf or .pfb file.

+
+
afmfile
+
+

Path to the .afm file.

+
+
enc
+
+

Name of the encoding to use. Default value: cp1252.

+
+
patch
+
+

Optional modification of the encoding. Empty by default.

+
+
type
+
+

Type of the font (TrueType or Type1). Default value: TrueType.

+
+
+The first parameter is the name of the font file. The extension must be either .ttf or .pfb and +determines the font type. If you own a Type1 font in ASCII format (.pfa), you can convert it to +binary format with t1utils. +
+If you don't want to embed the font, pass an empty string. In this case, type is given by the +type parameter. +
+Note: in the case of a font with the same name as a standard one, for instance arial.ttf, it is +recommended to embed. If you don't, some versions of Acrobat will use their own fonts. +
+
+The AFM file is the one previously generated. +
+
+The encoding defines the association between a code (from 0 to 255) and a character. The first +128 are fixed and correspond to ASCII; the following are variable. The encodings are stored in +.map files. Those available are: +
    +
  • cp1250 (Central Europe)
  • +
  • cp1251 (Cyrillic)
  • +
  • cp1252 (Western Europe)
  • +
  • cp1253 (Greek)
  • +
  • cp1254 (Turkish)
  • +
  • cp1255 (Hebrew)
  • +
  • cp1257 (Baltic)
  • +
  • cp1258 (Vietnamese)
  • +
  • cp874 (Thai)
  • +
  • ISO-8859-1 (Western Europe)
  • +
  • ISO-8859-2 (Central Europe)
  • +
  • ISO-8859-4 (Baltic)
  • +
  • ISO-8859-5 (Cyrillic)
  • +
  • ISO-8859-7 (Greek)
  • +
  • ISO-8859-9 (Turkish)
  • +
  • ISO-8859-11 (Thai)
  • +
  • ISO-8859-15 (Western Europe)
  • +
  • ISO-8859-16 (Central Europe)
  • +
  • KOI8-R (Russian)
  • +
  • KOI8-U (Ukrainian)
  • +
+Of course, the font must contain the characters corresponding to the chosen encoding. +
+In the particular case of a symbolic font (that is to say which does not contain letters, such +as Symbol or ZapfDingbats), pass an empty string. +
+The encodings which begin with cp are those used by Windows; Linux systems usually use ISO. +
+Remark: the standard fonts use cp1252. +
+
+The fourth parameter gives the possibility to alter the encoding. Sometimes you may want to add +some characters. For instance, ISO-8859-1 does not contain the euro symbol. To add it at position +164, pass array(164=>'Euro'). +
+
+The last parameter is used to give the type of the font in case it is not embedded (that is to +say the first parameter is empty). +
+
+After you have called the function (create a new file for this and include makefont.php, or +simply add the call directly inside), a .php file is created, with the same name as the .afm one. +You may rename it if you wish. If the case of embedding, the font file is compressed and gives a +second file with .z as extension (except if the compression function is not available, it +requires zlib). You may rename it too, but in this case you have to alter the variable $file +in the .php file accordingly. +
+
+Example: +
+
MakeFont('c:\\windows\\fonts\\comic.ttf','comic.afm','cp1252');
+
+
+which gives the files comic.php and comic.z. +
+
+Then you have to copy the generated file(s) to the font directory. If the font file +could not be compressed, copy the .ttf or .pfb instead of the .z. +
+
+Remark: for TTF fonts, you can generate the files online here +instead of doing it manually. +

Declaration of the font in the script

+The last step is the most simple. You just need to call the AddFont() method. For instance: +
+
$pdf->AddFont('Comic','','comic.php');
+
+
+or simply: +
+
$pdf->AddFont('Comic');
+
+
+And the font is now available (in regular and underlined styles), usable like the others. If we +had worked with Comic Sans MS Bold (comicbd.ttf), we would have put: +
+
$pdf->AddFont('Comic','B','comicbd.php');
+
+
+

Example

+Let's now see a small complete example. The font used is Calligrapher, available at +www.abstractfonts.com (a site +offering numerous free TrueType fonts). The first step is the generation of the AFM file: +
+
+ttf2pt1 -a calligra.ttf calligra +
+
+which gives calligra.afm (and calligra.t1a that we can delete). Then we generate the definition +file: +
+
<?php
+require('font/makefont/makefont.php');
+
+MakeFont('calligra.ttf','calligra.afm');
+?>
+
+The function call gives the following report: +
+
+Warning: character Euro is missing
+Warning: character Zcaron is missing
+Warning: character zcaron is missing
+Warning: character eth is missing
+Font file compressed (calligra.z)
+Font definition file generated (calligra.php)
+
+The euro character is not present in the font (it is too old). Three other characters are missing +too, but we are not interested in them anyway. +
+We can now copy the two files to the font directory and write the script: +
+
<?php
+require('fpdf.php');
+
+$pdf=new FPDF();
+$pdf->AddFont('Calligrapher','','calligra.php');
+$pdf->AddPage();
+$pdf->SetFont('Calligrapher','',35);
+$pdf->Cell(0,10,'Enjoy new fonts with FPDF!');
+$pdf->Output();
+?>
+
+

[Demo]

+

About the euro symbol

+The euro character is not present in all encodings, and is not always placed at the same position: + + + + + + + + + + + + + + + + + + + + + + +
EncodingPosition
cp1250128
cp1251136
cp1252128
cp1253128
cp1254128
cp1255128
cp1257128
cp1258128
cp874128
ISO-8859-1absent
ISO-8859-2absent
ISO-8859-4absent
ISO-8859-5absent
ISO-8859-7absent
ISO-8859-9absent
ISO-8859-11absent
ISO-8859-15164
ISO-8859-16164
KOI8-Rabsent
KOI8-Uabsent
+ISO-8859-1 is widespread but does not include the euro sign. If you need it, the simplest thing +to do is using cp1252 or ISO-8859-15 instead, which are nearly identical but contain the precious +symbol. +
+As for ISO-8859-2, it is possible to use ISO-8859-16 instead, but it contains many differences. +It is therefore simpler to patch the encoding to add the symbol to it, as explained above. The +same is true for the other encodings. +

Font synthesis under Windows

+When a TrueType font is not available in a given style, Windows is able to synthesize it from the +regular version. For instance, there is no Comic Sans MS Italic, but it can be built from Comic +Sans MS Regular. This feature can be used in a PDF file, but unfortunately requires that the +regular font be present in the system (you must not embed it). Here is how to do it: +
    +
  • Generate the definition file for the regular font without embedding (you may rename it to +reflect the desired style)
  • +
  • Open it and append to the variable $name a comma followed by the desired style +(Italic, Bold or BoldItalic)
  • +
+For instance, for the file comici.php: +
+
+$name='ComicSansMS,Italic'; +
+
+It can then be used normally: +
+
$pdf->AddFont('Comic','I','comici.php');
+
+
+

Reducing the size of TrueType fonts

+Font files are often quite voluminous (more than 100, even 200KB); this is due to the fact that +they contain the characters corresponding to many encodings. zlib compression reduces them but +they remain fairly big. A technique exists to reduce them further. It consists in converting the +font to the Type1 format with ttf2pt1 by specifying the encoding you are interested in; all other +characters will be discarded. +
+For instance, the arial.ttf font shipped with Windows 98 is 267KB (it contains 1296 characters). +After compression it gives 147. Let's convert it to Type1 by keeping only cp1250 characters: +
+
+ttf2pt1 -b -L cp1250.map c:\windows\fonts\arial.ttf arial +
+
+The .map files are located in the font/makefont/ directory of the package. The command produces +arial.pfb and arial.afm. The arial.pfb file is only 35KB, and 30KB after compression. +
+
+It is possible to go even further. If you are interested only by a subset of the encoding (you +probably don't need all 217 characters), you can open the .map file and remove the lines you are +not interested in. This will reduce the file size accordingly. + + diff --git a/fpdf16/tutorial/tuto7.php b/fpdf16/tutorial/tuto7.php new file mode 100755 index 0000000..0d309d0 --- /dev/null +++ b/fpdf16/tutorial/tuto7.php @@ -0,0 +1,11 @@ +AddFont('Calligrapher','','calligra.php'); +$pdf->AddPage(); +$pdf->SetFont('Calligrapher','',35); +$pdf->Cell(0,10,'Enjoy new fonts with FPDF!'); +$pdf->Output(); +?> diff --git a/images/alt/pme-change.png b/images/alt/pme-change.png new file mode 100644 index 0000000..f3704f5 Binary files /dev/null and b/images/alt/pme-change.png differ diff --git a/images/alt/pme-copy.png b/images/alt/pme-copy.png new file mode 100644 index 0000000..6f9244a Binary files /dev/null and b/images/alt/pme-copy.png differ diff --git a/images/alt/pme-delete.png b/images/alt/pme-delete.png new file mode 100644 index 0000000..56e6835 Binary files /dev/null and b/images/alt/pme-delete.png differ diff --git a/images/alt/pme-view.png b/images/alt/pme-view.png new file mode 100644 index 0000000..bd4b9c4 Binary files /dev/null and b/images/alt/pme-view.png differ diff --git a/images/pme-change.png b/images/pme-change.png new file mode 100644 index 0000000..046811e Binary files /dev/null and b/images/pme-change.png differ diff --git a/images/pme-copy.png b/images/pme-copy.png new file mode 100644 index 0000000..195dc6d Binary files /dev/null and b/images/pme-copy.png differ diff --git a/images/pme-delete.png b/images/pme-delete.png new file mode 100644 index 0000000..afe22ba Binary files /dev/null and b/images/pme-delete.png differ diff --git a/images/pme-view.png b/images/pme-view.png new file mode 100644 index 0000000..7b7fbd1 Binary files /dev/null and b/images/pme-view.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..8a677a5 --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + +SAFE + + + + +<body>Your browser does not support frames.<br> +</body> + + + + diff --git a/invoice.php b/invoice.php new file mode 100644 index 0000000..c8c9fc8 --- /dev/null +++ b/invoice.php @@ -0,0 +1,149 @@ +A fatal MySQL error occured.\n
Query: " . $qry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); +$inv = mysql_fetch_array($result); + +$cqry = "SELECT * FROM ".$opts['cu']." WHERE customerid = ".$inv["customerid"]; +$cresult = mysql_query($cqry) or die("A fatal MySQL error occured.\n
Query: " . $cqry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); +$customer = mysql_fetch_array($cresult); + +// Check if we need to compute VAT +// Yes by default +$includevat = true; +if(!empty($customer["vatnr"])) { + if(!is_numeric(substr($customer["vatnr"],0,2)) && (strtoupper(substr($customer["vatnr"],0,2)) != "NL")) { + $includevat = false; + } +} + +$pdf=new PDF(); +$fontname="Arial"; +$alternatefontname="Times"; +$pdf->AliasNbPages(); +$pdf->AddPage(); + +$leftmargin = 15; + +// Create customer address box +$pdf->SetFont($fontname,'',12); +$pdf->SetY(45); +$pdf->Cell($leftmargin); +$pdf->Cell(80,6,$customer["customername"]); +$pdf->Ln(); +if(!empty($customer["attn"])) { + $pdf->Cell($leftmargin); + $pdf->Cell(80,6,$strings[$customer["language"]]["attn"].$customer["attn"]); + $pdf->Ln(); +} +$pdf->Cell($leftmargin); +$pdf->Cell(80,6,$customer["street"]); +$pdf->Ln(); +$pdf->Cell($leftmargin); +$pdf->Cell(80,6,$customer["zipcode"]." ".$customer["city"]); +$pdf->Ln(); +if(!empty($customer["country"])) { + $pdf->Cell($leftmargin); + $pdf->Cell(80,6,$customer["country"]); + $pdf->Ln(); +} + +// Date and reference +$nicedate = strtolower(date("j-M-Y", strtotime($inv["invoicelinedate"]))); +$pdf->SetY(80); +$pdf->Cell($leftmargin); +$pdf->Cell(80,6,$strings[$customer["language"]]["date"].$nicedate); +$pdf->Ln(); +$pdf->Cell($leftmargin); +$pdf->Cell(80,6,$strings[$customer["language"]]["subject"].$inv["invoiceid"]); +$pdf->Ln(); +$pdf->Ln(); + +// Introductory text +$pdf->Cell($leftmargin); +$pdf->MultiCell(170,6,$strings[$customer["language"]]["pretext"]); +$pdf->Ln(); + +// Header row +$pdf->SetFont($alternatefontname,'',10); +$pdf->Cell($leftmargin); +$pdf->Cell(10,6,"#"); +$pdf->Cell(120,6,""); +$pdf->Cell(20,6,$strings[$customer["language"]]["itemprice"],0,0,'R'); +$pdf->Cell(20,6,$strings[$customer["language"]]["linetotal"],0,0,'R'); +$pdf->Ln(); + +// Build the table with invoiceable items +mysql_data_seek($result, 0); +$total = 0; +$pdf->SetFont($fontname,'',10); +while ($invoiceline = mysql_fetch_array($result)) { + $pdf->Cell($leftmargin); + $pdf->Cell(10,6,$invoiceline["amount"]); + $pdf->Cell(120,6,$invoiceline["description"]); + $pdf->Cell(20,6,EURO." ".number_format($invoiceline["charge"],2,",",""),0,0,'R'); + $pdf->Cell(20,6,EURO." ".number_format($invoiceline["amount"]*$invoiceline["charge"],2,",",""),0,0,'R'); + $pdf->Ln(); + $total += $invoiceline["amount"]*$invoiceline["charge"]; +} + +// Summation, VAT +$pdf->Cell($leftmargin); +$pdf->Cell(10,6,"",'T'); +$pdf->Cell(120,6,$strings[$customer["language"]]["invtotal"],'T'); +$pdf->Cell(20,6,"",'T'); +$pdf->Cell(20,6,EURO." ".number_format($total,2,",",""),'T',0,'R'); +$pdf->Ln(); +if($includevat) { + $vat = $total*($VATpct/100); + $pdf->Cell($leftmargin); + $pdf->Cell(10,6,""); + $pdf->Cell(120,6,"$VATpct% ".$strings[$customer["language"]]["vat"]); + $pdf->Cell(20,6,""); + $pdf->Cell(20,6,EURO." ".number_format($vat,2,",",""),0,0,'R'); + $pdf->Ln(); + $pdf->Cell($leftmargin); + $pdf->Cell(10,6,"",'T'); + $pdf->Cell(120,6,$strings[$customer["language"]]["invoiceable"],'T'); + $pdf->Cell(20,6,"",'T'); + $pdf->Cell(20,6,EURO." ".number_format($total+$vat,2,",",""),'T',0,'R'); + $pdf->Ln(); +} else { + if(!empty($customer["vatnr"])) { + $pdf->Cell($leftmargin); + $pdf->Cell(10,6,""); + $pdf->Cell(120,6,$strings[$customer["language"]]["your"]." ".$strings[$customer["language"]]["vat"]."nr: ".$customer["vatnr"]); + $pdf->Ln(); + } + $pdf->Cell($leftmargin); + $pdf->Cell(10,6,"",'T'); + $pdf->Cell(120,6,$strings[$customer["language"]]["invoiceable"],'T'); + $pdf->Cell(20,6,"",'T'); + $pdf->Cell(20,6,EURO." ".number_format($total,2,",",""),'T',0,'R'); + $pdf->Ln(); +} +// Finalisation text +$pdf->SetFont($fontname,'',12); +$pdf->Ln(); +$pdf->Cell($leftmargin); +$pdf->MultiCell(170,6,$strings[$customer["language"]]["posttext"]); +$pdf->Ln(); +$pdf->Cell($leftmargin); +$pdf->MultiCell(170,6,$strings[$customer["language"]]["signature"]); +$pdf->Ln(); + +$filename = $inv["invoiceid"]." ".$customer["customername"]." ".$inv["invoicelinedate"].".pdf"; +$pdf->Output(str_replace(" ", "_", $filename), "I"); +?> diff --git a/invoicelist.php b/invoicelist.php new file mode 100644 index 0000000..bdfa8a1 --- /dev/null +++ b/invoicelist.php @@ -0,0 +1,80 @@ + + + + + Items to invoice + + + +

Recent invoices

+A fatal MySQL error occured.\n
Query: " . $qry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + +?> +
+ + + + + + + +"; + echo ""; + echo ""; + echo ""; + echo "\n"; +} + +?> +
InvoiceCustomerDate
".$invoice["invoiceid"]."".$invoice["customername"]."".$invoice["invoicelinedate"]."
+ + + + diff --git a/itemstoinvoice.php b/itemstoinvoice.php new file mode 100644 index 0000000..7ce58bd --- /dev/null +++ b/itemstoinvoice.php @@ -0,0 +1,142 @@ + + + + + Items to invoice + + + +A fatal MySQL error occured.\n
Query: " . $qry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); +$count = mysql_num_rows($result); + +?> + +0) { ?> +

Items to invoice

+ + + + + + + + + + + +"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "\n"; +} + +?> +
 CustomerDescriptionInvoicelinedateAmountCharge
".$invoiceline["customername"]."".$invoiceline["description"]."".$invoiceline["invoicelinedate"]."".$invoiceline["amount"]."".$invoiceline["charge"]."
+
+ + +
+Create invoice number + +
+
+ + +

One-time invoice line

+
+ + + + + + + + + + + + + + + + + +
 CustomerDescriptionInvoicelinedateAmountCharge
 ">
+
+ + +
+Add new invoice line +
+
+ + + diff --git a/lang/PME.lang.CA-LATIN1.inc b/lang/PME.lang.CA-LATIN1.inc new file mode 100644 index 0000000..4387265 --- /dev/null +++ b/lang/PME.lang.CA-LATIN1.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.CA-LATIN1.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Afegir', + 'Copy' =>'Copiar', + 'Change' =>'Modificar', + 'Delete' =>'Suprimir', + 'View' =>'Visualitzar', + 'Prev' =>'Anterior', + 'Next' =>'Següent', + 'First' =>'Primer', + 'Last' =>'Últim', + 'Go to' =>'Ves a', + 'Page' =>'Pàgina', + 'Records' =>'Registres', + 'Save' =>'Salvar', + 'More' =>'Més', + 'Apply' =>'Aplicar', + 'Cancel' =>'Cancel·lar', + 'Search' =>'Cercar', + 'Hide' =>'Amagar', + 'Clear' =>'Netejar', + 'Query' =>'Consultar', + 'Current Query' =>'Consulta actual', + 'Sorted By' =>'Ordenat per', + 'ascending' =>'ascendent', + 'descending' =>'descendent', + 'hidden' =>'amagat', + 'of' =>'de', + 'record added' =>'Registre afegit', + 'record changed'=>'Registre modificat', + 'record deleted'=>'Registre esborrat', + 'Please enter' =>'Sisplau introdueixi ', + 'months' => Array( + '01'=>'Gener', + '02'=>'Febrer', + '03'=>'Març', + '04'=>'Abril', + '05'=>'Maig', + '06'=>'Juny', + '07'=>'Juliol', + '08'=>'Agost', + '09'=>'Septembre', + '10'=>'Octubre', + '11'=>'Novembre', + '12'=>'Desembre'), + // phpMyEdit-report + 'Make report' => 'Construir informe', + 'Select fields' => 'Seleccionar camps', + 'Records per screen' => 'Registres per pantalla', + ); + +?> diff --git a/lang/PME.lang.CA-UTF8.inc b/lang/PME.lang.CA-UTF8.inc new file mode 100644 index 0000000..1ced2b5 --- /dev/null +++ b/lang/PME.lang.CA-UTF8.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.CA-UTF8.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Afegir', + 'Copy' =>'Copiar', + 'Change' =>'Modificar', + 'Delete' =>'Suprimir', + 'View' =>'Visualitzar', + 'Prev' =>'Anterior', + 'Next' =>'Següent', + 'First' =>'Primer', + 'Last' =>'Últim', + 'Go to' =>'Ves a', + 'Page' =>'PÅ•gina', + 'Records' =>'Registres', + 'Save' =>'Salvar', + 'More' =>'Més', + 'Apply' =>'Aplicar', + 'Cancel' =>'Cancelˇlar', + 'Search' =>'Cercar', + 'Hide' =>'Amagar', + 'Clear' =>'Netejar', + 'Query' =>'Consultar', + 'Current Query' =>'Consulta actual', + 'Sorted By' =>'Ordenat per', + 'ascending' =>'ascendent', + 'descending' =>'descendent', + 'hidden' =>'amagat', + 'of' =>'de', + 'record added' =>'Registre afegit', + 'record changed'=>'Registre modificat', + 'record deleted'=>'Registre esborrat', + 'Please enter' =>'Sisplau introdueixi ', + 'months' => Array( + '01'=>'Gener', + '02'=>'Febrer', + '03'=>'Març', + '04'=>'Abril', + '05'=>'Maig', + '06'=>'Juny', + '07'=>'Juliol', + '08'=>'Agost', + '09'=>'Septembre', + '10'=>'Octubre', + '11'=>'Novembre', + '12'=>'Desembre'), + // phpMyEdit-report + 'Make report' => 'Construir informe', + 'Select fields' => 'Seleccionar camps', + 'Records per screen' => 'Registres per pantalla', + ); + +?> diff --git a/lang/PME.lang.CA.inc b/lang/PME.lang.CA.inc new file mode 100644 index 0000000..34d847b --- /dev/null +++ b/lang/PME.lang.CA.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.CZ-LATIN2.inc b/lang/PME.lang.CZ-LATIN2.inc new file mode 100644 index 0000000..a4c1313 --- /dev/null +++ b/lang/PME.lang.CZ-LATIN2.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.CZ-LATIN2.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Pøidat', + 'Copy' =>'Kopírovat', + 'Change' =>'Zmìnit', + 'Delete' =>'Smazat', + 'View' =>'Zobrazit', + 'Prev' =>'Pøedcházející', + 'Next' =>'Následující', + 'First' =>'První', + 'Last' =>'Poslední', + 'Go to' =>'Otevøít', + 'Page' =>'Stránka', + 'Records' =>'Záznamù', + 'Save' =>'Ulo¾it', + 'More' =>'Více', + 'Apply' =>'Pou¾ít', + 'Cancel' =>'Zru¹it', + 'Search' =>'Hledat', + 'Hide' =>'Skrýt', + 'Clear' =>'Smazat', + 'Query' =>'Dotaz', + 'Current Query' =>'Stávající dotaz', + 'Sorted By' =>'Uspoøádané podle', + 'ascending' =>'vzestupnì', + 'descending' =>'sestupnì', + 'hidden' =>'skrytý', + 'of' =>'z', + 'record added' =>'pøidaný záznam', + 'record changed'=>'zmìnìný záznam', + 'record deleted'=>'smazaný záznam', + 'Please enter' =>'Zadejte prosím', + 'months' => Array( + '01'=>'Leden', + '02'=>'Únor', + '03'=>'Bøezen', + '04'=>'Duben', + '05'=>'Kvìten', + '06'=>'Èerve', + '07'=>'Èervenec', + '08'=>'Srpen', + '09'=>'Záøí', + '10'=>'Øíjen', + '11'=>'Listopad', + '12'=>'Prosinec'), + // phpMyEdit-report + 'Make report' => 'Vytvoøit zprávu', + 'Select fields' => 'Vybrat pole', + 'Records per screen' => 'Poèet záznamù na stránce', + ); + +?> diff --git a/lang/PME.lang.CZ-UTF8.inc b/lang/PME.lang.CZ-UTF8.inc new file mode 100644 index 0000000..669c8c6 --- /dev/null +++ b/lang/PME.lang.CZ-UTF8.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.CZ-UTF8.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'PÅ™idat', + 'Copy' =>'Kopírovat', + 'Change' =>'ZmÄ›nit', + 'Delete' =>'Smazat', + 'View' =>'Zobrazit', + 'Prev' =>'PÅ™edcházející', + 'Next' =>'Následující', + 'First' =>'První', + 'Last' =>'Poslední', + 'Go to' =>'Otevřít', + 'Page' =>'Stránka', + 'Records' =>'Záznamů', + 'Save' =>'Uložit', + 'More' =>'Více', + 'Apply' =>'Použít', + 'Cancel' =>'ZruÅ¡it', + 'Search' =>'Hledat', + 'Hide' =>'Skrýt', + 'Clear' =>'Smazat', + 'Query' =>'Dotaz', + 'Current Query' =>'Stávající dotaz', + 'Sorted By' =>'Uspořádané podle', + 'ascending' =>'vzestupnÄ›', + 'descending' =>'sestupnÄ›', + 'hidden' =>'skrytý', + 'of' =>'z', + 'record added' =>'pÅ™idaný záznam', + 'record changed'=>'zmÄ›nÄ›ný záznam', + 'record deleted'=>'smazaný záznam', + 'Please enter' =>'Zadejte prosím', + 'months' => Array( + '01'=>'Leden', + '02'=>'Únor', + '03'=>'BÅ™ezen', + '04'=>'Duben', + '05'=>'KvÄ›ten', + '06'=>'ÄŒerve', + '07'=>'ÄŒervenec', + '08'=>'Srpen', + '09'=>'Září', + '10'=>'Říjen', + '11'=>'Listopad', + '12'=>'Prosinec'), + // phpMyEdit-report + 'Make report' => 'VytvoÅ™it zprávu', + 'Select fields' => 'Vybrat pole', + 'Records per screen' => 'PoÄet záznamů na stránce', + ); + +?> diff --git a/lang/PME.lang.CZ.inc b/lang/PME.lang.CZ.inc new file mode 100644 index 0000000..f8723dc --- /dev/null +++ b/lang/PME.lang.CZ.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.DE-LATIN1.inc b/lang/PME.lang.DE-LATIN1.inc new file mode 100644 index 0000000..3833146 --- /dev/null +++ b/lang/PME.lang.DE-LATIN1.inc @@ -0,0 +1,68 @@ + + * Gerd Xhonneux, http://xsite.xhonneux.com + * Martin Brückner + * info: http://makeashorterlink.com/?O116223C2 + */ + +/* $Platon: phpMyEdit/lang/PME.lang.DE-LATIN1.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Hinzufügen', + 'Copy' =>'Kopieren', + 'Change' =>'Ändern', + 'Delete' =>'Löschen', + 'View' =>'Anzeigen', + 'Prev' =>'Zurück', + 'Next' =>'Weiter', + 'First' =>'Erster', + 'Last' =>'Letzter', + 'Go to' =>'Gehe zu', + 'Page' =>'Seite', + 'Records' =>'Datensätze', + 'Save' =>'Speichern', + 'More' =>'Speichern, weiteren Datensatz hinzufügen', + 'Apply' =>'Anwenden', + 'Cancel' =>'Abbrechen', + 'Search' =>'Suche', + 'Hide' =>'Verstecken', + 'Clear' =>'Löschen', + 'Query' =>'Abfrage', + 'Current Query' =>'Aktuelle Abfrage', + 'Sorted By' =>'Sortiert nach', + 'ascending' =>'aufsteigend', + 'descending' =>'absteigend', + 'hidden' =>'versteckt', + 'of' =>'von', + 'record added' =>'Datensatz hinzugefügt', + 'record changed'=>'Datensatz geändert', + 'record deleted'=>'Datensatz gelöscht', + 'Please enter' =>'Bitte füllen sie dieses Feld aus:', + 'months' => Array( + '01'=>'Januar', + '02'=>'Februar', + '03'=>'März', + '04'=>'April', + '05'=>'Mai', + '06'=>'Juni', + '07'=>'Juli', + '08'=>'August', + '09'=>'September', + '10'=>'Oktober', + '11'=>'November', + '12'=>'Dezember'), + // phpMyEdit-report + 'Make report' => 'Erstelle Bericht', + 'Select fields' => 'Felder auswählen', + 'Records per screen' => 'Datensätze pro Anzeige', + ); + +?> diff --git a/lang/PME.lang.DE-UTF8.inc b/lang/PME.lang.DE-UTF8.inc new file mode 100644 index 0000000..3669d9a --- /dev/null +++ b/lang/PME.lang.DE-UTF8.inc @@ -0,0 +1,68 @@ + + * Gerd Xhonneux, http://xsite.xhonneux.com + * Martin Brückner + * info: http://makeashorterlink.com/?O116223C2 + */ + +/* $Platon: phpMyEdit/lang/PME.lang.DE-UTF8.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Hinzufügen', + 'Copy' =>'Kopieren', + 'Change' =>'Ändern', + 'Delete' =>'Löschen', + 'View' =>'Anzeigen', + 'Prev' =>'Zurück', + 'Next' =>'Weiter', + 'First' =>'Erster', + 'Last' =>'Letzter', + 'Go to' =>'Gehe zu', + 'Page' =>'Seite', + 'Records' =>'Datensätze', + 'Save' =>'Speichern', + 'More' =>'Speichern, weiteren Datensatz hinzufügen', + 'Apply' =>'Anwenden', + 'Cancel' =>'Abbrechen', + 'Search' =>'Suche', + 'Hide' =>'Verstecken', + 'Clear' =>'Löschen', + 'Query' =>'Abfrage', + 'Current Query' =>'Aktuelle Abfrage', + 'Sorted By' =>'Sortiert nach', + 'ascending' =>'aufsteigend', + 'descending' =>'absteigend', + 'hidden' =>'versteckt', + 'of' =>'von', + 'record added' =>'Datensatz hinzugefügt', + 'record changed'=>'Datensatz geändert', + 'record deleted'=>'Datensatz gelöscht', + 'Please enter' =>'Bitte füllen sie dieses Feld aus:', + 'months' => Array( + '01'=>'Januar', + '02'=>'Februar', + '03'=>'März', + '04'=>'April', + '05'=>'Mai', + '06'=>'Juni', + '07'=>'Juli', + '08'=>'August', + '09'=>'September', + '10'=>'Oktober', + '11'=>'November', + '12'=>'Dezember'), + // phpMyEdit-report + 'Make report' => 'Erstelle Bericht', + 'Select fields' => 'Felder auswählen', + 'Records per screen' => 'Datensätze pro Anzeige', + ); + +?> diff --git a/lang/PME.lang.DE.inc b/lang/PME.lang.DE.inc new file mode 100644 index 0000000..55c316c --- /dev/null +++ b/lang/PME.lang.DE.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.DK-LATIN1.inc b/lang/PME.lang.DK-LATIN1.inc new file mode 100644 index 0000000..651c309 --- /dev/null +++ b/lang/PME.lang.DK-LATIN1.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.DK-LATIN1.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Tilføj', + 'Copy' =>'Kopier', + 'Change' =>'Ret', + 'Delete' =>'Slet', + 'View' =>'Se', + 'Prev' =>'Tilbage', + 'Next' =>'Næste', + 'First' =>'First', // untranslated + 'Last' =>'Last', // untranslated + 'Go to' =>'Go to', // untranslated + 'Page' =>'Side', + 'Records' =>'Rækker', + 'Save' =>'Gem', + 'More' =>'Mere', + 'Apply' =>'Tilføj', + 'Cancel' =>'Fortryd', + 'Search' =>'Søg', + 'Hide' =>'Skjul', + 'Clear' =>'Tøm', + 'Query' =>'Søg', + 'Current Query' =>'Current Query', // untranslated + 'Sorted By' =>'Sorted By', // untranslated + 'ascending' =>'ascending', // untranslated + 'descending' =>'descending', // untranslated + 'hidden' =>'hidden', // untranslated + 'of' =>'af', + 'record added' =>'række tilføjet', + 'record changed' =>'række ændret', + 'record deleted' =>'række slettet', + 'Please enter' =>'Indtast venligst', + 'months' => Array( + '01'=>'Januar', + '02'=>'Februar', + '03'=>'Marts', + '04'=>'April', + '05'=>'Maj', + '06'=>'Juni', + '07'=>'Juli', + '08'=>'August', + '09'=>'September', + '10'=>'Oktober', + '11'=>'November', + '12'=>'December'), + // phpMyEdit-report + 'Make report' => 'Make report', + 'Select fields' => 'Select fields', + 'Records per screen' => 'Records per screen', + ); + +?> diff --git a/lang/PME.lang.DK-UTF8.inc b/lang/PME.lang.DK-UTF8.inc new file mode 100644 index 0000000..9cbecda --- /dev/null +++ b/lang/PME.lang.DK-UTF8.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.DK-UTF8.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Tilføj', + 'Copy' =>'Kopier', + 'Change' =>'Ret', + 'Delete' =>'Slet', + 'View' =>'Se', + 'Prev' =>'Tilbage', + 'Next' =>'Næste', + 'First' =>'First', // untranslated + 'Last' =>'Last', // untranslated + 'Go to' =>'Go to', // untranslated + 'Page' =>'Side', + 'Records' =>'Rækker', + 'Save' =>'Gem', + 'More' =>'Mere', + 'Apply' =>'Tilføj', + 'Cancel' =>'Fortryd', + 'Search' =>'Søg', + 'Hide' =>'Skjul', + 'Clear' =>'Tøm', + 'Query' =>'Søg', + 'Current Query' =>'Current Query', // untranslated + 'Sorted By' =>'Sorted By', // untranslated + 'ascending' =>'ascending', // untranslated + 'descending' =>'descending', // untranslated + 'hidden' =>'hidden', // untranslated + 'of' =>'af', + 'record added' =>'række tilføjet', + 'record changed' =>'række ændret', + 'record deleted' =>'række slettet', + 'Please enter' =>'Indtast venligst', + 'months' => Array( + '01'=>'Januar', + '02'=>'Februar', + '03'=>'Marts', + '04'=>'April', + '05'=>'Maj', + '06'=>'Juni', + '07'=>'Juli', + '08'=>'August', + '09'=>'September', + '10'=>'Oktober', + '11'=>'November', + '12'=>'December'), + // phpMyEdit-report + 'Make report' => 'Make report', + 'Select fields' => 'Select fields', + 'Records per screen' => 'Records per screen', + ); + +?> diff --git a/lang/PME.lang.DK.inc b/lang/PME.lang.DK.inc new file mode 100644 index 0000000..63c5fb2 --- /dev/null +++ b/lang/PME.lang.DK.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.EL-LATIN7.inc b/lang/PME.lang.EL-LATIN7.inc new file mode 100644 index 0000000..5ac118d --- /dev/null +++ b/lang/PME.lang.EL-LATIN7.inc @@ -0,0 +1,64 @@ + + */ + +/* $Id: PME.lang.EL.inc,v 1.1 2006-08-05 20:59:46 nepto Exp $ */ + +return Array( + 'Add' =>'Ðñüóèåóç', + 'Copy' =>'ÁíôéãñáöÞ', + 'Change' =>'ÁëëáãÞ', + 'Delete' =>'ÄéáãñáöÞ', + 'View' =>'ÅìöÜíéóç', + 'Prev' =>'Ðñïçãïýìåíï', + 'Next' =>'Åðüìåíï', + 'First' =>'Ðñþôï', + 'Last' =>'Ôåëåõôáßï', + 'Go to' =>'ÐÞãáéíå óå', + 'Page' =>'Óåëßäá', + 'Records' =>'ÅããñáöÝò', + 'Save' =>'ÁðïèÞêåõóç', + 'More' =>'Ðåñéóóüôåñá', + 'Apply' =>'ÕðïâïëÞ', + 'Cancel' =>'Áêýñùóç', + 'Search' =>'ÁíáæÞôçóç', + 'Hide' =>'Êñýøå', + 'Clear' =>'ÊáèÜñéóå', + 'Query' =>'Åðåñþôçìá', + 'Current Query' =>'ÔñÝ÷ïí Åðåñþôçìá', + 'Sorted By' =>'Ôáîéíüìçóç Ìå', + 'ascending' =>'áýîïõóá', + 'descending' =>'öèßíïõóá', + 'hidden' =>'êñõììÝíï', + 'of' =>'áðü', + 'record added' =>'ç åããñáöÞ ðñïóôÝèçêå', + 'record changed' =>'ç åããñáöÞ Üëëáîå', + 'record deleted' =>'ç åããñáöÞ äéáãñÜöçêå', + 'Please enter' =>'Ðáñáêáëþ åéóÜãåôå', + 'months' => Array( + '01'=>'ÉáíïõÜñéïò', + '02'=>'ÖåâñïõÜñéïò', + '03'=>'ÌÜñôéïò', + '04'=>'Áðñßëéïò', + '05'=>'ÌÜéïò', + '06'=>'Éïýíéïò', + '07'=>'Éïýëéïò', + '08'=>'Áýãïõóôïò', + '09'=>'ÓåðôÝìâñéïò', + '10'=>'Ïêôþâñéïò', + '11'=>'ÍïÝìâñéïò', + '12'=>'ÄåêÝìâñéïò'), + // phpMyEdit-report + 'Make report' => 'Äçìéïõñãßá áíáöïñÜò', + 'Select fields' => 'ÅðéëïãÞ ðåäßùí', + 'Records per screen' => 'ÅããñáöÝò áíÜ ïèüíç', + ); + +?> diff --git a/lang/PME.lang.EL-UTF8.inc b/lang/PME.lang.EL-UTF8.inc new file mode 100644 index 0000000..dc2c49a --- /dev/null +++ b/lang/PME.lang.EL-UTF8.inc @@ -0,0 +1,64 @@ + + */ + +/* $Id: PME.lang.EL.inc,v 1.1 2006-08-05 20:59:46 nepto Exp $ */ + +return Array( + 'Add' =>'ΠÏόσθεση', + 'Copy' =>'ΑντιγÏαφή', + 'Change' =>'Αλλαγή', + 'Delete' =>'ΔιαγÏαφή', + 'View' =>'Εμφάνιση', + 'Prev' =>'ΠÏοηγοÏμενο', + 'Next' =>'Επόμενο', + 'First' =>'ΠÏώτο', + 'Last' =>'Τελευταίο', + 'Go to' =>'Πήγαινε σε', + 'Page' =>'Σελίδα', + 'Records' =>'ΕγγÏαφές', + 'Save' =>'Αποθήκευση', + 'More' =>'ΠεÏισσότεÏα', + 'Apply' =>'Υποβολή', + 'Cancel' =>'ΑκÏÏωση', + 'Search' =>'Αναζήτηση', + 'Hide' =>'ΚÏÏψε', + 'Clear' =>'ΚαθάÏισε', + 'Query' =>'ΕπεÏώτημα', + 'Current Query' =>'ΤÏέχον ΕπεÏώτημα', + 'Sorted By' =>'Ταξινόμηση Με', + 'ascending' =>'αÏξουσα', + 'descending' =>'φθίνουσα', + 'hidden' =>'κÏυμμένο', + 'of' =>'από', + 'record added' =>'η εγγÏαφή Ï€Ïοστέθηκε', + 'record changed' =>'η εγγÏαφή άλλαξε', + 'record deleted' =>'η εγγÏαφή διαγÏάφηκε', + 'Please enter' =>'ΠαÏακαλώ εισάγετε', + 'months' => Array( + '01'=>'ΙανουάÏιος', + '02'=>'ΦεβÏουάÏιος', + '03'=>'ΜάÏτιος', + '04'=>'ΑπÏίλιος', + '05'=>'Μάιος', + '06'=>'ΙοÏνιος', + '07'=>'ΙοÏλιος', + '08'=>'ΑÏγουστος', + '09'=>'ΣεπτέμβÏιος', + '10'=>'ΟκτώβÏιος', + '11'=>'ÎοέμβÏιος', + '12'=>'ΔεκέμβÏιος'), + // phpMyEdit-report + 'Make report' => 'ΔημιουÏγία αναφοÏάς', + 'Select fields' => 'Επιλογή πεδίων', + 'Records per screen' => 'ΕγγÏαφές ανά οθόνη', + ); + +?> diff --git a/lang/PME.lang.EL.inc b/lang/PME.lang.EL.inc new file mode 100644 index 0000000..045425d --- /dev/null +++ b/lang/PME.lang.EL.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.EN-US.inc b/lang/PME.lang.EN-US.inc new file mode 100644 index 0000000..2f0e148 --- /dev/null +++ b/lang/PME.lang.EN-US.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.EN-US.inc,v 1.10 2004/12/27 20:14:29 nepto Exp $ */ + +return Array( + 'Add' =>'Add', + 'Copy' =>'Copy', + 'Change' =>'Change', + 'Delete' =>'Delete', + 'View' =>'View', + 'Prev' =>'Prev', + 'Next' =>'Next', + 'First' =>'First', + 'Last' =>'Last', + 'Go to' =>'Go to', + 'Page' =>'Page', + 'Records' =>'Records', + 'Save' =>'Save', + 'More' =>'More', + 'Apply' =>'Apply', + 'Cancel' =>'Cancel', + 'Search' =>'Search', + 'Hide' =>'Hide', + 'Clear' =>'Clear', + 'Query' =>'Query', + 'Current Query' =>'Current Query', + 'Sorted By' =>'Sorted By', + 'ascending' =>'ascending', + 'descending' =>'descending', + 'hidden' =>'hidden', + 'of' =>'of', + 'record added' =>'record added', + 'record changed' =>'record changed', + 'record deleted' =>'record deleted', + 'Please enter' =>'Please enter', + 'months' => Array( + '01'=>'January', + '02'=>'February', + '03'=>'March', + '04'=>'April', + '05'=>'May', + '06'=>'June', + '07'=>'July', + '08'=>'August', + '09'=>'September', + '10'=>'October', + '11'=>'November', + '12'=>'December'), + // phpMyEdit-report + 'Make report' => 'Make report', + 'Select fields' => 'Select fields', + 'Records per screen' => 'Records per screen', + ); + +?> diff --git a/lang/PME.lang.EN.inc b/lang/PME.lang.EN.inc new file mode 100644 index 0000000..705fcab --- /dev/null +++ b/lang/PME.lang.EN.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.EN.inc,v 1.11 2004/12/27 20:14:29 nepto Exp $ */ + +return Array( + 'Add' =>'Add', + 'Copy' =>'Copy', + 'Change' =>'Change', + 'Delete' =>'Delete', + 'View' =>'View', + 'Prev' =>'Prev', + 'Next' =>'Next', + 'First' =>'First', + 'Last' =>'Last', + 'Go to' =>'Go to', + 'Page' =>'Page', + 'Records' =>'Records', + 'Save' =>'Save', + 'More' =>'More', + 'Apply' =>'Apply', + 'Cancel' =>'Cancel', + 'Search' =>'Search', + 'Hide' =>'Hide', + 'Clear' =>'Clear', + 'Query' =>'Query', + 'Current Query' =>'Current Query', + 'Sorted By' =>'Sorted By', + 'ascending' =>'ascending', + 'descending' =>'descending', + 'hidden' =>'hidden', + 'of' =>'of', + 'record added' =>'record added', + 'record changed' =>'record changed', + 'record deleted' =>'record deleted', + 'Please enter' =>'Please enter', + 'months' => Array( + '01'=>'January', + '02'=>'February', + '03'=>'March', + '04'=>'April', + '05'=>'May', + '06'=>'June', + '07'=>'July', + '08'=>'August', + '09'=>'September', + '10'=>'October', + '11'=>'November', + '12'=>'December'), + // phpMyEdit-report + 'Make report' => 'Make report', + 'Select fields' => 'Select fields', + 'Records per screen' => 'Records per screen', + ); + +?> diff --git a/lang/PME.lang.ES-AR-LATIN1.inc b/lang/PME.lang.ES-AR-LATIN1.inc new file mode 100644 index 0000000..0997ea3 --- /dev/null +++ b/lang/PME.lang.ES-AR-LATIN1.inc @@ -0,0 +1,59 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.ES-AR-LATIN1.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Agregar', + 'Copy' =>'Copiar', + 'Change' =>'Cambiar', + 'Delete' =>'Suprimir', + 'View' =>'Visualización', + 'Prev' =>'Anterior', + 'Next' =>'Siguiente', + 'First' =>'Primero', + 'Last' =>'Ultimo', + 'Go to' =>'Ir a', + 'Page' =>'Paginación', + 'Records' =>'Registros', + 'Save' =>'Grabar', + 'More' =>'Más', + 'Apply' =>'Aplicar', + 'Cancel' =>'Cancelar', + 'Search' =>'Buscar', + 'Hide' =>'Ocultar', + 'Clear' =>'Limpiar', + 'Query' =>'Consulta', + 'of' =>'/', // intentionaly untranslated. Alternatve: "de" + 'record added' =>'registro añadido', + 'record changed'=>'registro cambiado', + 'record deleted'=>'registro borrado', + 'Please enter' =>'Por favor introduzca ', + 'months' => Array( + '01'=>'Enero', + '02'=>'Febrero', + '03'=>'Marzo', + '04'=>'Abril', + '05'=>'Mayo', + '06'=>'Junio', + '07'=>'Julio', + '08'=>'Agosto', + '09'=>'Septiembre', + '10'=>'Octubre', + '11'=>'Noviembre', + '12'=>'Diciembre'), + // phpMyEdit-report + 'Make report' => 'Hacer reporte', + 'Select fields' => 'Seleccionar campos', + 'Records per screen' => 'Registros por pantalla', + ); + +?> diff --git a/lang/PME.lang.ES-AR-UTF8.inc b/lang/PME.lang.ES-AR-UTF8.inc new file mode 100644 index 0000000..fbbb9cc --- /dev/null +++ b/lang/PME.lang.ES-AR-UTF8.inc @@ -0,0 +1,59 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.ES-AR-UTF8.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Agregar', + 'Copy' =>'Copiar', + 'Change' =>'Cambiar', + 'Delete' =>'Suprimir', + 'View' =>'Visualización', + 'Prev' =>'Anterior', + 'Next' =>'Siguiente', + 'First' =>'Primero', + 'Last' =>'Ultimo', + 'Go to' =>'Ir a', + 'Page' =>'Paginación', + 'Records' =>'Registros', + 'Save' =>'Grabar', + 'More' =>'Más', + 'Apply' =>'Aplicar', + 'Cancel' =>'Cancelar', + 'Search' =>'Buscar', + 'Hide' =>'Ocultar', + 'Clear' =>'Limpiar', + 'Query' =>'Consulta', + 'of' =>'/', // intentionaly untranslated. Alternatve: "de" + 'record added' =>'registro añadido', + 'record changed'=>'registro cambiado', + 'record deleted'=>'registro borrado', + 'Please enter' =>'Por favor introduzca ', + 'months' => Array( + '01'=>'Enero', + '02'=>'Febrero', + '03'=>'Marzo', + '04'=>'Abril', + '05'=>'Mayo', + '06'=>'Junio', + '07'=>'Julio', + '08'=>'Agosto', + '09'=>'Septiembre', + '10'=>'Octubre', + '11'=>'Noviembre', + '12'=>'Diciembre'), + // phpMyEdit-report + 'Make report' => 'Hacer reporte', + 'Select fields' => 'Seleccionar campos', + 'Records per screen' => 'Registros por pantalla', + ); + +?> diff --git a/lang/PME.lang.ES-AR.inc b/lang/PME.lang.ES-AR.inc new file mode 100644 index 0000000..eb513f7 --- /dev/null +++ b/lang/PME.lang.ES-AR.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.ES-LATIN1.inc b/lang/PME.lang.ES-LATIN1.inc new file mode 100644 index 0000000..8f73deb --- /dev/null +++ b/lang/PME.lang.ES-LATIN1.inc @@ -0,0 +1,66 @@ + + * Eduardo Diaz + */ + +/* $Platon: phpMyEdit/lang/PME.lang.ES-LATIN1.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Agregar', + 'Copy' =>'Copiar', + 'Change' =>'Cambiar', + 'Delete' =>'Suprimir', + 'View' =>'Visualizar', + 'Prev' =>'Anterior', + 'Next' =>'Siguiente', + 'First' =>'Primero', + 'Last' =>'Último', + 'Go to' =>'Ir a', + 'Page' =>'Página', + 'Records' =>'Registros', + 'Save' =>'Grabar', + 'More' =>'Más', + 'Apply' =>'Aplicar', + 'Cancel' =>'Cancelar', + 'Search' =>'Buscar', + 'Hide' =>'Ocultar', + 'Clear' =>'Limpiar', + 'Query' =>'Consultar', + 'Current Query' =>'Consulta actual', + 'Sorted By' =>'Ordenado por', + 'ascending' =>'ascendente', + 'descending' =>'descendente', + 'hidden' =>'oculto', + 'of' =>'de', + 'record added' =>'Registro añadido', + 'record changed'=>'Registro cambiado', + 'record deleted'=>'Registro borrado', + 'Please enter' =>'Por favor introduzca ', + 'months' => Array( + '01'=>'Enero', + '02'=>'Febrero', + '03'=>'Marzo', + '04'=>'Abril', + '05'=>'Mayo', + '06'=>'Junio', + '07'=>'Julio', + '08'=>'Agosto', + '09'=>'Septiembre', + '10'=>'Octubre', + '11'=>'Noviembre', + '12'=>'Diciembre'), + // phpMyEdit-report + 'Make report' => 'Realizar Informe', + 'Select fields' => 'Seleccionar campos', + 'Records per screen' => 'Registros por pantalla', + ); + +?> diff --git a/lang/PME.lang.ES-MX-LATIN1.inc b/lang/PME.lang.ES-MX-LATIN1.inc new file mode 100644 index 0000000..15d522d --- /dev/null +++ b/lang/PME.lang.ES-MX-LATIN1.inc @@ -0,0 +1,64 @@ +'Agregar', + 'Copy' =>'Copiar', + 'Change' =>'Cambiar', + 'Delete' =>'Suprimir', + 'View' =>'Ver', + 'Prev' =>'Anterior', + 'Next' =>'Siguiente', + 'First' =>'First', // untranslated + 'Last' =>'Last', // untranslated + 'Go to' =>'Go to', // untranslated + 'Page' =>'Página', + 'Records' =>'Registros', + 'Save' =>'Guardar', + 'More' =>'Más', + 'Apply' =>'Aplicar', + 'Cancel' =>'Cancelar', + 'Search' =>'Buscar', + 'Hide' =>'Ocultar', + 'Clear' =>'Limpiar', + 'Query' =>'Consulta SQL', + 'Current Query' =>'Consulta actual', + 'Sorted By' =>'Ordenado por', + 'ascending' =>'ascendente', + 'descending' =>'descendente', + 'hidden' =>'oculto', + 'of' =>'de', + 'record added' =>'registro agregado', + 'record changed'=>'registro cambiado', + 'record deleted'=>'registro borrado', + 'Please enter' =>'Por favor introduzca ', + 'months' => Array( + '01'=>'Enero', + '02'=>'Febrero', + '03'=>'Marzoa', + '04'=>'Abril', + '05'=>'Mayo', + '06'=>'Junio', + '07'=>'Julio', + '08'=>'Agosto', + '09'=>'Septiembre', + '10'=>'Octubre', + '11'=>'Noviembre', + '12'=>'Diciembre'), + // phpMyEdit-report + 'Make report' => 'Make report', + 'Select fields' => 'Select fields', + 'Records per screen' => 'Records per screen', + ); + +?> diff --git a/lang/PME.lang.ES-MX-UTF8.inc b/lang/PME.lang.ES-MX-UTF8.inc new file mode 100644 index 0000000..0d154b7 --- /dev/null +++ b/lang/PME.lang.ES-MX-UTF8.inc @@ -0,0 +1,64 @@ +'Agregar', + 'Copy' =>'Copiar', + 'Change' =>'Cambiar', + 'Delete' =>'Suprimir', + 'View' =>'Ver', + 'Prev' =>'Anterior', + 'Next' =>'Siguiente', + 'First' =>'First', // untranslated + 'Last' =>'Last', // untranslated + 'Go to' =>'Go to', // untranslated + 'Page' =>'Página', + 'Records' =>'Registros', + 'Save' =>'Guardar', + 'More' =>'Más', + 'Apply' =>'Aplicar', + 'Cancel' =>'Cancelar', + 'Search' =>'Buscar', + 'Hide' =>'Ocultar', + 'Clear' =>'Limpiar', + 'Query' =>'Consulta SQL', + 'Current Query' =>'Consulta actual', + 'Sorted By' =>'Ordenado por', + 'ascending' =>'ascendente', + 'descending' =>'descendente', + 'hidden' =>'oculto', + 'of' =>'de', + 'record added' =>'registro agregado', + 'record changed'=>'registro cambiado', + 'record deleted'=>'registro borrado', + 'Please enter' =>'Por favor introduzca ', + 'months' => Array( + '01'=>'Enero', + '02'=>'Febrero', + '03'=>'Marzoa', + '04'=>'Abril', + '05'=>'Mayo', + '06'=>'Junio', + '07'=>'Julio', + '08'=>'Agosto', + '09'=>'Septiembre', + '10'=>'Octubre', + '11'=>'Noviembre', + '12'=>'Diciembre'), + // phpMyEdit-report + 'Make report' => 'Make report', + 'Select fields' => 'Select fields', + 'Records per screen' => 'Records per screen', + ); + +?> diff --git a/lang/PME.lang.ES-MX.inc b/lang/PME.lang.ES-MX.inc new file mode 100644 index 0000000..f651f7e --- /dev/null +++ b/lang/PME.lang.ES-MX.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.ES-UTF8.inc b/lang/PME.lang.ES-UTF8.inc new file mode 100644 index 0000000..6046675 --- /dev/null +++ b/lang/PME.lang.ES-UTF8.inc @@ -0,0 +1,66 @@ + + * Eduardo Diaz + */ + +/* $Platon: phpMyEdit/lang/PME.lang.ES-UTF8.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Agregar', + 'Copy' =>'Copiar', + 'Change' =>'Cambiar', + 'Delete' =>'Suprimir', + 'View' =>'Visualizar', + 'Prev' =>'Anterior', + 'Next' =>'Siguiente', + 'First' =>'Primero', + 'Last' =>'Último', + 'Go to' =>'Ir a', + 'Page' =>'Página', + 'Records' =>'Registros', + 'Save' =>'Grabar', + 'More' =>'Más', + 'Apply' =>'Aplicar', + 'Cancel' =>'Cancelar', + 'Search' =>'Buscar', + 'Hide' =>'Ocultar', + 'Clear' =>'Limpiar', + 'Query' =>'Consultar', + 'Current Query' =>'Consulta actual', + 'Sorted By' =>'Ordenado por', + 'ascending' =>'ascendente', + 'descending' =>'descendente', + 'hidden' =>'oculto', + 'of' =>'de', + 'record added' =>'Registro añadido', + 'record changed'=>'Registro cambiado', + 'record deleted'=>'Registro borrado', + 'Please enter' =>'Por favor introduzca ', + 'months' => Array( + '01'=>'Enero', + '02'=>'Febrero', + '03'=>'Marzo', + '04'=>'Abril', + '05'=>'Mayo', + '06'=>'Junio', + '07'=>'Julio', + '08'=>'Agosto', + '09'=>'Septiembre', + '10'=>'Octubre', + '11'=>'Noviembre', + '12'=>'Diciembre'), + // phpMyEdit-report + 'Make report' => 'Realizar Informe', + 'Select fields' => 'Seleccionar campos', + 'Records per screen' => 'Registros por pantalla', + ); + +?> diff --git a/lang/PME.lang.ES.inc b/lang/PME.lang.ES.inc new file mode 100644 index 0000000..8b259ff --- /dev/null +++ b/lang/PME.lang.ES.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.ET-LATIN1.inc b/lang/PME.lang.ET-LATIN1.inc new file mode 100644 index 0000000..4a548c7 --- /dev/null +++ b/lang/PME.lang.ET-LATIN1.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.ET-LATIN1.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Lisa', + 'Copy' =>'Kopeeri', + 'Change' =>'Muuda', + 'Delete' =>'Kustuta', + 'View' =>'Vaata', + 'Prev' =>'Eelmine', + 'Next' =>htmlentities('Järgmine'), + 'First' =>'Esimene', + 'Last' =>'Viimane', + 'Go to' =>'Positsioon', + 'Page' =>'Leht', + 'Records' =>'Kirjed', + 'Save' =>'Salvesta', + 'More' =>htmlentities('Järgneb...'), + 'Apply' =>'Rakenda muutused', + 'Cancel' =>htmlentities('Tühista'), + 'Search' =>'Otsi', + 'Hide' =>'Peida', + 'Clear' =>htmlentities('Tühjenda väljad'), + 'Query' =>htmlentities('Päring'), + 'Current Query' =>htmlentities('Hetke päring'), + 'Sorted By' =>htmlentities('Sorteermisjärjekord'), + 'ascending' =>'kahanevalt', + 'descending' =>'kasvavalt', + 'hidden' =>'peidetud', + 'of' =>'/', + 'record added' =>'kirje lisatud', + 'record changed' =>'kirje muudetud', + 'record deleted' =>'kirje kustutatud', + 'Please enter' =>'Palun sisesta', + 'months' => Array( + '01'=>'Jaanuar', + '02'=>'Veebruar', + '03'=>htmlentities('Märts'), + '04'=>'Aprill', + '05'=>'Mai', + '06'=>'Juuni', + '07'=>'Juuli', + '08'=>'August', + '09'=>'September', + '10'=>'Oktoober', + '11'=>'November', + '12'=>'Detsember'), + // phpMyEdit-report + 'Make report' => 'Koosta raport', + 'Select fields' => htmlentities('Vali väljad'), + 'Records per screen' => 'Kirjeid lehe kohta', + ); + +?> diff --git a/lang/PME.lang.ET-UTF8.inc b/lang/PME.lang.ET-UTF8.inc new file mode 100644 index 0000000..f05d4c1 --- /dev/null +++ b/lang/PME.lang.ET-UTF8.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.ET-UTF8.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Lisa', + 'Copy' =>'Kopeeri', + 'Change' =>'Muuda', + 'Delete' =>'Kustuta', + 'View' =>'Vaata', + 'Prev' =>'Eelmine', + 'Next' =>htmlentities('Järgmine'), + 'First' =>'Esimene', + 'Last' =>'Viimane', + 'Go to' =>'Positsioon', + 'Page' =>'Leht', + 'Records' =>'Kirjed', + 'Save' =>'Salvesta', + 'More' =>htmlentities('Järgneb...'), + 'Apply' =>'Rakenda muutused', + 'Cancel' =>htmlentities('Tühista'), + 'Search' =>'Otsi', + 'Hide' =>'Peida', + 'Clear' =>htmlentities('Tühjenda väljad'), + 'Query' =>htmlentities('Päring'), + 'Current Query' =>htmlentities('Hetke päring'), + 'Sorted By' =>htmlentities('Sorteermisjärjekord'), + 'ascending' =>'kahanevalt', + 'descending' =>'kasvavalt', + 'hidden' =>'peidetud', + 'of' =>'/', + 'record added' =>'kirje lisatud', + 'record changed' =>'kirje muudetud', + 'record deleted' =>'kirje kustutatud', + 'Please enter' =>'Palun sisesta', + 'months' => Array( + '01'=>'Jaanuar', + '02'=>'Veebruar', + '03'=>htmlentities('Märts'), + '04'=>'Aprill', + '05'=>'Mai', + '06'=>'Juuni', + '07'=>'Juuli', + '08'=>'August', + '09'=>'September', + '10'=>'Oktoober', + '11'=>'November', + '12'=>'Detsember'), + // phpMyEdit-report + 'Make report' => 'Koosta raport', + 'Select fields' => htmlentities('Vali väljad'), + 'Records per screen' => 'Kirjeid lehe kohta', + ); + +?> diff --git a/lang/PME.lang.ET.inc b/lang/PME.lang.ET.inc new file mode 100644 index 0000000..dab7fad --- /dev/null +++ b/lang/PME.lang.ET.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.EU.inc b/lang/PME.lang.EU.inc new file mode 100644 index 0000000..bfd8046 --- /dev/null +++ b/lang/PME.lang.EU.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.EU.inc,v 1.1 2004/05/17 10:53:06 nepto Exp $ */ + +return Array( + 'Add' =>'Gehitu', + 'Copy' =>'Kopiatu', + 'Change' =>'Aldatu', + 'Delete' =>'Ezabatu', + 'View' =>'Ikusi', + 'Prev' =>'Aurrekoa', + 'Next' =>'Hurrengoa', + 'First' =>'Lehena', + 'Last' =>'Azkena', + 'Go to' =>'Joan', + 'Page' =>'Orrialdea', + 'Records' =>'Erregistroak', + 'Save' =>'Gorde', + 'More' =>'Gehiago', + 'Apply' =>'Aplikatu', + 'Cancel' =>'Utzi', + 'Search' =>'Bilatu', + 'Hide' =>'Ezkutatu', + 'Clear' =>'Garbitu', + 'Query' =>'Kontsulta', + 'Current Query' =>'Uneko Kontsulta', + 'Sorted By' =>'Orden Irizpidea', + 'ascending' =>'gorantz', + 'descending' =>'beherantz', + 'hidden' =>'ezkutukoa', + 'of' =>'-', + 'record added' =>'erregistroa gehituta', + 'record changed'=>'erregistroa aldatuta', + 'record deleted'=>'erregistroa ezabatuta', + 'Please enter' =>'Mesedez, sartu ezazu ', + 'months' => Array( + '01'=>'urtarrila', + '02'=>'otsaila', + '03'=>'martxoa', + '04'=>'apirila', + '05'=>'maiatza', + '06'=>'ekaina', + '07'=>'uztaila', + '08'=>'abuztua', + '09'=>'iraila', + '10'=>'urria', + '11'=>'azaroa', + '12'=>'abendua'), + // phpMyEdit-report + 'Make report' => 'Txostena sortu', + 'Select fields' => 'Eremuak aukertau', + 'Records per screen' => 'Erregistroak orrialdeko', + ); + +?> diff --git a/lang/PME.lang.FR-LATIN1.inc b/lang/PME.lang.FR-LATIN1.inc new file mode 100644 index 0000000..2861884 --- /dev/null +++ b/lang/PME.lang.FR-LATIN1.inc @@ -0,0 +1,67 @@ + + * Kaid + * hbernard + */ + +/* $Platon: phpMyEdit/lang/PME.lang.FR-LATIN1.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Ajouter', + 'Copy' =>'Copier', + 'Change' =>'Modifier', + 'Delete' =>'Supprimer', + 'View' =>'Afficher', + 'Prev' =>'Précédent', + 'Next' =>'Suivant', + 'First' =>'Début', + 'Last' =>'Fin', + 'Go to' =>'Aller à ', + 'Page' =>'Page', + 'Records' =>'Enregistrements', + 'Save' =>'Enregistrer', + 'More' =>'Enregistrer et continuer', + 'Apply' =>'Appliquer', + 'Cancel' =>'Annuler', + 'Search' =>'Rechercher', + 'Hide' =>'Cacher', + 'Clear' =>'Vider', + 'Query' =>'Requête', + 'Current Query' =>'Requête courante', + 'Sorted By' =>'Tri', + 'ascending' =>'croissant', + 'descending' =>'décroissant', + 'hidden' =>'caché', + 'of' =>'/', // untranslated + 'record added' =>'Enregistrement ajouté', + 'record changed'=>'Enregistrement modifié', + 'record deleted'=>'Enregistrement supprimé', + 'Please enter' =>'Entrez s\'il vous plaît', + 'months' => Array( + '01'=>'Janvier', + '02'=>'Février', + '03'=>'Mars', + '04'=>'Avril', + '05'=>'Mai', + '06'=>'Juin', + '07'=>'Juillet', + '08'=>'Août', + '09'=>'Septembre', + '10'=>'Octobre', + '11'=>'Novembre', + '12'=>'Décembre'), + // phpMyEdit-report + 'Make report' => 'Make report', + 'Select fields' => 'Select fields', + 'Records per screen' => 'Records per screen', + ); + +?> diff --git a/lang/PME.lang.FR-UTF8.inc b/lang/PME.lang.FR-UTF8.inc new file mode 100644 index 0000000..051a979 --- /dev/null +++ b/lang/PME.lang.FR-UTF8.inc @@ -0,0 +1,67 @@ + + * Kaid + * hbernard + */ + +/* $Platon: phpMyEdit/lang/PME.lang.FR-UTF8.inc,v 1.1 2007-09-16 12:57:12 nepto Exp $ */ + +return Array( + 'Add' =>'Ajouter', + 'Copy' =>'Copier', + 'Change' =>'Modifier', + 'Delete' =>'Supprimer', + 'View' =>'Afficher', + 'Prev' =>'Précédent', + 'Next' =>'Suivant', + 'First' =>'Début', + 'Last' =>'Fin', + 'Go to' =>'Aller à ', + 'Page' =>'Page', + 'Records' =>'Enregistrements', + 'Save' =>'Enregistrer', + 'More' =>'Enregistrer et continuer', + 'Apply' =>'Appliquer', + 'Cancel' =>'Annuler', + 'Search' =>'Rechercher', + 'Hide' =>'Cacher', + 'Clear' =>'Vider', + 'Query' =>'Requête', + 'Current Query' =>'Requête courante', + 'Sorted By' =>'Tri', + 'ascending' =>'croissant', + 'descending' =>'décroissant', + 'hidden' =>'caché', + 'of' =>'/', // untranslated + 'record added' =>'Enregistrement ajouté', + 'record changed'=>'Enregistrement modifié', + 'record deleted'=>'Enregistrement supprimé', + 'Please enter' =>'Entrez s\'il vous plaît', + 'months' => Array( + '01'=>'Janvier', + '02'=>'Février', + '03'=>'Mars', + '04'=>'Avril', + '05'=>'Mai', + '06'=>'Juin', + '07'=>'Juillet', + '08'=>'Août', + '09'=>'Septembre', + '10'=>'Octobre', + '11'=>'Novembre', + '12'=>'Décembre'), + // phpMyEdit-report + 'Make report' => 'Make report', + 'Select fields' => 'Select fields', + 'Records per screen' => 'Records per screen', + ); + +?> diff --git a/lang/PME.lang.FR.inc b/lang/PME.lang.FR.inc new file mode 100644 index 0000000..6be9282 --- /dev/null +++ b/lang/PME.lang.FR.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.ID.inc b/lang/PME.lang.ID.inc new file mode 100644 index 0000000..830a247 --- /dev/null +++ b/lang/PME.lang.ID.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.ID.inc,v 1.1 2007-01-30 11:25:57 nepto Exp $ */ + +return Array( + 'Add' =>'Tambah', + 'Copy' =>'Copy', + 'Change' =>'Ubah', + 'Delete' =>'Hapus', + 'View' =>'Lihat', + 'Prev' =>'Berikutnya', + 'Next' =>'Sebelumnya', + 'First' =>'Halaman Pertama', + 'Last' =>'Halaman Terakhir', + 'Go to' =>'Pergi Ke Halaman', + 'Page' =>'Halaman', + 'Records' =>'Rekam', + 'Save' =>'Simpan', + 'More' =>'Lebih', + 'Apply' =>'Sesuaikan', + 'Cancel' =>'Batalkan', + 'Search' =>'Cari', + 'Hide' =>'Sembunyikan', + 'Clear' =>'Kosongkan', + 'Query' =>'Perintah', + 'Current Query' =>'Perintah Sebelumnya', + 'Sorted By' =>'Sorting', + 'ascending' =>'ascending', + 'descending' =>'descending', + 'hidden' =>'Sembunyikan', + 'of' =>'of', + 'record added' =>'Sudah di Tambah', + 'record changed' =>'Sudah di Ubah', + 'record deleted' =>'Sudah di Hapus', + 'Please enter' =>'Harap Masukan', + 'months' => Array( + '01'=>'Januari', + '02'=>'Februari', + '03'=>'Maret', + '04'=>'April', + '05'=>'Mei', + '06'=>'Juni', + '07'=>'Juli', + '08'=>'Augustus', + '09'=>'September', + '10'=>'Oktober', + '11'=>'November', + '12'=>'Desember'), + // phpMyEdit-report + 'Make report' => 'Buat Laporan', + 'Select fields' => 'Pilih Nilai', + 'Records per screen'=> 'Jumlah nilai perhalaman', + ); + +?> diff --git a/lang/PME.lang.IT.inc b/lang/PME.lang.IT.inc new file mode 100644 index 0000000..9b75b05 --- /dev/null +++ b/lang/PME.lang.IT.inc @@ -0,0 +1,66 @@ + + * Keatch + */ + +/* $Platon: phpMyEdit/lang/PME.lang.IT.inc,v 1.15 2004/12/27 20:14:29 nepto Exp $ */ + +return Array( + 'Add' =>'Aggiungi', + 'Copy' =>'Copia', + 'Change' =>'Modifica', + 'Delete' =>'Cancella', + 'View' =>'Visualizza', + 'Prev' =>'Precedente', + 'Next' =>'Seguente', + 'First' =>'Prima', + 'Last' =>'Ultima', + 'Go to' =>'Vai a', + 'Page' =>'Pagina', + 'Records' =>'Voci', + 'Save' =>'Salva', + 'More' =>'Salva & Continua', + 'Apply' =>'Applica', + 'Cancel' =>'Annulla', + 'Search' =>'Cerca', + 'Hide' =>'Nascondi', + 'Clear' =>'Svuota', + 'Query' =>'Chiedi', + 'Current Query' =>'Richiesta Corrente', + 'Sorted By' =>'Ordinato per', + 'ascending' =>'crescente', + 'descending' =>'decrescente', + 'hidden' =>'nascosto', + 'of' =>'/', + 'record added' =>'voce aggiunta', + 'record changed'=>'voce modificata', + 'record deleted'=>'voce eliminata', + 'Please enter' =>'Si prega di riempire il campo: ', + 'months' => Array( + '01'=>'Gennaio', + '02'=>'Febbraio', + '03'=>'Marzo', + '04'=>'Aprile', + '05'=>'Maggio', + '06'=>'Giugno', + '07'=>'Luglio', + '08'=>'Agosto', + '09'=>'Settembre', + '10'=>'Ottobre', + '11'=>'Novembre', + '12'=>'Dicembre'), + // phpMyEdit-report + 'Make report' => 'Genera report', + 'Select fields' => 'Seleziona campi', + 'Records per screen' => 'Record per schermata', + ); + +?> diff --git a/lang/PME.lang.JP-EUCJP.inc b/lang/PME.lang.JP-EUCJP.inc new file mode 100644 index 0000000..a6f9c85 --- /dev/null +++ b/lang/PME.lang.JP-EUCJP.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.JP-EUCJP.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'ÄɲÃ', + 'Copy' =>'¥³¥Ô¡¼', + 'Change' =>'Êѹ¹', + 'Delete' =>'ºï½ü', + 'View' =>'¥Ó¥å¡¼', + 'Prev' =>'Á°', + 'Next' =>'¼¡', + 'First' =>'ºÇ½é', + 'Last' =>'ºÇ¸å', + 'Go to' =>'°Üư', + 'Page' =>'¥Ú¡¼¥¸', + 'Records' =>'¥ì¥³¡¼¥É', + 'Save' =>'Êݸ', + 'More' =>'¼¡¤Ø', + 'Apply' =>'λ²ò', + 'Cancel' =>'¥­¥ã¥ó¥»¥ë', + 'Search' =>'¸¡º÷', + 'Hide' =>'Èóɽ¼¨', + 'Clear' =>'¥¯¥ê¥¢', + 'Query' =>'¥¯¥¨¥ê¡¼', + 'Current Query' =>'¸½ºß¤Î¥¯¥¨¥ê¡¼', + 'Sorted By' =>'¥½¡¼¥È', + 'ascending' =>'¾º½ç', + 'descending' =>'¹ß½ç', + 'hidden' =>'Èóɽ¼¨', + 'of' =>'¤Î', + 'record added' =>'¥ì¥³¡¼¥ÉÄɲÃ', + 'record changed' =>'¥ì¥³¡¼¥ÉÊѹ¹', + 'record deleted' =>'¥ì¥³¡¼¥Éºï½ü', + 'Please enter' =>'ÆþÎϤ¬É¬ÍפǤ¹', + 'months' => Array( + '01'=>'1·î', + '02'=>'2·î', + '03'=>'3·î', + '04'=>'4·î', + '05'=>'5·î', + '06'=>'6·î', + '07'=>'7·î', + '08'=>'8·î', + '09'=>'9·î', + '10'=>'10·î', + '11'=>'11·î', + '12'=>'12·î'), + // phpMyEdit-report + 'Make report' => '¥ì¥Ý¡¼¥ÈºîÀ®', + 'Select fields' => '¥Õ¥£¡¼¥ë¥ÉÁªÂò', + 'Records per screen' => '¥Ú¡¼¥¸É½¼¨', + ); + +?> diff --git a/lang/PME.lang.JP-UTF8.inc b/lang/PME.lang.JP-UTF8.inc new file mode 100644 index 0000000..d99e309 --- /dev/null +++ b/lang/PME.lang.JP-UTF8.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.JP-UTF8.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'追加', + 'Copy' =>'コピー', + 'Change' =>'変更', + 'Delete' =>'削除', + 'View' =>'ビュー', + 'Prev' =>'å‰', + 'Next' =>'次', + 'First' =>'最åˆ', + 'Last' =>'最後', + 'Go to' =>'移動', + 'Page' =>'ページ', + 'Records' =>'レコード', + 'Save' =>'ä¿å­˜', + 'More' =>'次ã¸', + 'Apply' =>'了解', + 'Cancel' =>'キャンセル', + 'Search' =>'検索', + 'Hide' =>'éžè¡¨ç¤º', + 'Clear' =>'クリア', + 'Query' =>'クエリー', + 'Current Query' =>'ç¾åœ¨ã®ã‚¯ã‚¨ãƒªãƒ¼', + 'Sorted By' =>'ソート', + 'ascending' =>'昇順', + 'descending' =>'é™é †', + 'hidden' =>'éžè¡¨ç¤º', + 'of' =>'ã®', + 'record added' =>'レコード追加', + 'record changed' =>'レコード変更', + 'record deleted' =>'レコード削除', + 'Please enter' =>'入力ãŒå¿…è¦ã§ã™', + 'months' => Array( + '01'=>'1月', + '02'=>'2月', + '03'=>'3月', + '04'=>'4月', + '05'=>'5月', + '06'=>'6月', + '07'=>'7月', + '08'=>'8月', + '09'=>'9月', + '10'=>'10月', + '11'=>'11月', + '12'=>'12月'), + // phpMyEdit-report + 'Make report' => 'レãƒãƒ¼ãƒˆä½œæˆ', + 'Select fields' => 'ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰é¸æŠž', + 'Records per screen' => 'ページ表示', + ); + +?> diff --git a/lang/PME.lang.JP.inc b/lang/PME.lang.JP.inc new file mode 100644 index 0000000..e86cc7a --- /dev/null +++ b/lang/PME.lang.JP.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.NL-LATIN1.inc b/lang/PME.lang.NL-LATIN1.inc new file mode 100644 index 0000000..70e92f1 --- /dev/null +++ b/lang/PME.lang.NL-LATIN1.inc @@ -0,0 +1,68 @@ + + * Erwin Janszen + * URL: + * http://platon.sk/projects/bug_view_advanced_page.php?f_bug_id=197 + */ + +/* $Platon: phpMyEdit/lang/PME.lang.NL-LATIN1.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'Toevoegen', + 'Copy' =>'Kopiëren', + 'Change' =>'Bewerken', + 'Delete' =>'Wissen', + 'View' =>'Details', + 'Prev' =>'Vorige', + 'Next' =>'Volgende', + 'First' =>'Eerste', + 'Last' =>'Laatste', + 'Go to' =>'Ga naar', + 'Page' =>'Pagina', + 'Records' =>'Rijen', + 'Save' =>'Bewaren', + 'More' =>'Meer', + 'Apply' =>'Toepassen', + 'Cancel' =>'Annuleren', + 'Search' =>'Zoeken', + 'Hide' =>'Verbergen', + 'Clear' =>'Schonen', // 'Leeg maken', + 'Query' =>'Selecteer', // 'Selectie maken', + 'Current Query' =>'Huidige selectie', + 'Sorted By' =>'Gesorteerd op', + 'ascending' =>'oplopend', + 'descending' =>'aflopend', + 'hidden' =>'verborgen', + 'of' =>'van', + 'record added' =>'rij toegevoegd', + 'record changed' =>'rij aangepast', + 'record deleted' =>'rij gewist', + 'Please enter' =>'Voer a.u.b. in:', + 'months' => Array( + '01'=>'januari', + '02'=>'februari', + '03'=>'maart', + '04'=>'april', + '05'=>'mei', + '06'=>'juni', + '07'=>'juli', + '08'=>'augustus', + '09'=>'september', + '10'=>'october', + '11'=>'november', + '12'=>'december'), + // phpMyEdit-report + 'Make report' => 'Maak rapport', + 'Select fields' => 'Selecteer velden', + 'Records per screen' => 'Rij per scherm', + ); + +?> diff --git a/lang/PME.lang.NL-UTF8.inc b/lang/PME.lang.NL-UTF8.inc new file mode 100644 index 0000000..691cab7 --- /dev/null +++ b/lang/PME.lang.NL-UTF8.inc @@ -0,0 +1,68 @@ + + * Erwin Janszen + * URL: + * http://platon.sk/projects/bug_view_advanced_page.php?f_bug_id=197 + */ + +/* $Platon: phpMyEdit/lang/PME.lang.NL-UTF8.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'Toevoegen', + 'Copy' =>'Kopiëren', + 'Change' =>'Bewerken', + 'Delete' =>'Wissen', + 'View' =>'Details', + 'Prev' =>'Vorige', + 'Next' =>'Volgende', + 'First' =>'Eerste', + 'Last' =>'Laatste', + 'Go to' =>'Ga naar', + 'Page' =>'Pagina', + 'Records' =>'Rijen', + 'Save' =>'Bewaren', + 'More' =>'Meer', + 'Apply' =>'Toepassen', + 'Cancel' =>'Annuleren', + 'Search' =>'Zoeken', + 'Hide' =>'Verbergen', + 'Clear' =>'Schonen', // 'Leeg maken', + 'Query' =>'Selecteer', // 'Selectie maken', + 'Current Query' =>'Huidige selectie', + 'Sorted By' =>'Gesorteerd op', + 'ascending' =>'oplopend', + 'descending' =>'aflopend', + 'hidden' =>'verborgen', + 'of' =>'van', + 'record added' =>'rij toegevoegd', + 'record changed' =>'rij aangepast', + 'record deleted' =>'rij gewist', + 'Please enter' =>'Voer a.u.b. in:', + 'months' => Array( + '01'=>'januari', + '02'=>'februari', + '03'=>'maart', + '04'=>'april', + '05'=>'mei', + '06'=>'juni', + '07'=>'juli', + '08'=>'augustus', + '09'=>'september', + '10'=>'october', + '11'=>'november', + '12'=>'december'), + // phpMyEdit-report + 'Make report' => 'Maak rapport', + 'Select fields' => 'Selecteer velden', + 'Records per screen' => 'Rij per scherm', + ); + +?> diff --git a/lang/PME.lang.NL.inc b/lang/PME.lang.NL.inc new file mode 100644 index 0000000..cae527a --- /dev/null +++ b/lang/PME.lang.NL.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.PL-LATIN2.inc b/lang/PME.lang.PL-LATIN2.inc new file mode 100644 index 0000000..9d250e6 --- /dev/null +++ b/lang/PME.lang.PL-LATIN2.inc @@ -0,0 +1,60 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.PL-LATIN2.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'Dodaj', + 'Copy' =>'Kopiuj', + 'Change' =>'Zmieñ', + 'Delete' =>'Usuñ', + 'View' =>'Poka¿', + 'Prev' =>'Wstecz', + 'Next' =>'Dalej', + 'First' =>'First', // untranslated + 'Last' =>'Last', // untranslated + 'Go to' =>'Go to', // untranslated + 'Page' =>'Strona', + 'Records' =>'Rekordy', + 'Save' =>'Zapisz', + 'More' =>'Wiêcej', + 'Apply' =>'Zastosuj', + 'Cancel' =>'Anuluj', + 'Search' =>'Szukaj', + 'Hide' =>'Ukryj', + 'Clear' =>'Wyczy¶æ', + 'Query' =>'Zapytanie', + 'Current Query' =>'Aktualne zapytanie', + 'Sorted By' =>'Posortowane wed³ug', + 'ascending' =>'rosn±co', + 'descending' =>'malej±co', + 'hidden' =>'ukryte', + 'of' =>'z', + 'record added' =>'rekord dodany', + 'record changed'=>'rekord zmieniony', + 'record deleted'=>'rekord usuniêty', + 'Please enter' =>'Proszê wprowadziæ', + 'months' => Array( + '01'=>'Styczeñ', + '02'=>'Luty', + '03'=>'Marzec', + '04'=>'Kwiecieñ', + '05'=>'Maj', + '06'=>'Czerwiec', + '07'=>'Lipiec', + '08'=>'Sierpieñ', + '09'=>'Wrzesieñ', + '10'=>'Pa¼dziernik', + '11'=>'Listopad', + '12'=>'Grudzieñ') + ); + +?> diff --git a/lang/PME.lang.PL-UTF8.inc b/lang/PME.lang.PL-UTF8.inc new file mode 100644 index 0000000..c63312b --- /dev/null +++ b/lang/PME.lang.PL-UTF8.inc @@ -0,0 +1,60 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.PL-UTF8.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'Dodaj', + 'Copy' =>'Kopiuj', + 'Change' =>'ZmieÅ„', + 'Delete' =>'UsuÅ„', + 'View' =>'Pokaż', + 'Prev' =>'Wstecz', + 'Next' =>'Dalej', + 'First' =>'First', // untranslated + 'Last' =>'Last', // untranslated + 'Go to' =>'Go to', // untranslated + 'Page' =>'Strona', + 'Records' =>'Rekordy', + 'Save' =>'Zapisz', + 'More' =>'WiÄ™cej', + 'Apply' =>'Zastosuj', + 'Cancel' =>'Anuluj', + 'Search' =>'Szukaj', + 'Hide' =>'Ukryj', + 'Clear' =>'Wyczyść', + 'Query' =>'Zapytanie', + 'Current Query' =>'Aktualne zapytanie', + 'Sorted By' =>'Posortowane wedÅ‚ug', + 'ascending' =>'rosnÄ…co', + 'descending' =>'malejÄ…co', + 'hidden' =>'ukryte', + 'of' =>'z', + 'record added' =>'rekord dodany', + 'record changed'=>'rekord zmieniony', + 'record deleted'=>'rekord usuniÄ™ty', + 'Please enter' =>'ProszÄ™ wprowadzić', + 'months' => Array( + '01'=>'StyczeÅ„', + '02'=>'Luty', + '03'=>'Marzec', + '04'=>'KwiecieÅ„', + '05'=>'Maj', + '06'=>'Czerwiec', + '07'=>'Lipiec', + '08'=>'SierpieÅ„', + '09'=>'WrzesieÅ„', + '10'=>'Październik', + '11'=>'Listopad', + '12'=>'GrudzieÅ„') + ); + +?> diff --git a/lang/PME.lang.PL.inc b/lang/PME.lang.PL.inc new file mode 100644 index 0000000..a3666ff --- /dev/null +++ b/lang/PME.lang.PL.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.PT-BR-LATIN1.inc b/lang/PME.lang.PT-BR-LATIN1.inc new file mode 100644 index 0000000..1938916 --- /dev/null +++ b/lang/PME.lang.PT-BR-LATIN1.inc @@ -0,0 +1,66 @@ + + * Victor Zucarino + */ + +/* $Platon: phpMyEdit/lang/PME.lang.PT-BR-LATIN1.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'Adiciona', + 'Copy' =>'Copia', + 'Change' =>'Edita', + 'Delete' =>'Remove', + 'View' =>'Visualiza', + 'Prev' =>'Anterior', + 'Next' =>'Próximo', + 'First' =>'Primeiro', + 'Last' =>'Último', + 'Go to' =>'Vai para', + 'Page' =>'Página', + 'Records' =>'Registros', + 'Save' =>'Salva', + 'More' =>'Mais', + 'Apply' =>'Aplica', + 'Cancel' =>'Cancela', + 'Search' =>'Pesquisa', + 'Hide' =>'Esconde', + 'Clear' =>'Limpa', + 'Query' =>'Resultado', + 'Current Query' =>'Resultado atual', + 'Sorted By' =>'Ordernado por', + 'ascending' =>'crescente', + 'descending' =>'descendente', + 'hidden' =>'escondido', + 'of' =>'de', + 'record added' =>'registro adicionado', + 'record changed'=>'registro editado', + 'record deleted'=>'registro removido', + 'Please enter' =>'Por favor, entre', + 'months' => Array( + '01'=>'Janeiro', + '02'=>'Fevereiro', + '03'=>'Março', + '04'=>'Abril', + '05'=>'Maio', + '06'=>'Junho', + '07'=>'Julho', + '08'=>'Agosto', + '09'=>'Setembro', + '10'=>'Outubro', + '11'=>'Novembro', + '12'=>'Dezembro'), + // phpMyEdit-report + 'Make report' => 'Gerar relatório', + 'Select fields' => 'Selecionar campos', + 'Records per screen'=> 'Registros por tela', + ); + +?> diff --git a/lang/PME.lang.PT-BR-UTF8.inc b/lang/PME.lang.PT-BR-UTF8.inc new file mode 100644 index 0000000..d018117 --- /dev/null +++ b/lang/PME.lang.PT-BR-UTF8.inc @@ -0,0 +1,66 @@ + + * Victor Zucarino + */ + +/* $Platon: phpMyEdit/lang/PME.lang.PT-BR-UTF8.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'Adiciona', + 'Copy' =>'Copia', + 'Change' =>'Edita', + 'Delete' =>'Remove', + 'View' =>'Visualiza', + 'Prev' =>'Anterior', + 'Next' =>'Próximo', + 'First' =>'Primeiro', + 'Last' =>'Último', + 'Go to' =>'Vai para', + 'Page' =>'Página', + 'Records' =>'Registros', + 'Save' =>'Salva', + 'More' =>'Mais', + 'Apply' =>'Aplica', + 'Cancel' =>'Cancela', + 'Search' =>'Pesquisa', + 'Hide' =>'Esconde', + 'Clear' =>'Limpa', + 'Query' =>'Resultado', + 'Current Query' =>'Resultado atual', + 'Sorted By' =>'Ordernado por', + 'ascending' =>'crescente', + 'descending' =>'descendente', + 'hidden' =>'escondido', + 'of' =>'de', + 'record added' =>'registro adicionado', + 'record changed'=>'registro editado', + 'record deleted'=>'registro removido', + 'Please enter' =>'Por favor, entre', + 'months' => Array( + '01'=>'Janeiro', + '02'=>'Fevereiro', + '03'=>'Março', + '04'=>'Abril', + '05'=>'Maio', + '06'=>'Junho', + '07'=>'Julho', + '08'=>'Agosto', + '09'=>'Setembro', + '10'=>'Outubro', + '11'=>'Novembro', + '12'=>'Dezembro'), + // phpMyEdit-report + 'Make report' => 'Gerar relatório', + 'Select fields' => 'Selecionar campos', + 'Records per screen'=> 'Registros por tela', + ); + +?> diff --git a/lang/PME.lang.PT-BR.inc b/lang/PME.lang.PT-BR.inc new file mode 100644 index 0000000..290f4f9 --- /dev/null +++ b/lang/PME.lang.PT-BR.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.PT-LATIN1.inc b/lang/PME.lang.PT-LATIN1.inc new file mode 100644 index 0000000..6915166 --- /dev/null +++ b/lang/PME.lang.PT-LATIN1.inc @@ -0,0 +1,67 @@ + + * last_edit_purpose: full translation and correction + */ + +/* $Platon: phpMyEdit/lang/PME.lang.PT-LATIN1.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'Adicionar', + 'Copy' =>'Copiar', + 'Change' =>'Mudar', + 'Delete' =>'Apagar', + 'View' =>'Ver', + 'Prev' =>'Anterior', + 'Next' =>'Seguinte', + 'First' =>'Primeiro', + 'Last' =>'Último', + 'Go to' =>'Ir para', + 'Page' =>'Página', + 'Records' =>'Registos', + 'Save' =>'Guardar', + 'More' =>'Mais', + 'Apply' =>'Aplicar', + 'Cancel' =>'Cancelar', + 'Search' =>'Procurar', + 'Hide' =>'Esconder', + 'Clear' =>'Limpar', + 'Query' =>'Pesquisa', + 'Current Query' =>'Pesquisa Actual', + 'Sorted By' =>'Ordenado Por', + 'ascending' =>'ascendente', + 'descending' =>'descendente', + 'hidden' =>'escondido', + 'of' =>'de', + 'record added' =>'registo adicionado', + 'record changed' =>'registo alterado', + 'record deleted' =>'registo apagado', + 'Please enter' =>'Por favor introduza ', + 'months' => Array( + '01'=>'Janeiro', + '02'=>'Fevereiro', + '03'=>'Março', + '04'=>'Abril', + '05'=>'Maio', + '06'=>'Junho', + '07'=>'Julho', + '08'=>'Agosto', + '09'=>'Setembro', + '10'=>'Outubro', + '11'=>'Novembro', + '12'=>'Dezembro'), + // phpMyEdit-report + 'Make report' => 'Criar relatório', + 'Select fields' => 'Escolher campos', + 'Records per screen' => 'Registos por ecran', + ); + +?> diff --git a/lang/PME.lang.PT-UTF8.inc b/lang/PME.lang.PT-UTF8.inc new file mode 100644 index 0000000..00dd109 --- /dev/null +++ b/lang/PME.lang.PT-UTF8.inc @@ -0,0 +1,67 @@ + + * last_edit_purpose: full translation and correction + */ + +/* $Platon: phpMyEdit/lang/PME.lang.PT-UTF8.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'Adicionar', + 'Copy' =>'Copiar', + 'Change' =>'Mudar', + 'Delete' =>'Apagar', + 'View' =>'Ver', + 'Prev' =>'Anterior', + 'Next' =>'Seguinte', + 'First' =>'Primeiro', + 'Last' =>'Último', + 'Go to' =>'Ir para', + 'Page' =>'Página', + 'Records' =>'Registos', + 'Save' =>'Guardar', + 'More' =>'Mais', + 'Apply' =>'Aplicar', + 'Cancel' =>'Cancelar', + 'Search' =>'Procurar', + 'Hide' =>'Esconder', + 'Clear' =>'Limpar', + 'Query' =>'Pesquisa', + 'Current Query' =>'Pesquisa Actual', + 'Sorted By' =>'Ordenado Por', + 'ascending' =>'ascendente', + 'descending' =>'descendente', + 'hidden' =>'escondido', + 'of' =>'de', + 'record added' =>'registo adicionado', + 'record changed' =>'registo alterado', + 'record deleted' =>'registo apagado', + 'Please enter' =>'Por favor introduza ', + 'months' => Array( + '01'=>'Janeiro', + '02'=>'Fevereiro', + '03'=>'Março', + '04'=>'Abril', + '05'=>'Maio', + '06'=>'Junho', + '07'=>'Julho', + '08'=>'Agosto', + '09'=>'Setembro', + '10'=>'Outubro', + '11'=>'Novembro', + '12'=>'Dezembro'), + // phpMyEdit-report + 'Make report' => 'Criar relatório', + 'Select fields' => 'Escolher campos', + 'Records per screen' => 'Registos por ecran', + ); + +?> diff --git a/lang/PME.lang.PT.inc b/lang/PME.lang.PT.inc new file mode 100644 index 0000000..496d8aa --- /dev/null +++ b/lang/PME.lang.PT.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.RO.inc b/lang/PME.lang.RO.inc new file mode 100644 index 0000000..4746c88 --- /dev/null +++ b/lang/PME.lang.RO.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.RO.inc,v 1.2 2004/12/27 20:14:29 nepto Exp $ */ + +return Array( + 'Add' =>'Adauga', + 'Copy' =>'Copiaza', + 'Change' =>'Modifica', + 'Delete' =>'Sterge', + 'View' =>'Vizualizeaza', + 'Prev' =>'Precedentul', + 'Next' =>'Urmatorul', + 'First' =>'First', // untranslated + 'Last' =>'Last', // untranslated + 'Go to' =>'Go to', // untranslated + 'Page' =>'Pagina', + 'Records' =>'Inregistrari', + 'Save' =>'Salveaza', + 'More' =>'Mai mult', + 'Apply' =>'Aplica', + 'Cancel' =>'Anuleaza', + 'Search' =>'Cauta', + 'Hide' =>'Ascunde', + 'Clear' =>'Anuleaza tot', + 'Query' =>'Interogare', + 'Current Query' =>'Interogarea curenta', + 'Sorted By' =>'Sortat dupa', + 'ascending' =>'crescator', + 'descending' =>'descrescator', + 'hidden' =>'ascuns', + 'of' =>'din', + 'record added' =>'inregistrare adaugata', + 'record changed'=>'inregistrare modificata', + 'record deleted'=>'inregistrare stearsa', + 'Please enter' =>'Introduceti va rog', + 'months' => Array( + '01'=>'Ianuarie', + '02'=>'Februarie', + '03'=>'Martie', + '04'=>'Aprilie', + '05'=>'Mai', + '06'=>'Iunie', + '07'=>'Iulie', + '08'=>'August', + '09'=>'Septembrie', + '10'=>'Octombrie', + '11'=>'Noiembrie', + '12'=>'Decembrie'), + // phpMyEdit-report // untranslated + 'Make report' => 'Make report', + 'Select fields' => 'Select fields', + 'Records per screen' => 'Records per screen', + ); + +?> diff --git a/lang/PME.lang.RU-UTF8.inc b/lang/PME.lang.RU-UTF8.inc new file mode 100644 index 0000000..5659baf --- /dev/null +++ b/lang/PME.lang.RU-UTF8.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.RU-UTF8.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'Добавить', + 'Copy' =>'Копировать', + 'Change' =>'Изменить', + 'Delete' =>'Удалить', + 'View' =>'ПроÑмотр', + 'Prev' =>'<<', + 'Next' =>'>>', + 'First' =>'I<', + 'Last' =>'>I', + 'Go to' =>'Перейти', + 'Page' =>'Стр.', + 'Records' =>'ЗапиÑей', + 'Save' =>'Сохранить', + 'More' =>'Больше', + 'Apply' =>'Применить', + 'Cancel' =>'Отмена', + 'Search' =>'ПоиÑк', + 'Hide' =>'Скрыть', + 'Clear' =>'ОчиÑтить', + 'Query' =>'ЗапроÑ', + 'Current Query' =>'Текущий запроÑ', + 'Sorted By' =>'ОтÑортировано по', + 'ascending' =>'- возраÑтанию', + 'descending' =>'- убыванию', + 'hidden' =>'Ñкрыто', + 'of' =>'из', + 'record added' =>'запиÑÑŒ добавлена', + 'record changed'=>'запиÑÑŒ обновлена', + 'record deleted'=>'запиÑÑŒ удалена', + 'Please enter' =>'ПожалуйÑта введите', + 'months' => Array( + '01'=>'Январь', + '02'=>'Февраль', + '03'=>'Март', + '04'=>'Ðпрель', + '05'=>'Май', + '06'=>'Июнь', + '07'=>'Июль', + '08'=>'ÐвгуÑÑ‚', + '09'=>'СентÑбрь', + '10'=>'ОктÑбрь', + '11'=>'ÐоÑбрь', + '12'=>'Декабрь'), + // phpMyEdit-report + 'Make report' => 'Создать отчет', + 'Select fields' => 'Выбрать полÑ', + 'Records per screen' => 'ЗапиÑей на Ñкране', + ); + +?> diff --git a/lang/PME.lang.RU-WINDOWS1251.inc b/lang/PME.lang.RU-WINDOWS1251.inc new file mode 100644 index 0000000..55d4c13 --- /dev/null +++ b/lang/PME.lang.RU-WINDOWS1251.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.RU-WINDOWS1251.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'Äîáàâèòü', + 'Copy' =>'Êîïèðîâàòü', + 'Change' =>'Èçìåíèòü', + 'Delete' =>'Óäàëèòü', + 'View' =>'Ïðîñìîòð', + 'Prev' =>'<<', + 'Next' =>'>>', + 'First' =>'I<', + 'Last' =>'>I', + 'Go to' =>'Ïåðåéòè', + 'Page' =>'Ñòð.', + 'Records' =>'Çàïèñåé', + 'Save' =>'Ñîõðàíèòü', + 'More' =>'Áîëüøå', + 'Apply' =>'Ïðèìåíèòü', + 'Cancel' =>'Îòìåíà', + 'Search' =>'Ïîèñê', + 'Hide' =>'Ñêðûòü', + 'Clear' =>'Î÷èñòèòü', + 'Query' =>'Çàïðîñ', + 'Current Query' =>'Òåêóùèé çàïðîñ', + 'Sorted By' =>'Îòñîðòèðîâàíî ïî', + 'ascending' =>'- âîçðàñòàíèþ', + 'descending' =>'- óáûâàíèþ', + 'hidden' =>'ñêðûòî', + 'of' =>'èç', + 'record added' =>'çàïèñü äîáàâëåíà', + 'record changed'=>'çàïèñü îáíîâëåíà', + 'record deleted'=>'çàïèñü óäàëåíà', + 'Please enter' =>'Ïîæàëóéñòà ââåäèòå', + 'months' => Array( + '01'=>'ßíâàðü', + '02'=>'Ôåâðàëü', + '03'=>'Ìàðò', + '04'=>'Àïðåëü', + '05'=>'Ìàé', + '06'=>'Èþíü', + '07'=>'Èþëü', + '08'=>'Àâãóñò', + '09'=>'Ñåíòÿáðü', + '10'=>'Îêòÿáðü', + '11'=>'Íîÿáðü', + '12'=>'Äåêàáðü'), + // phpMyEdit-report + 'Make report' => 'Ñîçäàòü îò÷åò', + 'Select fields' => 'Âûáðàòü ïîëÿ', + 'Records per screen' => 'Çàïèñåé íà ýêðàíå', + ); + +?> diff --git a/lang/PME.lang.RU.inc b/lang/PME.lang.RU.inc new file mode 100644 index 0000000..38448d6 --- /dev/null +++ b/lang/PME.lang.RU.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.SE-LATIN1.inc b/lang/PME.lang.SE-LATIN1.inc new file mode 100644 index 0000000..3047ba1 --- /dev/null +++ b/lang/PME.lang.SE-LATIN1.inc @@ -0,0 +1,73 @@ + + * Stefan Lindmark + */ + +/* $Platon: phpMyEdit/lang/PME.lang.SE-LATIN1.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +/* + * å = å + * ä = ä + * ö = ö + * Ä = Ä + */ + +return Array( + 'Add' =>'Lägg till', + 'Copy' =>'Kopiera', + 'Change' =>'Ändra', + 'Delete' =>'Ta bort', + 'View' =>'Visa detaljer', + 'Prev' =>'Föregående', + 'Next' =>'Nästa', + 'First' =>'Första', + 'Last' =>'Sista', + 'Go to' =>'Gå till sida', + 'Page' =>'Sida', + 'Records' =>'Poster', + 'Save' =>'Spara', + 'More' =>'Mer', + 'Apply' =>'Verkställ', + 'Cancel' =>'Avbryt', + 'Search' =>'Sök', + 'Hide' =>'Dölj', + 'Clear' =>'Rensa', + 'Query' =>'Sök', + 'Current Query' =>'Nuvarande fråga', + 'Sorted By' =>'Sorterad efter', + 'ascending' =>'stigande', + 'descending' =>'fallande', + 'hidden' =>'gömd', + 'of' =>'av', + 'record added' =>'post adderad', + 'record changed' =>'post ändrad', + 'record deleted' =>'post borttagen', + 'Please enter' =>'Fyll i fältet', + 'months' => Array( + '01'=>'Januari', + '02'=>'Februari', + '03'=>'Mars', + '04'=>'April', + '05'=>'Maj', + '06'=>'Juni', + '07'=>'Juli', + '08'=>'Augusti', + '09'=>'September', + '10'=>'Oktober', + '11'=>'November', + '12'=>'December'), + // phpMyEdit-report + 'Make report' => 'Skapa rapport', + 'Select fields' => 'Välj fält', + 'Records per screen' => 'Poster per skärm', + ); + +?> diff --git a/lang/PME.lang.SE-UTF8.inc b/lang/PME.lang.SE-UTF8.inc new file mode 100644 index 0000000..2de68c8 --- /dev/null +++ b/lang/PME.lang.SE-UTF8.inc @@ -0,0 +1,73 @@ + + * Stefan Lindmark + */ + +/* $Platon: phpMyEdit/lang/PME.lang.SE-UTF8.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +/* + * Ã¥ = å + * ä = ä + * ö = ö + * Ä = Ä + */ + +return Array( + 'Add' =>'Lägg till', + 'Copy' =>'Kopiera', + 'Change' =>'Ändra', + 'Delete' =>'Ta bort', + 'View' =>'Visa detaljer', + 'Prev' =>'FöregÃ¥ende', + 'Next' =>'Nästa', + 'First' =>'Första', + 'Last' =>'Sista', + 'Go to' =>'GÃ¥ till sida', + 'Page' =>'Sida', + 'Records' =>'Poster', + 'Save' =>'Spara', + 'More' =>'Mer', + 'Apply' =>'Verkställ', + 'Cancel' =>'Avbryt', + 'Search' =>'Sök', + 'Hide' =>'Dölj', + 'Clear' =>'Rensa', + 'Query' =>'Sök', + 'Current Query' =>'Nuvarande frÃ¥ga', + 'Sorted By' =>'Sorterad efter', + 'ascending' =>'stigande', + 'descending' =>'fallande', + 'hidden' =>'gömd', + 'of' =>'av', + 'record added' =>'post adderad', + 'record changed' =>'post ändrad', + 'record deleted' =>'post borttagen', + 'Please enter' =>'Fyll i fältet', + 'months' => Array( + '01'=>'Januari', + '02'=>'Februari', + '03'=>'Mars', + '04'=>'April', + '05'=>'Maj', + '06'=>'Juni', + '07'=>'Juli', + '08'=>'Augusti', + '09'=>'September', + '10'=>'Oktober', + '11'=>'November', + '12'=>'December'), + // phpMyEdit-report + 'Make report' => 'Skapa rapport', + 'Select fields' => 'Välj fält', + 'Records per screen' => 'Poster per skärm', + ); + +?> diff --git a/lang/PME.lang.SE.inc b/lang/PME.lang.SE.inc new file mode 100644 index 0000000..2b8a434 --- /dev/null +++ b/lang/PME.lang.SE.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.SK-LATIN2.inc b/lang/PME.lang.SK-LATIN2.inc new file mode 100644 index 0000000..829cd07 --- /dev/null +++ b/lang/PME.lang.SK-LATIN2.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.SK-LATIN2.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'Prida»', + 'Copy' =>'Kopírova»', + 'Change' =>'Zmeni»', + 'Delete' =>'Zmaza»', + 'View' =>'Pozrie»', + 'Prev' =>'Predchádzajúci', + 'Next' =>'Ïal¹í', + 'First' =>'Prvý', + 'Last' =>'Posledný', + 'Go to' =>'Choï na', + 'Page' =>'Stránka', + 'Records' =>'Záznamov', + 'Save' =>'Ulo¾i»', + 'More' =>'Viac', + 'Apply' =>'Pou¾i»', + 'Cancel' =>'Storno', + 'Search' =>'Hµada»', + 'Hide' =>'Skry»', + 'Clear' =>'Zru¹i»', + 'Query' =>'Vyhµada»', + 'Current Query' =>'Aktuálny dotaz', + 'Sorted By' =>'Usporiadané podµa', + 'ascending' =>'vzostupne', + 'descending' =>'zostupne', + 'hidden' =>'skryté', + 'of' =>'z', + 'record added' =>'záznam pridaný', + 'record changed'=>'záznam zmenený', + 'record deleted'=>'záznam zmazaný', + 'Please enter' =>'Prosím zadajte', + 'months' => Array( + '01'=>'Január', + '02'=>'Február', + '03'=>'Marec', + '04'=>'Apríl', + '05'=>'Máj', + '06'=>'Jún', + '07'=>'Júl', + '08'=>'August', + '09'=>'September', + '10'=>'Október', + '11'=>'November', + '12'=>'December'), + // phpMyEdit-report + 'Make report' => 'Vytvori» report', + 'Select fields' => 'Vybra» ståpce', + 'Records per screen' => 'Poèet záznamov na stránke', + ); + +?> diff --git a/lang/PME.lang.SK-UTF8.inc b/lang/PME.lang.SK-UTF8.inc new file mode 100644 index 0000000..2c14816 --- /dev/null +++ b/lang/PME.lang.SK-UTF8.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.SK-UTF8.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'PridaÅ¥', + 'Copy' =>'KopírovaÅ¥', + 'Change' =>'ZmeniÅ¥', + 'Delete' =>'ZmazaÅ¥', + 'View' =>'PozrieÅ¥', + 'Prev' =>'Predchádzajúci', + 'Next' =>'ÄŽalší', + 'First' =>'Prvý', + 'Last' =>'Posledný', + 'Go to' =>'ChoÄ na', + 'Page' =>'Stránka', + 'Records' =>'Záznamov', + 'Save' =>'UložiÅ¥', + 'More' =>'Viac', + 'Apply' =>'PoužiÅ¥', + 'Cancel' =>'Storno', + 'Search' =>'HľadaÅ¥', + 'Hide' =>'SkryÅ¥', + 'Clear' =>'ZruÅ¡iÅ¥', + 'Query' =>'VyhľadaÅ¥', + 'Current Query' =>'Aktuálny dotaz', + 'Sorted By' =>'Usporiadané podľa', + 'ascending' =>'vzostupne', + 'descending' =>'zostupne', + 'hidden' =>'skryté', + 'of' =>'z', + 'record added' =>'záznam pridaný', + 'record changed'=>'záznam zmenený', + 'record deleted'=>'záznam zmazaný', + 'Please enter' =>'Prosím zadajte', + 'months' => Array( + '01'=>'Január', + '02'=>'Február', + '03'=>'Marec', + '04'=>'Apríl', + '05'=>'Máj', + '06'=>'Jún', + '07'=>'Júl', + '08'=>'August', + '09'=>'September', + '10'=>'Október', + '11'=>'November', + '12'=>'December'), + // phpMyEdit-report + 'Make report' => 'VytvoriÅ¥ report', + 'Select fields' => 'VybraÅ¥ stĺpce', + 'Records per screen' => 'PoÄet záznamov na stránke', + ); + +?> diff --git a/lang/PME.lang.SK.inc b/lang/PME.lang.SK.inc new file mode 100644 index 0000000..0b9296d --- /dev/null +++ b/lang/PME.lang.SK.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.TR-LATIN9.inc b/lang/PME.lang.TR-LATIN9.inc new file mode 100644 index 0000000..b88e9da --- /dev/null +++ b/lang/PME.lang.TR-LATIN9.inc @@ -0,0 +1,66 @@ + + * Kadan Kongar + */ + +/* $Platon: phpMyEdit/lang/PME.lang.TR-LATIN9.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'Ekle', + 'Copy' =>'Kopyala', + 'Change' =>'Deðiþtir', + 'Delete' =>'Sil', + 'View' =>'Bak', + 'Prev' =>'Önceki', + 'Next' =>'Sonraki', + 'First' =>'Ýlk', + 'Last' =>'Son', + 'Go to' =>'Git', + 'Page' =>'Sayfa', + 'Records' =>'Kayýt', + 'Save' =>'Kaydet', + 'More' =>'Devamý', + 'Apply' =>'Uygula', + 'Cancel' =>'Ýptal', + 'Search' =>'Ara', + 'Hide' =>'Gizle', + 'Clear' =>'Temizle', + 'Query' =>'Sorgu', + 'Current Query' =>'Aktif Sorgu', + 'Sorted By' =>'Sýralama', + 'ascending' =>'artan', + 'descending' =>'azalan', + 'hidden' =>'gizli', + 'of' =>' / ', + 'record added' =>'kayýt eklendi', + 'record changed' =>'kayýt deðiþtirildi', + 'record deleted' =>'kayýt silindi', + 'Please enter' =>'Lütfen giriniz :', + 'months' => Array( + '01'=>'Ocak', + '02'=>'Þubat', + '03'=>'Mart', + '04'=>'Nisan', + '05'=>'Mayýs', + '06'=>'Haziran', + '07'=>'Temmuz', + '08'=>'Auðustos', + '09'=>'Eylül', + '10'=>'Ekim', + '11'=>'Kasým', + '12'=>'Aralýk'), + // phpMyEdit-report + 'Make report' => 'Rapor hazýrla', + 'Select fields' => 'Alanlarý seçiniz', + 'Records per screen' => 'Sayfa baþýna kayýt', + ); + +?> diff --git a/lang/PME.lang.TR-UTF8.inc b/lang/PME.lang.TR-UTF8.inc new file mode 100644 index 0000000..c807609 --- /dev/null +++ b/lang/PME.lang.TR-UTF8.inc @@ -0,0 +1,66 @@ + + * Kadan Kongar + */ + +/* $Platon: phpMyEdit/lang/PME.lang.TR-UTF8.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'Ekle', + 'Copy' =>'Kopyala', + 'Change' =>'Deðiþtir', + 'Delete' =>'Sil', + 'View' =>'Bak', + 'Prev' =>'Önceki', + 'Next' =>'Sonraki', + 'First' =>'Ãlk', + 'Last' =>'Son', + 'Go to' =>'Git', + 'Page' =>'Sayfa', + 'Records' =>'Kayýt', + 'Save' =>'Kaydet', + 'More' =>'Devamý', + 'Apply' =>'Uygula', + 'Cancel' =>'Ãptal', + 'Search' =>'Ara', + 'Hide' =>'Gizle', + 'Clear' =>'Temizle', + 'Query' =>'Sorgu', + 'Current Query' =>'Aktif Sorgu', + 'Sorted By' =>'Sýralama', + 'ascending' =>'artan', + 'descending' =>'azalan', + 'hidden' =>'gizli', + 'of' =>' / ', + 'record added' =>'kayýt eklendi', + 'record changed' =>'kayýt deðiþtirildi', + 'record deleted' =>'kayýt silindi', + 'Please enter' =>'Lütfen giriniz :', + 'months' => Array( + '01'=>'Ocak', + '02'=>'Þubat', + '03'=>'Mart', + '04'=>'Nisan', + '05'=>'Mayýs', + '06'=>'Haziran', + '07'=>'Temmuz', + '08'=>'Auðustos', + '09'=>'Eylül', + '10'=>'Ekim', + '11'=>'Kasým', + '12'=>'Aralýk'), + // phpMyEdit-report + 'Make report' => 'Rapor hazýrla', + 'Select fields' => 'Alanlarý seçiniz', + 'Records per screen' => 'Sayfa baþýna kayýt', + ); + +?> diff --git a/lang/PME.lang.TR.inc b/lang/PME.lang.TR.inc new file mode 100644 index 0000000..d05cd81 --- /dev/null +++ b/lang/PME.lang.TR.inc @@ -0,0 +1,13 @@ + diff --git a/lang/PME.lang.ZH-BIG5.inc b/lang/PME.lang.ZH-BIG5.inc new file mode 100644 index 0000000..d80fbb1 --- /dev/null +++ b/lang/PME.lang.ZH-BIG5.inc @@ -0,0 +1,66 @@ + + * Manix Sio + */ + +/* $Platon: phpMyEdit/lang/PME.lang.ZH-BIG5.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'·s¼W', + 'Copy' =>'½Æ»s', + 'Change' =>'Åܧó', + 'Delete' =>'§R°£', + 'View' =>'À˵ø', + 'Prev' =>'¤W¤@­¶', + 'Next' =>'¤U¤@­¶', + 'First' =>'²Ä¤@­¶', + 'Last' =>'³Ì¥½¤@­¶', + 'Go to' =>'«e©¹', + 'Page' =>'­¶¼Æ', + 'Records' =>'¸ê®Æµ§¼Æ', + 'Save' =>'Àx¦s', + 'More' =>'Àx¦s«áÄ~Äò·s¼W', + 'Apply' =>'®M¥Î', + 'Cancel' =>'¨ú®ø', + 'Search' =>'·j´M', + 'Hide' =>'ÁôÂÃ', + 'Clear' =>'²M°£', + 'Query' =>'¬d¸ß', + 'Current Query' =>'¥Ø«e¬d¸ß±ø¥ó', + 'Sorted By' =>'±Æ§Ç¨Ì¾Ú', + 'ascending' =>'¤É¾­±Æ§Ç', + 'descending' =>'­°¾­±Æ§Ç', + 'hidden' =>'ÁôÂÃ', + 'of' =>'Á`¦@­¶¼Æ', + 'record added' =>'µ§¸ê®Æ³Q·s¼W', + 'record changed' =>'µ§¸ê®Æ³Q§ó·s', + 'record deleted' =>'µ§¸ê®Æ³Q§R°£', + 'Please enter' =>'½Ð¿é¤J', + 'months' => Array( + '01'=>'¤@¤ë', + '02'=>'¤G¤ë', + '03'=>'¤T¤ë', + '04'=>'¥|¤ë', + '05'=>'¤­¤ë', + '06'=>'¤»¤ë', + '07'=>'¤C¤ë', + '08'=>'¤K¤ë', + '09'=>'¤E¤ë', + '10'=>'¤Q¤ë', + '11'=>'¤Q¤@¤ë', + '12'=>'¤Q¤G¤ë'), + // phpMyEdit-report + 'Make report' => '²£¥Í³øªí', + 'Select fields' => '¿ï¨úÄæ¦ì', + 'Records per screen' => '¨C­¶µ§¼Æ', + ); + +?> diff --git a/lang/PME.lang.ZH-SG.inc b/lang/PME.lang.ZH-SG.inc new file mode 100644 index 0000000..c473d72 --- /dev/null +++ b/lang/PME.lang.ZH-SG.inc @@ -0,0 +1,64 @@ + + */ + +/* $Platon: phpMyEdit/lang/PME.lang.ZH-SG.inc,v 1.4 2004/12/27 20:14:29 nepto Exp $ */ + +return Array( + 'Add' =>'添加', + 'Copy' =>'å¤åˆ¶', + 'Change' =>'更改', + 'Delete' =>'删除', + 'View' =>'查看', + 'Prev' =>'上页', + 'Next' =>'下页', + 'First' =>'First', // untranslated + 'Last' =>'Last', // untranslated + 'Go to' =>'Go to', // untranslated + 'Page' =>'页', + 'Records' =>'记录', + 'Save' =>'ä¿å­˜', + 'More' =>'更多', + 'Apply' =>'应用', + 'Cancel' =>'å–æ¶ˆ', + 'Search' =>'æœå¯»', + 'Hide' =>'éšè—', + 'Clear' =>'清除', + 'Query' =>'查询', + 'Current Query' =>'å½“å‰ æŸ¥è¯¢', + 'Sorted By' =>'æŽ’åºæ–¹å¼', + 'ascending' =>'上å‡', + 'descending' =>'递å‡', + 'hidden' =>'éšè—çš„', + 'of' =>'总', + 'record added' =>'记录添加', + 'record changed' =>'记录更改', + 'record deleted' =>'记录删除', + 'Please enter' =>'请进入', + 'months' => Array( + '01'=>'一月', + '02'=>'二月', + '03'=>'三月', + '04'=>'四月', + '05'=>'五月', + '06'=>'六月', + '07'=>'七月', + '08'=>'八月', + '09'=>'乿œˆ', + '10'=>'åæœˆ', + '11'=>'å一月', + '12'=>'å二月'), + // phpMyEdit-report + 'Make report' => 'Make report', + 'Select fields' => 'Select fields', + 'Records per screen' => 'Records per screen', + ); + +?> diff --git a/lang/PME.lang.ZH-UTF8.inc b/lang/PME.lang.ZH-UTF8.inc new file mode 100644 index 0000000..cc991a4 --- /dev/null +++ b/lang/PME.lang.ZH-UTF8.inc @@ -0,0 +1,66 @@ + + * Manix Sio + */ + +/* $Platon: phpMyEdit/lang/PME.lang.ZH-UTF8.inc,v 1.1 2007-09-16 12:57:13 nepto Exp $ */ + +return Array( + 'Add' =>'新增', + 'Copy' =>'複製', + 'Change' =>'變更', + 'Delete' =>'刪除', + 'View' =>'檢視', + 'Prev' =>'上一é ', + 'Next' =>'下一é ', + 'First' =>'第一é ', + 'Last' =>'最末一é ', + 'Go to' =>'å‰å¾€', + 'Page' =>'é æ•¸', + 'Records' =>'資料筆數', + 'Save' =>'儲存', + 'More' =>'儲存後繼續新增', + 'Apply' =>'套用', + 'Cancel' =>'å–æ¶ˆ', + 'Search' =>'æœå°‹', + 'Hide' =>'éš±è—', + 'Clear' =>'清除', + 'Query' =>'查詢', + 'Current Query' =>'ç›®å‰æŸ¥è©¢æ¢ä»¶', + 'Sorted By' =>'排åºä¾æ“š', + 'ascending' =>'å‡å†ªæŽ’åº', + 'descending' =>'é™å†ªæŽ’åº', + 'hidden' =>'éš±è—', + 'of' =>'ç¸½å…±é æ•¸', + 'record added' =>'筆資料被新增', + 'record changed' =>'筆資料被更新', + 'record deleted' =>'筆資料被刪除', + 'Please enter' =>'請輸入', + 'months' => Array( + '01'=>'一月', + '02'=>'二月', + '03'=>'三月', + '04'=>'四月', + '05'=>'五月', + '06'=>'六月', + '07'=>'七月', + '08'=>'八月', + '09'=>'乿œˆ', + '10'=>'åæœˆ', + '11'=>'å一月', + '12'=>'å二月'), + // phpMyEdit-report + 'Make report' => '產生報表', + 'Select fields' => 'é¸å–欄ä½', + 'Records per screen' => 'æ¯é ç­†æ•¸', + ); + +?> diff --git a/lang/PME.lang.ZH.inc b/lang/PME.lang.ZH.inc new file mode 100644 index 0000000..f0c5aca --- /dev/null +++ b/lang/PME.lang.ZH.inc @@ -0,0 +1,13 @@ + diff --git a/lib/whois.php b/lib/whois.php new file mode 100644 index 0000000..e53698b --- /dev/null +++ b/lib/whois.php @@ -0,0 +1,54 @@ + + +
+Domain: "> + +
+Whois records for $domainname"; + $zonecheck = checkzone($domainname, true, false); + +?> + + +

Raw output

+info); $i++) {
+    echo $zonecheck->info[$i]."\n";
+  }
+?>
+

Parsed output

+Domain name"; + echo "
".$zonecheck->parseddomain."
"; + echo "

Domain holder

"; + echo "
".$zonecheck->registrant."
"; + echo "

Admin contact

"; + echo "
".$zonecheck->admincontact."
"; + echo "

Tech contact

"; + echo "
".$zonecheck->techcontact."
"; + echo "

Nameservers

"; + echo "
";
+  for($i=0; $ins); $i++) {
+    echo $zonecheck->ns[$i]."\n";
+  }
+  echo "
"; + echo "

Registrar

"; + echo "
".$zonecheck->registrar."
"; + echo "

Service provider

"; + echo "
".$zonecheck->rsp."
"; +?> +

Unparsed data

+
+meta);
+?>
+
+ diff --git a/lib/zonecheck.class.php b/lib/zonecheck.class.php new file mode 100644 index 0000000..fcb8658 --- /dev/null +++ b/lib/zonecheck.class.php @@ -0,0 +1,327 @@ +lookup($domain, $usecache); + } + return $checkzone_obj; +} // End of function checkzone + +// This works similar to array_intersect_key, but uses regexps in the second array +// I initially used array_intersect_ukey with a callback function, but +// for some reason that was behaving erroneously +function array_intersect_ekey($haystack, $needles) { + foreach($haystack as $payload => $value) { + // Test this twig against the regexps in $needles + foreach($needles as $pattern => $noop) { + $matches = preg_match($pattern, $payload); + if($matches == 1) { + $intersect[$payload] = $value; + } + } + } + if(empty($intersect)) $intersect = array(); + return $intersect; +} // End of function array_intersect_ekey + +function get_array_intersect_entry($haystack, $needles) { + $intersect = array_intersect_ekey($haystack, $needles); + //$entry = current(array_values($intersect)); + foreach($intersect as $member) { + foreach($member as $particle) { + $entry[] = $particle; + } + } + if(empty($entry)) { + $entry = array(); + } + return $entry; +} + +// Test purposes only +if(false) { + $pattern = "/^Technical Contact (?!ID).+$/"; + $payload = "Technical Contact Pass ID"; + echo "$pattern <-> $payload == "; + echo preg_match($pattern, $payload); + die; +} + +/* Class zonecheck */ +class zonecheck { + var $domain; + var $debug; + var $tld; + var $info = array(); + var $meta = array(); + var $ns = array(); + var $parseddomain; + var $registrar; + var $rsp; + var $registrant; + var $admincontact; + var $techcontact; + var $ns_ns = array(); + var $ns_mx = array(); + + // Definition of array matrices to intercept keys + // This array has all tokens that we have seen to contain domain name data + var $tokens_domain = array( + "/^Domain$/" => 0, + "/^Domain name$/i" => 0, + "/^Domain Name \(ASCII\)$/i" => 0); + // This array has all tokens that we have seen to contain nameserver data + var $tokens_ns = array( + "/^Domain nameservers$/" => 0, + "/^Domain servers in listed order$/" => 0, + "/^Nserver$/" => 0, + "/^Nameserver(s)?$/" => 0, + "/^Name Server$/" => 0); + // This array has all tokens that we have seen to contain registrant data + var $tokens_registrant = array( + "/^Registrars\.Registrant$/" => 0, + "/^Registrant (?!ID).+$/" => 0, + "/^Holder (?!ID).+$/" => 0, + "/^Registrant$/" => 0); + // This array has all tokens that we have seen to contain registrar data + var $tokens_registrar = array( + "/^Sponsoring Registrar$/" => 0, + "/^Zone-C (?!ID).+$/" => 0, + "/^Registrar$/" => 0); + // This array has all tokens that we have seen to contain admin contact data + var $tokens_admincontact = array( + "/^Administrative Contact (?!ID).+$/" => 0, + "/^Administrative Contact,/" => 0, + "/^Admin(-C)? (?!ID).+$/" => 0, + "/^Administrative Contact$/i" => 0); + // This array has all tokens that we have seen to contain tech contact data + var $tokens_techcontact = array( + "/^Technical Contact,/" => 0, + "/^.+Technical Contact$/" => 0, + "/^Technical Contact (?!ID).+$/" => 0, + "/^Tech(-C)? (?!ID).+$/" => 0, + "/^Technical contact(?:\(s\))?$/i" => 0); + // This array has all tokens that we have seen to contain rsp data + var $tokens_rsp = array( + "/^Registration Service Provider$/" => 0); + + // Constructor + function zonecheck($domainname, $usecache=true, $debug=false) { + $this->debug = $debug; + return $this->lookup($domainname, $usecache, $debug); + } // End function zonecheck (Constructor) + + function debug($debugtext) { + if($this->debug) echo $this->domain.": ".$debugtext."\n"; + } // End of function debug + + function lookup($domainname, $usecache=true, $debug=false) { + $this->debug = $debug; + $this->domain = $domainname; + $this->tld = substr($this->domain, strrpos($this->domain, ".")); + $this->info = array(); + $this->meta = array(); + $this->ns = array(); + $this->parseddomain = ""; + $this->registrar = ""; + $this->rsp = ""; + $this->registrant = ""; + $this->admincontact = ""; + $this->techcontact = ""; + $this->ns_ns = array(); + $this->ns_mx = array(); + + // Check cache + $cached = false; + $cachefilename = CACHEDIR."/".$domainname.".txt"; + if($usecache) { + if(file_exists($cachefilename)) { + $this->debug("found cached in file $cachefilename"); + if((time()-filemtime($cachefilename)) < CACHEEXPIRE) { + $this->debug("accepted cached file $cachefilename"); + $this->info = file($cachefilename); + $cached = true; + } else { + $this->debug("expired cached file $cachefilename"); + } + } + } else { + $this->debug("cache not used by request"); + } + + if(!$cached) { + $this->debug("performing whois query"); + // Get the raw data + $args = ""; + switch($this->tld) { + case ".me": $args = "-h whois.nic.me"; break; + } + $cmd = "whois $args $domainname"; + $retcode = exec($cmd, $this->info); + } + + // Normalize the array and save to cache if needed + for($line=0; $lineinfo); $line++) { + $this->info[$line] = trim($this->info[$line]); + } + if(!$cached && is_writable(CACHEDIR)) { + $cachefp = fopen($cachefilename, 'w'); + if($cachefp !== false) { + for($line=0; $lineinfo); $line++) { + fwrite($cachefp, $this->info[$line]."\r\n"); + } + fclose($cachefp); + } + } + + // Parse more intelligent stuff + $this->enkey_data(); + $this->compose_members(); + $this->extract_registrar(); + $this->extract_domainname(); + $this->extract_nameservers(); + $this->extract_registrant(); + $this->extract_admincontact(); + $this->extract_techcontact(); + $this->extract_rsp(); + $this->nslookup(); + } // End function lookup + + function enkey_data() { + $key = "general"; + $initoken = ""; + $this->debug("building key/value array"); + // Basically a simple state machine that parses the whois output + for($line=0; $lineinfo); $line++) { + // Check if this is an INI-style whois line + if((substr($this->info[$line],0,1) == "[") && (substr($this->info[$line],-1,1) == "]")) { + // INI-style formatting found (like .de domain) + $initoken = substr($this->info[$line],1,strlen($this->info[$line])-2); + } + + // Locate the first : in line + $tokenpos = strpos($this->info[$line], ":"); + + if($tokenpos !== false) { + // Don't count it if it is part of something generic + $contextpos = strpos($this->info[$line], "http://"); + if($contextpos !== false && $contextpos == $tokenpos-4) $tokenpos = false; + $contextpos = strpos($this->info[$line], "Last update of whois database:"); + if($contextpos !== false && $contextpos == $tokenpos-29) $tokenpos = false; + $contextpos = strpos($this->info[$line], "to: (1) allow"); + if($contextpos !== false && $contextpos == $tokenpos-2) $tokenpos = false; + $contextpos = strpos($this->info[$line], "terms of use: You agree"); + if($contextpos !== false && $contextpos == $tokenpos-12) $tokenpos = false; + $contextpos = strpos($this->info[$line], "NOTICE: The expiration"); + if($contextpos !== false && $contextpos == $tokenpos-6) $tokenpos = false; + $contextpos = strpos($this->info[$line], "TERMS OF USE: You are not"); + if($contextpos !== false && $contextpos == $tokenpos-12) $tokenpos = false; + $contextpos = strpos($this->info[$line], "NOTE: THE WHOIS DATABASE"); + if($contextpos !== false && $contextpos == $tokenpos-4) $tokenpos = false; + $contextpos = strpos($this->info[$line], "under no circumstances will you use this data to:"); + if($contextpos !== false && $contextpos == $tokenpos-48) $tokenpos = false; + $contextpos = strpos($this->info[$line], "% Version: "); + if($contextpos !== false && $contextpos == $tokenpos-9) $tokenpos = false; + } + + // Split key/value pairs + if($tokenpos === false) { + // No key in this line, so use the previous key + $value = trim($this->info[$line]); + if($value == "") { + // Empty lines reset the key and inittoken + $key = "general"; + $initoken = ""; + } else { + $this->meta[$key][] = $value; + } + } else { + // Key in line, so split the parts + $key = trim(substr($this->info[$line], 0, strpos($this->info[$line], ":"))); + if($initoken != "") $key = "$initoken $key"; + $value = trim(substr($this->info[$line], strpos($this->info[$line], ":")+1)); + if($value != "") { + // Don't care about superfluous empty lines + $this->meta[$key][] = $value; + } + } + } + // Clean up metadata we really don't need again + unset($this->meta["general"]); + } // End function build_array + + function compose_members() { + // For .info: + switch($this->tld) { + case ".info": + $this->meta["Registrant"][] = $this->meta["Registrant ID"]; + $this->meta["Registrant"][] = $this->meta["Registrant Name"]; + $this->meta["Registrant"][] = $this->meta["Registrant Organisation"]; + $this->meta["Registrant"][] = $this->meta["Registrant Address1"]; + $this->meta["Administrative Contact"][] = $this->meta["Administrative Contact ID"]; + $this->meta["Administrative Contact"][] = $this->meta["Administrative Contact Name"]; + } + } + + function extract_nameservers() { + $this->debug("locating nameserver info"); + $this->ns=get_array_intersect_entry($this->meta, $this->tokens_ns); + for($i=0; $ins); $i++) { + if(strpos($this->ns[$i], " ") !== false) { + $this->ns[$i] = substr($this->ns[$i], 0, strpos($this->ns[$i], " ")); + } + } + sort($this->ns); + } // End function extract_nameservers + + function extract_registrant() { + $this->debug("locating registrant info"); + $this->registrant=implode("\n", get_array_intersect_entry($this->meta, $this->tokens_registrant)); + } // End function extract_registrant + + function extract_admincontact() { + $this->debug("locating admin contact info"); + $this->admincontact=implode("\n", get_array_intersect_entry($this->meta, $this->tokens_admincontact)); + } // End function extract_admincontact + + function extract_techcontact() { + $this->debug("locating tech contact info"); + $this->techcontact=implode("\n", get_array_intersect_entry($this->meta, $this->tokens_techcontact)); + } // End function extract_techcontact + + function extract_domainname() { + $this->debug("locating domainname info"); + $this->parseddomain=implode("\n", array_unique(get_array_intersect_entry($this->meta, $this->tokens_domain))); + } // End function extract_domainname + + function extract_registrar() { + $this->debug("locating registrar info"); + $this->registrar=implode("\n", get_array_intersect_entry($this->meta, $this->tokens_registrar)); + } // End function extract_registrar + + function extract_rsp() { + $this->debug("locating registration service provider info"); + $this->rsp=implode("\n", get_array_intersect_entry($this->meta, $this->tokens_rsp)); + } // End function extract_rsp + + function nslookup() { +// $ttl = array(); +// $ns = array(); + $this->ns_mx = dns_get_record($this->domain, DNS_MX, $ns, $ttl); +echo "
";
+var_dump($ns);
+var_dump($this->ns_mx);
+echo "
"; + } // End function nslookup_ns +} +?> diff --git a/navframe.html b/navframe.html new file mode 100644 index 0000000..6020b5c --- /dev/null +++ b/navframe.html @@ -0,0 +1,31 @@ + +SAFE + + + +

SAFE

+(Service Administration Front-End) +

Lists

+ + +

Advanced options

+ + +
+ + + diff --git a/newinvoiceline.php b/newinvoiceline.php new file mode 100644 index 0000000..24f8f0b --- /dev/null +++ b/newinvoiceline.php @@ -0,0 +1,27 @@ +A fatal MySQL error occured.\n
Query: " . $qry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); +} + +header('Location: itemstoinvoice.php'); +?> diff --git a/phpMyEdit.class.php b/phpMyEdit.class.php new file mode 100644 index 0000000..5d71c90 --- /dev/null +++ b/phpMyEdit.class.php @@ -0,0 +1,3380 @@ + + * Copyright (c) 2001-2002 Jim Kraai + * Versions 5.0 and higher developed by Ondrej Jombik + * Copyright (c) 2002-2006 Platon Group, http://platon.sk/ + * All rights reserved. + * + * See README file for more information about this software. + * See COPYING file for license information. + * + * Download the latest version from + * http://platon.sk/projects/phpMyEdit/ + */ + +/* $Platon: phpMyEdit/phpMyEdit.class.php,v 1.204 2007-09-16 12:57:07 nepto Exp $ */ + +/* This is a generic table editing program. The table and fields to be + edited are defined in the calling program. + + This program works in three passes. + * Pass 1 (the last part of the program) displays the selected SQL + table in a scrolling table on the screen. Radio buttons are used to + select a record for editing or deletion. If the user chooses Add, + Change, Copy, View or Delete buttons. + * Pass 2 starts, displaying the selected record. If the user chooses + the Save button from this screen. + * Pass 3 processes the update and the display returns to the + original table view (Pass 1). +*/ + +class phpMyEdit_timer /* {{{ */ +{ + var $startTime; + var $started; + + function phpMyEdit_timer($start = true) + { + $this->started = false; + if ($start) { + $this->start(); + } + } + + function start() + { + $startMtime = explode(' ', microtime()); + $this->startTime = (double) $startMtime[0] + (double) $startMtime[1]; + $this->started = true; + } + + function end($iterations = 1) + { + // get the time, check whether the timer was started later + $endMtime = explode(' ', microtime()); + if ($this->started) { + $endTime = (double)($endMtime[0])+(double)($endMtime[1]); + $dur = $endTime - $this->startTime; + $avg = 1000 * $dur / $iterations; + $avg = round(1000 * $avg) / 1000; + return $avg; + } else { + return 'phpMyEdit_timer ERROR: timer not started'; + } + } +} /* }}} */ + +if (! function_exists('array_search')) { /* {{{ */ + function array_search($needle, $haystack) + { + foreach ($haystack as $key => $value) { + if ($needle == $value) + return $key; + } + return false; + } +} /* }}} */ + +if (! function_exists('realpath')) { /* {{{ */ + function realpath($path) + { + return $path; + } +} /* }}} */ + +class phpMyEdit +{ + // Class variables {{{ + + // Database handling + var $hn; // hostname + var $un; // user name + var $pw; // password + var $tb; // table + var $db; // database + var $dbp; // database with point and delimiters + var $dbh; // database handle + var $close_dbh; // if database handle should be closed + + // Record manipulation + var $key; // name of field which is the unique key + var $key_num; // number of field which is the unique key + var $key_type; // type of key field (int/real/string/date etc.) + var $key_delim; // character used for key value quoting + var $rec; // number of record selected for editing + var $inc; // number of records to display + var $fm; // first record to display + var $fl; // is the filter row displayed (boolean) + var $fds; // sql field names + var $fdn; // sql field names => $k + var $num_fds; // number of fields + var $options; // options for users: ACDFVPI + var $fdd; // field definitions + var $qfn; // value of all filters used during the last pass + var $sfn; // sort field number (- = descending sort order) + var $cur_tab; // current selected tab + + // Operation + var $navop; // navigation buttons/operations + var $sw; // filter display/hide/clear button + var $operation; // operation to do: Add, Change, Delete + var $saveadd; + var $moreadd; + var $canceladd; + var $savechange; + var $morechange; + var $cancelchange; + var $savecopy; + var $cancelcopy; + var $savedelete; + var $canceldelete; + var $cancelview; + + // Additional features + var $labels; // multilingual labels + var $cgi; // CGI variable features array + var $js; // JS configuration array + var $dhtml; // DHTML configuration array + var $url; // URL array + var $message; // informational message to print + var $notify; // change notification e-mail adresses + var $logtable; // name of optional logtable + var $navigation; // navigation style + var $tabs; // TAB names + var $timer = null; // phpMyEdit_timer object + var $sd; var $ed; // sql start and end delimiters '`' in case of MySQL + + // Predefined variables + var $comp_ops = array('<'=>'<','<='=>'<=','='=>'=','>='=>'>=','>'=>'>'); + var $sql_aggrs = array( + 'sum' => 'Total', + 'avg' => 'Average', + 'min' => 'Minimum', + 'max' => 'Maximum', + 'count' => 'Count'); + var $page_types = array( + 'L' => 'list', + 'F' => 'filter', + 'A' => 'add', + 'V' => 'view', + 'C' => 'change', + 'P' => 'copy', + 'D' => 'delete' + ); + var $default_buttons = array( + 'L' => array('<<','<','add','view','change','copy','delete','>','>>','goto','goto_combo'), + 'F' => array('<<','<','add','view','change','copy','delete','>','>>','goto','goto_combo'), + 'A' => array('save','more','cancel'), + 'C' => array('save','more','cancel'), + 'P' => array('save', 'cancel'), + 'D' => array('save','cancel'), + 'V' => array('change','cancel') + ); + // }}} + + /* + * column specific functions + */ + + function col_has_sql($k) { return isset($this->fdd[$k]['sql']); } + function col_has_sqlw($k) { return isset($this->fdd[$k]['sqlw']) && !$this->virtual($k); } + function col_has_values($k) { return isset($this->fdd[$k]['values']) || isset($this->fdd[$k]['values2']); } + function col_has_php($k) { return isset($this->fdd[$k]['php']); } + function col_has_URL($k) { return isset($this->fdd[$k]['URL']) + || isset($this->fdd[$k]['URLprefix']) || isset($this->fdd[$k]['URLpostfix']); } + function col_has_multiple($k) + { return $this->col_has_multiple_select($k) || $this->col_has_checkboxes($k); } + function col_has_multiple_select($k) + { return $this->fdd[$k]['select'] == 'M' && ! $this->fdd[$k]['values']['table']; } + function col_has_checkboxes($k) + { return $this->fdd[$k]['select'] == 'C' && ! $this->fdd[$k]['values']['table']; } + function col_has_radio_buttons($k) + { return $this->fdd[$k]['select'] == 'O' && ! $this->fdd[$k]['values']['table']; } + function col_has_datemask($k) + { return isset($this->fdd[$k]['datemask']) || isset($this->fdd[$k]['strftimemask']); } + + /* + * functions for indicating whether navigation style is enabled + */ + + function nav_buttons() { return stristr($this->navigation, 'B'); } + function nav_text_links() { return stristr($this->navigation, 'T'); } + function nav_graphic_links() { return stristr($this->navigation, 'G'); } + function nav_up() { return (stristr($this->navigation, 'U') && !($this->buttons[$this->page_type]['up'] === false)); } + function nav_down() { return (stristr($this->navigation, 'D') && !($this->buttons[$this->page_type]['down'] === false)); } + + /* + * functions for indicating whether operations are enabled + */ + + function add_enabled() { return stristr($this->options, 'A'); } + function change_enabled() { return stristr($this->options, 'C'); } + function delete_enabled() { return stristr($this->options, 'D'); } + function filter_enabled() { return stristr($this->options, 'F'); } + function view_enabled() { return stristr($this->options, 'V'); } + function copy_enabled() { return stristr($this->options, 'P') && $this->add_enabled(); } + function tabs_enabled() { return $this->display['tabs'] && count($this->tabs) > 0; } + function hidden($k) { return stristr($this->fdd[$k]['input'],'H'); } + function password($k) { return stristr($this->fdd[$k]['input'],'W'); } + function readonly($k) { return stristr($this->fdd[$k]['input'],'R') || $this->virtual($k); } + function virtual($k) { return stristr($this->fdd[$k]['input'],'V') && $this->col_has_sql($k); } + + function add_operation() { return $this->operation == $this->labels['Add'] && $this->add_enabled(); } + function change_operation() { return $this->operation == $this->labels['Change'] && $this->change_enabled(); } + function copy_operation() { return $this->operation == $this->labels['Copy'] && $this->copy_enabled(); } + function delete_operation() { return $this->operation == $this->labels['Delete'] && $this->delete_enabled(); } + function view_operation() { return $this->operation == $this->labels['View'] && $this->view_enabled(); } + function filter_operation() { return $this->fl && $this->filter_enabled() && $this->list_operation(); } + function list_operation() { /* covers also filtering page */ return ! $this->change_operation() + && ! $this->add_operation() && ! $this->copy_operation() + && ! $this->delete_operation() && ! $this->view_operation(); } + function next_operation() { return ($this->navop == $this->labels['Next']) || ($this->navop == '>'); } + function prev_operation() { return ($this->navop == $this->labels['Prev']) || ($this->navop == '<'); } + function first_operation() { return ($this->navop == $this->labels['First']) || ($this->navop == '<<'); } + function last_operation() { return ($this->navop == $this->labels['Last']) || ($this->navop == '>>'); } + function clear_operation() { return $this->sw == $this->labels['Clear']; } + + function add_canceled() { return $this->canceladd == $this->labels['Cancel']; } + function view_canceled() { return $this->cancelview == $this->labels['Cancel']; } + function change_canceled() { return $this->cancelchange == $this->labels['Cancel']; } + function copy_canceled() { return $this->cancelcopy == $this->labels['Cancel']; } + function delete_canceled() { return $this->canceldelete == $this->labels['Cancel']; } + + function is_values2($k, $val = 'X') /* {{{ */ + { + return $val === null || + (isset($this->fdd[$k]['values2']) && !isset($this->fdd[$k]['values']['table'])); + } /* }}} */ + + function processed($k) /* {{{ */ + { + if ($this->virtual($k)) { + return false; + } + $options = @$this->fdd[$k]['options']; + if (! isset($options)) { + return true; + } + return + ($this->saveadd == $this->labels['Save'] && stristr($options, 'A')) || + ($this->moreadd == $this->labels['More'] && stristr($options, 'A')) || + ($this->savechange == $this->labels['Save'] && stristr($options, 'C')) || + ($this->morechange == $this->labels['Apply'] && stristr($options, 'C')) || + ($this->savecopy == $this->labels['Save'] && stristr($options, 'P')) || + ($this->savedelete == $this->labels['Save'] && stristr($options, 'D')); + } /* }}} */ + + function displayed($k) /* {{{ */ + { + if (is_numeric($k)) { + $k = $this->fds[$k]; + } + $options = @$this->fdd[$k]['options']; + if (! isset($options)) { + return true; + } + return + ($this->add_operation() && stristr($options, 'A')) || + ($this->view_operation() && stristr($options, 'V')) || + ($this->change_operation() && stristr($options, 'C')) || + ($this->copy_operation() && stristr($options, 'P')) || + ($this->delete_operation() && stristr($options, 'D')) || + ($this->filter_operation() && stristr($options, 'F')) || + ($this->list_operation() && stristr($options, 'L')); + } /* }}} */ + + function debug_var($name, $val) /* {{{ */ + { + if (is_array($val) || is_object($val)) { + echo "
$name\n";
+			ob_start();
+			//print_r($val);
+			var_dump($val);
+			$content = ob_get_contents();
+			ob_end_clean();
+			echo htmlspecialchars($content);
+			echo "
\n"; + } else { + echo 'debug_var()::',htmlspecialchars($name),''; + echo '::',htmlspecialchars($val),'::',"
\n"; + } + } /* }}} */ + + /* + * sql functions + */ + function sql_connect() /* {{{ */ + { + $this->dbh = @ini_get('allow_persistent') + ? @mysql_pconnect($this->hn, $this->un, $this->pw) + : @mysql_connect($this->hn, $this->un, $this->pw); + } /* }}} */ + + + function sql_disconnect() /* {{{ */ + { + if ($this->close_dbh) { + @mysql_close($this->dbh); + $this->dbh = null; + } + } /* }}} */ + + function sql_fetch(&$res, $type = 'a') /* {{{ */ + { + if($type == 'n') $type = MYSQL_NUM; + else $type = MYSQL_ASSOC; + return @mysql_fetch_array($res, $type); + } /* }}} */ + + function sql_free_result(&$res) /* {{{ */ + { + return @mysql_free_result($res); + } /* }}} */ + + function sql_affected_rows(&$dbh) /* {{{ */ + { + return @mysql_affected_rows($dbh); + } /* }}} */ + + function sql_field_len(&$res,$field) /* {{{ */ + { + return @mysql_field_len($res, $field); + } /* }}} */ + + function sql_insert_id() /* {{{ */ + { + return mysql_insert_id($this->dbh); + } /* }}} */ + + function sql_limit($start, $more) /* {{{ */ + { + return ' LIMIT '.$start.', '.$more.' '; + } /* }}} */ + + function sql_delimiter() /* {{{ */ + { + $this->sd = '`'; $this->ed='`'; + return $this->sd; + } /* }}} */ + + + function myquery($qry, $line = 0, $debug = 0) /* {{{ */ + { + global $debug_query; + if ($debug_query || $debug) { + $line = intval($line); + echo '

MySQL query at line ',$line,'

',htmlspecialchars($qry),'
',"\n"; + } + if (isset($this->db)) { + $ret = @mysql_db_query($this->db, $qry, $this->dbh); + } else { + $ret = @mysql_query($qry, $this->dbh); + } + if (! $ret) { + echo '

MySQL error ',mysql_errno($this->dbh),'

'; + echo htmlspecialchars(mysql_error($this->dbh)),'
',"\n"; + } + return $ret; + } /* }}} */ + + /* end of sql functions */ + + function make_language_labels($language) /* {{{ */ + { + // just try the first language and variant + // this isn't content-negotiation rfc compliant + $language = strtoupper($language); + + // try the full language w/ variant + $file = $this->dir['lang'].'PME.lang.'.$language.'.inc'; + while (! file_exists($file)) { + $pos = strrpos($language, '-'); + if ($pos === false) { + $file = $this->dir['lang'].'PME.lang.EN.inc'; + break; + } + $language = substr($language, 0, $pos); + $file = $this->dir['lang'].'PME.lang.'.$language.'.inc'; + } + $ret = @include($file); + if (! is_array($ret)) { + return $ret; + } + $small = array( + 'Search' => 'v', + 'Hide' => '^', + 'Clear' => 'X', + 'Query' => htmlspecialchars('>')); + if ((!$this->nav_text_links() && !$this->nav_graphic_links()) + || !isset($ret['Search']) || !isset($ret['Query']) + || !isset($ret['Hide']) || !isset($ret['Clear'])) { + foreach ($small as $key => $val) { + $ret[$key] = $val; + } + } + return $ret; + } /* }}} */ + + function set_values($field_num, $prepend = null, $append = null, $strict = false) /* {{{ */ + { + return (array) $prepend + (array) $this->fdd[$field_num]['values2'] + + (isset($this->fdd[$field_num]['values']['table']) || $strict + ? $this->set_values_from_table($field_num, $strict) + : array()) + + (array) $append; + } /* }}} */ + + function set_values_from_table($field_num, $strict = false) /* {{{ */ + { + $db = &$this->fdd[$field_num]['values']['db']; + $table = $this->sd.$this->fdd[$field_num]['values']['table'].$this->ed; + $key = &$this->fdd[$field_num]['values']['column']; + $desc = &$this->fdd[$field_num]['values']['description']; + $dbp = isset($db) ? $this->sd.$db.$this->ed.'.' : $this->dbp; + $qparts['type'] = 'select'; + if ($table != $this->sd.$this->ed) { + $qparts['select'] = 'DISTINCT '.$table.'.'.$this->sd.$key.$this->ed; + if ($desc && is_array($desc) && is_array($desc['columns'])) { + $qparts['select'] .= ',CONCAT('; // ) + $num_cols = sizeof($desc['columns']); + if (isset($desc['divs'][-1])) { + $qparts['select'] .= '"'.addslashes($desc['divs'][-1]).'",'; + } + foreach ($desc['columns'] as $key => $val) { + if ($val) { + $qparts['select'] .= 'IFNULL(CAST('.$this->sd.$val.$this->ed.' AS CHAR),"")'; + if ($desc['divs'][$key]) { + $qparts['select'] .= ',"'.addslashes($desc['divs'][$key]).'"'; + } + $qparts['select'] .= ','; + } + } + $qparts['select']{strlen($qparts['select']) - 1} = ')'; + $qparts['select'] .= ' AS '.$this->sd.'PMEalias'.$field_num.$this->ed; + $qparts['orderby'] = $this->sd.'PMEalias'.$field_num.$this->ed; + } else if ($desc && is_array($desc)) { + // TODO + } else if ($desc) { + $qparts['select'] .= ','.$table.'.'.$this->sd.$desc.$this->ed; + $qparts['orderby'] = $this->sd.$desc.$this->ed; + } else if ($key) { + $qparts['orderby'] = $this->sd.$key.$this->ed; + } + $qparts['from'] = $dbp.$table; + $ar = array( + 'table' => $table, + 'column' => $column, + 'description' => $desc); + $qparts['where'] = $this->substituteVars($this->fdd[$field_num]['values']['filters'], $ar); + if ($this->fdd[$field_num]['values']['orderby']) { + $qparts['orderby'] = $this->substituteVars($this->fdd[$field_num]['values']['orderby'], $ar); + } + } else { /* simple value extraction */ + $key = &$this->fds[$field_num]; + $this->virtual($field_num) && $key = $this->fqn($field_num); + $qparts['select'] = 'DISTINCT '.$this->sd.$key.$this->ed.' AS PMEkey'; + $qparts['orderby'] = 'PMEkey'; + $qparts['from'] = $this->dbp.$this->sd.$this->tb.$this->ed; + } + $values = array(); + $res = $this->myquery($this->get_SQL_query($qparts), __LINE__); + while ($row = $this->sql_fetch($res, 'n')) { + $values[$row[0]] = $desc ? $row[1] : $row[0]; + } + return $values; + } /* }}} */ + + function fqn($field, $dont_desc = false, $dont_cols = false) /* {{{ */ + { + is_numeric($field) || $field = array_search($field, $this->fds); + // if read SQL expression exists use it + if ($this->col_has_sql($field) && !$this->col_has_values($field)) + return $this->fdd[$field]['sql']; + // on copy/change always use simple key retrieving + if ($this->add_operation() + || $this->copy_operation() + || $this->change_operation()) { + $ret = $this->sd.'PMEtable0'.$this->ed.'.'.$this->sd.$this->fds[$field].$this->ed; + } else { + if ($this->fdd[$this->fds[$field]]['values']['description'] && ! $dont_desc) { + $desc = &$this->fdd[$this->fds[$field]]['values']['description']; + if (is_array($desc) && is_array($desc['columns'])) { + $ret = 'CONCAT('; // ) + $num_cols = sizeof($desc['columns']); + if (isset($desc['divs'][-1])) { + $ret .= '"'.addslashes($desc['divs'][-1]).'",'; + } + foreach ($desc['columns'] as $key => $val) { + if ($val) { + $ret .= 'IFNULL(CAST('.$this->sd.'PMEjoin'.$field.$this->ed.'.'.$this->sd.$val.$this->ed.' AS CHAR),"")'; + if ($desc['divs'][$key]) { + $ret .= ',"'.addslashes($desc['divs'][$key]).'"'; + } + $ret .= ','; + } + } + $ret{strlen($ret) - 1} = ')'; + } else if (is_array($desc)) { + // TODO + } else { + $ret = $this->sd.'PMEjoin'.$field.$this->ed.'.'.$this->sd.$this->fdd[$this->fds[$field]]['values']['description'].$this->ed; + } + // TODO: remove me + } elseif (0 && $this->fdd[$this->fds[$field]]['values']['column'] && ! $dont_cols) { + $ret = $this->sd.'PMEjoin'.$field.$this->ed.'.'.$this->fdd[$this->fds[$field]]['values']['column']; + } else { + $ret = $this->sd.'PMEtable0'.$this->ed.'.'.$this->sd.$this->fds[$field].$this->ed; + } + // TODO: not neccessary, remove me! + if (is_array($this->fdd[$this->fds[$field]]['values2'])) { + } + } + return $ret; + } /* }}} */ + + function get_SQL_main_list_query($qparts) /* {{{ */ + { + return $this->get_SQL_query($qparts); + } /* }}} */ + + + + function get_SQL_query($parts) /* {{{ */ + { + foreach ($parts as $k => $v) { + $parts[$k] = trim($parts[$k]); + } + switch ($parts['type']) { + case 'select': + $ret = 'SELECT '; + if ($parts['DISTINCT']) + $ret .= 'DISTINCT '; + $ret .= $parts['select']; + $ret .= ' FROM '.$parts['from']; + if ($parts['where'] != '') + $ret .= ' WHERE '.$parts['where']; + if ($parts['groupby'] != '') + $ret .= ' GROUP BY '.$parts['groupby']; + if ($parts['having'] != '') + $ret .= ' HAVING '.$parts['having']; + if ($parts['orderby'] != '') + $ret .= ' ORDER BY '.$parts['orderby']; + if ($parts['limit'] != '') + $ret .= ' '.$parts['limit']; + if ($parts['procedure'] != '') + $ret .= ' PROCEDURE '.$parts['procedure']; + break; + case 'update': + $ret = 'UPDATE '.$parts['table']; + $ret .= ' SET '.$parts['fields']; + if ($parts['where'] != '') + $ret .= ' WHERE '.$parts['where']; + break; + case 'insert': + $ret = 'INSERT INTO '.$parts['table']; + $ret .= ' VALUES '.$parts['values']; + break; + case 'delete': + $ret = 'DELETE FROM '.$parts['table']; + if ($parts['where'] != '') + $ret .= ' WHERE '.$parts['where']; + break; + default: + die('unknown query type'); + break; + } + return $ret; + } /* }}} */ + + function get_SQL_column_list() /* {{{ */ + { + $fields = array(); + for ($k = 0; $k < $this->num_fds; $k++) { + if (! $this->displayed[$k] && $k != $this->key_num) { + continue; + } + $fields[] = $this->fqn($k).' AS '.$this->sd.'qf'.$k.$this->ed; // no delimiters here, or maybe some yes + if ($this->col_has_values($k)) { + if($this->col_has_sql($k)) $fields[] = $this->fdd[$k]['sql'].' AS '.$this->sd.'qf'.$k.'_idx'.$this->ed; + else $fields[] = $this->fqn($k, true, true).' AS '.$this->sd.'qf'.$k.'_idx'.$this->ed; + } + if ($this->col_has_datemask($k)) { + $fields[] = 'UNIX_TIMESTAMP('.$this->fqn($k).') AS '.$this->sd.'qf'.$k.'_timestamp'.$this->ed; + } + } + return join(',', $fields); + } /* }}} */ + + function get_SQL_join_clause() /* {{{ */ + { + $main_table = $this->sd.'PMEtable0'.$this->ed; + $join_clause = $this->sd.$this->tb.$this->ed." AS $main_table"; + for ($k = 0, $numfds = sizeof($this->fds); $k < $numfds; $k++) { + $main_column = $this->fds[$k]; + if($this->fdd[$main_column]['values']['db']) { + $dbp = $this->sd.$this->fdd[$main_column]['values']['db'].$this->ed.'.'; + } else { + //$dbp = $this->dbp; + } + $table = $this->sd.$this->fdd[$main_column]['values']['table'].$this->ed; + $join_column = $this->sd.$this->fdd[$main_column]['values']['column'].$this->ed; + $join_desc = $this->sd.$this->fdd[$main_column]['values']['description'].$this->ed; + if ($join_desc != $this->sd.$this->ed && $join_column != $this->sd.$this->ed) { + $join_table = $this->sd.'PMEjoin'.$k.$this->ed; + $ar = array( + 'main_table' => $main_table, + 'main_column' => $this->sd.$main_column.$this->ed, + 'join_table' => $join_table, + 'join_column' => $join_column, + 'join_description' => $join_desc); + $join_clause .= " LEFT OUTER JOIN $dbp".$table." AS $join_table ON ("; + $join_clause .= isset($this->fdd[$main_column]['values']['join']) + ? $this->substituteVars($this->fdd[$main_column]['values']['join'], $ar) + : "$join_table.$join_column = $main_table.".$this->sd.$main_column.$this->ed; + $join_clause .= ')'; + } + } + return $join_clause; + } /* }}} */ + + function get_SQL_where_from_query_opts($qp = null, $text = 0) /* {{{ */ + { + if ($qp == null) { + $qp = $this->query_opts; + } + $where = array(); + foreach ($qp as $field => $ov) { + if (is_numeric($field)) { + $tmp_where = array(); + foreach ($ov as $field2 => $ov2) { + $tmp_where[] = sprintf('%s %s %s', $field2, $ov2['oper'], $ov2['value']); + } + $where[] = '('.join(' OR ', $tmp_where).')'; + } else { + if (is_array($ov['value'])) { + $tmp_ov_val = ''; + foreach ($ov['value'] as $ov_val) { + strlen($tmp_ov_val) > 0 && $tmp_ov_val .= ' OR '; + $tmp_ov_val .= sprintf('FIND_IN_SET("%s",%s)', $ov_val, $field); + } + $where[] = "($tmp_ov_val)"; + } else { + $where[] = sprintf('%s %s %s', $field, $ov['oper'], $ov['value']); + } + } + } + // Add any coder specified filters + if (! $text && $this->filters) { + $where[] = '('.$this->filters.')'; + } + if (count($where) > 0) { + if ($text) { + return str_replace('%', '*', join(' AND ',$where)); + } else { + return join(' AND ',$where); + } + } + return ''; /* empty string */ + } /* }}} */ + + function gather_query_opts() /* {{{ */ + { + $this->query_opts = array(); + $this->prev_qfn = $this->qfn; + $this->qfn = ''; + if ($this->clear_operation()) { + return; + } + // gathers query options into an array, $this->query_opts + $qo = array(); + for ($k = 0; $k < $this->num_fds; $k++) { + $l = 'qf'.$k; + $lc = 'qf'.$k.'_comp'; + $li = 'qf'.$k.'_id'; + $m = $this->get_sys_cgi_var($l); + $mc = $this->get_sys_cgi_var($lc); + $mi = $this->get_sys_cgi_var($li); + if (! isset($m) && ! isset($mi)) { + continue; + } + if (is_array($m) || is_array($mi)) { + if (is_array($mi)) { + $m = $mi; + $l = $li; + } + if (in_array('*', $m)) { + continue; + } + if ($this->col_has_values($k) && $this->col_has_multiple($k)) { + foreach (array_keys($m) as $key) { + $m[$key] = addslashes($m[$key]); + } + $qo[$this->fqn($k)] = array('value' => $m); + } else { + $qf_op = ''; + foreach (array_keys($m) as $key) { + if ($qf_op == '') { + $qf_op = 'IN'; + $qf_val = '"'.addslashes($m[$key]).'"'; + $afilter = ' IN ("'.addslashes($m[$key]).'"'; // ) + } else { + $afilter = $afilter.',"'.addslashes($m[$key]).'"'; + $qf_val .= ',"'.addslashes($m[$key]).'"'; + } + $this->qfn .= '&'.$this->cgi['prefix']['sys'].$l.'['.rawurlencode($key).']='.rawurlencode($m[$key]); + } + $afilter = $afilter.')'; + // XXX: $dont_desc and $dont_cols hack + $dont_desc = isset($this->fdd[$k]['values']['description']); + $dont_cols = isset($this->fdd[$k]['values']['column']); + $qo[$this->fqn($k, $dont_desc, $dont_cols)] = + array('oper' => $qf_op, 'value' => "($qf_val)"); // ) + } + } else if (isset($mi)) { + if ($mi == '*') { + continue; + } + if ($this->fdd[$k]['select'] != 'M' && $this->fdd[$k]['select'] != 'D' && $mi == '') { + continue; + } + $afilter = addslashes($mi); + $qo[$this->fqn($k, true, true)] = array('oper' => '=', 'value' => "'$afilter'"); + $this->qfn .= '&'.$this->cgi['prefix']['sys'].$li.'='.rawurlencode($mi); + } else if (isset($m)) { + if ($m == '*') { + continue; + } + if ($this->fdd[$k]['select'] != 'M' && $this->fdd[$k]['select'] != 'D' && $m == '') { + continue; + } + $afilter = addslashes($m); + if ($this->fdd[$k]['select'] == 'N') { + $mc = in_array($mc, $this->comp_ops) ? $mc : '='; + $qo[$this->fqn($k)] = array('oper' => $mc, 'value' => "'$afilter'"); + $this->qfn .= '&'.$this->cgi['prefix']['sys'].$l .'='.rawurlencode($m); + $this->qfn .= '&'.$this->cgi['prefix']['sys'].$lc.'='.rawurlencode($mc); + } else { + $afilter = '%'.str_replace('*', '%', $afilter).'%'; + $ids = array(); + $ar = array(); + $ar[$this->fqn($k)] = array('oper' => 'LIKE', 'value' => "'$afilter'"); + if (is_array($this->fdd[$k]['values2'])) { + foreach ($this->fdd[$k]['values2'] as $key => $val) { + if (strlen($m) > 0 && stristr($val, $m)) { + $ids[] = '"'.addslashes($key).'"'; + } + } + if (count($ids) > 0) { + $ar[$this->fqn($k, true, true)] + = array('oper' => 'IN', 'value' => '('.join(',', $ids).')'); + } + } + $qo[] = $ar; + $this->qfn .= '&'.$this->cgi['prefix']['sys'].$l.'='.rawurlencode($m); + } + } + } + $this->query_opts = $qo; + } /* }}} */ + + /* + * Create JavaScripts + */ + + function form_begin() /* {{{ */ + { + $page_name = htmlspecialchars($this->page_name); + if ($this->add_operation() || $this->change_operation() || $this->copy_operation() + || $this->view_operation() || $this->delete_operation()) { + $field_to_tab = array(); + for ($tab = $k = $this->cur_tab = 0; $k < $this->num_fds; $k++) { + if (isset($this->fdd[$k]['tab'])) { + if ($tab == 0 && $k > 0) { + $this->tabs[0] = 'PMEtab0'; + $this->cur_tab = 1; + $tab++; + } + if (is_array($this->fdd[$k]['tab'])) { + $this->tabs[$tab] = @$this->fdd[$k]['tab']['name']; + $this->fdd[$k]['tab']['default'] && $this->cur_tab = $tab; + } else { + $this->tabs[$tab] = @$this->fdd[$k]['tab']; + } + $tab++; + } + $field_to_tab[$k] = max(0, $tab - 1); + } + if (preg_match('/^'.$this->dhtml['prefix'].'tab(\d+)$/', $this->get_sys_cgi_var('cur_tab'), $parts)) { + $this->cur_tab = $parts[1]; + } + if ($this->tabs_enabled()) { + // initial TAB styles + echo '',"\n"; + // TAB javascripts + echo '', "\n"; + } + } + + if ($this->add_operation() || $this->change_operation() || $this->copy_operation()) { + $first_required = true; + for ($k = 0; $k < $this->num_fds; $k++) { + if ($this->displayed[$k] && ! $this->readonly($k) && ! $this->hidden($k) + && ($this->fdd[$k]['js']['required'] || isset($this->fdd[$k]['js']['regexp']))) { + if ($first_required) { + $first_required = false; + echo '', "\n"; + } + } + + if ($this->filter_operation()) { + echo '', "\n"; + } + + if ($this->display['form']) { + echo '
',"\n"; + } + return true; + } /* }}} */ + + function form_end() /* {{{ */ + { + if ($this->display['form']) { + echo '
',"\n"; + } + } /* }}} */ + + function display_tab_labels($position) /* {{{ */ + { + if (! is_array($this->tabs)) { + return false; + } + echo '',"\n"; + echo '',"\n"; + for ($i = ($this->tabs[0] == 'PMEtab0' ? 1 : 0); $i < count($this->tabs); $i++) { + $css_class_name = $this->getCSSclass($i != $this->cur_tab ? 'tab' : 'tab-selected', $position); + echo '',"\n"; + } + echo '',"\n"; + echo '',"\n"; + echo '
'; + echo ''; + echo $this->tabs[$i],' 
',"\n"; + } /* }}} */ + + /* + * Display functions + */ + + function display_add_record() /* {{{ */ + { + for ($tab = 0, $k = 0; $k < $this->num_fds; $k++) { + if (isset($this->fdd[$k]['tab']) && $this->tabs_enabled() && $k > 0) { + $tab++; + echo '',"\n"; + echo '
',"\n"; + echo '
',"\n"; + echo '',"\n"; + } + if (! $this->displayed[$k]) { + continue; + } + if ($this->hidden($k)) { + echo $this->htmlHiddenData($this->fds[$k], $this->fdd[$k]['default']); + continue; + } + $css_postfix = @$this->fdd[$k]['css']['postfix']; + $css_class_name = $this->getCSSclass('input', null, 'next', $css_postfix); + $escape = isset($this->fdd[$k]['escape']) ? $this->fdd[$k]['escape'] : true; + echo '',"\n"; + echo '',"\n"; + echo '',"\n"; + if ($this->guidance) { + $css_class_name = $this->getCSSclass('help', null, true, $css_postfix); + $cell_value = $this->fdd[$k]['help'] ? $this->fdd[$k]['help'] : ' '; + echo '',"\n"; + } + echo '',"\n"; + } + } /* }}} */ + + function display_copy_change_delete_record() /* {{{ */ + { + /* + * For delete or change: SQL SELECT to retrieve the selected record + */ + + $qparts['type'] = 'select'; + $qparts['select'] = $this->get_SQL_column_list(); + $qparts['from'] = $this->get_SQL_join_clause(); + $qparts['where'] = '('.$this->fqn($this->key).'=' + .$this->key_delim.$this->rec.$this->key_delim.')'; + + $res = $this->myquery($this->get_SQL_query($qparts),__LINE__); + if (! ($row = $this->sql_fetch($res))) { + return false; + } + for ($tab = 0, $k = 0; $k < $this->num_fds; $k++) { + if (isset($this->fdd[$k]['tab']) && $this->tabs_enabled() && $k > 0) { + $tab++; + echo '
'; + echo $this->fdd[$k]['name'],'getColAttributes($k),">\n"; + if ($this->col_has_values($k)) { + $vals = $this->set_values($k); + $selected = @$this->fdd[$k]['default']; + $multiple = $this->col_has_multiple($k); + $readonly = $this->readonly($k); + $strip_tags = true; + //$escape = true; + if ($this->col_has_checkboxes($k) || $this->col_has_radio_buttons($k)) { + echo $this->htmlRadioCheck($this->cgi['prefix']['data'].$this->fds[$k], + $css_class_name, $vals, $selected, $multiple, $readonly, + $strip_tags, $escape); + } else { + echo $this->htmlSelect($this->cgi['prefix']['data'].$this->fds[$k], + $css_class_name, $vals, $selected, $multiple, $readonly, + $strip_tags, $escape); + } + } elseif (isset ($this->fdd[$k]['textarea'])) { + echo '',"\n"; + } elseif ($this->col_has_php($k)) { + echo include($this->fdd[$k]['php']); + } else { + // Simple edit box required + $len_props = ''; + $maxlen = intval($this->fdd[$k]['maxlen']); + $size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size'] : min($maxlen, 60); + if ($size > 0) { + $len_props .= ' size="'.$size.'"'; + } + if ($maxlen > 0) { + $len_props .= ' maxlength="'.$maxlen.'"'; + } + echo 'password($k) ? 'type="password"' : 'type="text"'); + echo ($this->readonly($k) ? ' disabled' : ''); + echo ' name="',$this->cgi['prefix']['data'].$this->fds[$k],'"'; + echo $len_props,' value="'; + if($escape) echo htmlspecialchars($this->fdd[$k]['default']); + else echo $this->fdd[$k]['default']; + echo '" />'; + } + echo '',$cell_value,'
',"\n"; + echo '
',"\n"; + echo '
',"\n"; + echo '',"\n"; + } + if (! $this->displayed[$k]) { + continue; + } + if ($this->copy_operation() || $this->change_operation()) { + if ($this->hidden($k)) { + if ($k != $this->key_num) { + echo $this->htmlHiddenData($this->fds[$k], $row["qf$k"]); + } + continue; + } + $css_postfix = @$this->fdd[$k]['css']['postfix']; + echo '',"\n"; + echo '',"\n"; + /* There are two possibilities of readonly fields handling: + 1. Display plain text for readonly timestamps, dates and URLs. + 2. Display disabled input field + In all cases particular readonly field will NOT be saved. */ + if ($this->readonly($k) && ($this->col_has_datemask($k) || $this->col_has_URL($k))) { + echo $this->display_delete_field($row, $k); + } elseif ($this->password($k)) { + echo $this->display_password_field($row, $k); + } else { + echo $this->display_change_field($row, $k); + } + if ($this->guidance) { + $css_class_name = $this->getCSSclass('help', null, true, $css_postfix); + $cell_value = $this->fdd[$k]['help'] ? $this->fdd[$k]['help'] : ' '; + echo '',"\n"; + } + echo '',"\n"; + } elseif ($this->delete_operation() || $this->view_operation()) { + $css_postfix = @$this->fdd[$k]['css']['postfix']; + echo '',"\n"; + echo '',"\n"; + if ($this->password($k)) { + echo '',"\n"; + } else { + $this->display_delete_field($row, $k); + } + if ($this->guidance) { + $css_class_name = $this->getCSSclass('help', null, true, $css_postfix); + $cell_value = $this->fdd[$k]['help'] ? $this->fdd[$k]['help'] : ' '; + echo '',"\n"; + } + echo '',"\n"; + } + } + } /* }}} */ + + function display_change_field($row, $k) /* {{{ */ + { + $css_postfix = @$this->fdd[$k]['css']['postfix']; + $css_class_name = $this->getCSSclass('input', null, true, $css_postfix); + $escape = isset($this->fdd[$k]['escape']) ? $this->fdd[$k]['escape'] : true; + echo '',"\n"; + } /* }}} */ + + function display_password_field($row, $k) /* {{{ */ + { + $css_postfix = @$this->fdd[$k]['css']['postfix']; + echo '',"\n"; + } /* }}} */ + + function display_delete_field($row, $k) /* {{{ */ + { + $css_postfix = @$this->fdd[$k]['css']['postfix']; + $css_class_name = $this->getCSSclass('value', null, true, $css_postfix); + echo '',"\n"; + } /* }}} */ + + /** + * Returns CSS class name + */ + function getCSSclass($name, $position = null, $divider = null, $postfix = null) /* {{{ */ + { + static $div_idx = -1; + $elements = array($this->css['prefix'], $name); + if ($this->page_type && $this->css['page_type']) { + if ($this->page_type != 'L' && $this->page_type != 'F') { + $elements[] = $this->page_types[$this->page_type]; + } + } + if ($position && $this->css['position']) { + $elements[] = $position; + } + if ($divider && $this->css['divider']) { + if ($divider === 'next') { + $div_idx++; + if ($this->css['divider'] > 0 && $div_idx >= $this->css['divider']) { + $div_idx = 0; + } + } + $elements[] = $div_idx; + } + if ($postfix) { + $elements[] = $postfix; + } + return join($this->css['separator'], $elements); + } /* }}} */ + + /** + * Returns field cell HTML attributes + */ + function getColAttributes($k) /* {{{ */ + { + $colattrs = ''; + if (isset($this->fdd[$k]['colattrs'])) { + $colattrs .= ' '; + $colattrs .= trim($this->fdd[$k]['colattrs']); + } + if (isset($this->fdd[$k]['nowrap'])) { + $colattrs .= ' nowrap'; + } + return $colattrs; + } /* }}} */ + + /** + * Substitutes variables in string + * (this is very simple but secure eval() replacement) + */ + function substituteVars($str, $subst_ar) /* {{{ */ + { + $array = preg_split('/(\\$\w+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE); + $count = count($array); + for ($i = 1; $i < $count; $i += 2) { + $key = substr($array[$i], 1); + if (isset($subst_ar[$key])) { + $array[$i] = $subst_ar[$key]; + } + } + return join('', $array); + } /* }}} */ + + /** + * Print URL + */ + function urlDisplay($k, $link_val, $disp_val, $css, $key) /* {{{ */ + { + $escape = isset($this->fdd[$k]['escape']) ? $this->fdd[$k]['escape'] : true; + $ret = ''; + $name = $this->fds[$k]; + $page = $this->page_name; + $url = $this->cgi['prefix']['sys'].'rec'.'='.$key.'&'.$this->cgi['prefix']['sys'].'fm' + .'='.$this->fm.'&'.$this->cgi['prefix']['sys'].'fl'.'='.$this->fl; + $url .= '&'.$this->cgi['prefix']['sys'].'qfn'.'='.rawurlencode($this->qfn).$this->qfn; + $url .= '&'.$this->get_sfn_cgi_vars().$this->cgi['persist']; + $ar = array( + 'key' => $key, + 'name' => $name, + 'link' => $link_val, + 'value' => $disp_val, + 'css' => $css, + 'page' => $page, + 'url' => $url + ); + $urllink = isset($this->fdd[$k]['URL']) + ? $this->substituteVars($this->fdd[$k]['URL'], $ar) + : $link_val; + $urldisp = isset($this->fdd[$k]['URLdisp']) + ? $this->substituteVars($this->fdd[$k]['URLdisp'], $ar) + : $disp_val; + $target = isset($this->fdd[$k]['URLtarget']) + ? 'target="'.htmlspecialchars($this->fdd[$k]['URLtarget']).'" ' + : ''; + $prefix_found = false; + $postfix_found = false; + $prefix_ar = @$this->fdd[$k]['URLprefix']; + $postfix_ar = @$this->fdd[$k]['URLpostfix']; + is_array($prefix_ar) || $prefix_ar = array($prefix_ar); + is_array($postfix_ar) || $postfix_ar = array($postfix_ar); + foreach ($prefix_ar as $prefix) { + if (! strncmp($prefix, $urllink, strlen($prefix))) { + $prefix_found = true; + break; + } + } + foreach ($postfix_ar as $postfix) { + if (! strncmp($postfix, $urllink, strlen($postfix))) { + $postfix_found = true; + break; + } + } + $prefix_found || $urllink = array_shift($prefix_ar).$urllink; + $postfix_found || $urllink = $urllink.array_shift($postfix_ar); + if (strlen($urllink) <= 0 || strlen($urldisp) <= 0) { + $ret = ' '; + } else { + if ($escape) { + $urldisp = htmlspecialchars($urldisp); + } + $urllink = htmlspecialchars($urllink); + $ret = ''.$urldisp.''; + } + return $ret; + } /* }}} */ + + function cellDisplay($k, $row, $css) /* {{{ */ + { + $escape = isset($this->fdd[$k]['escape']) ? $this->fdd[$k]['escape'] : true; + $key_rec = $row['qf'.$this->key_num]; + if (@$this->fdd[$k]['datemask']) { + $value = intval($row["qf$k".'_timestamp']); + $value = $value ? @date($this->fdd[$k]['datemask'], $value) : ''; + } else if (@$this->fdd[$k]['strftimemask']) { + $value = intval($row["qf$k".'_timestamp']); + $value = $value ? @strftime($this->fdd[$k]['strftimemask'], $value) : ''; + } else if ($this->is_values2($k, $row["qf$k"])) { + $value = $row['qf'.$k.'_idx']; + if ($this->fdd[$k]['select'] == 'M') { + $value_ar = explode(',', $value); + $value_ar2 = array(); + foreach ($value_ar as $value_key) { + if (isset($this->fdd[$k]['values2'][$value_key])) { + $value_ar2[$value_key] = $this->fdd[$k]['values2'][$value_key]; + $escape = false; + } + } + $value = join(', ', $value_ar2); + } else { + if (isset($this->fdd[$k]['values2'][$value])) { + $value = $this->fdd[$k]['values2'][$value]; + $escape = false; + } + } + } elseif (isset($this->fdd[$k]['values2'][$row["qf$k"]])) { + $value = $this->fdd[$k]['values2'][$row["qf$k"]]; + } else { + $value = $row["qf$k"]; + } + $original_value = $value; + if (@$this->fdd[$k]['strip_tags']) { + $value = strip_tags($value); + } + if ($num_ar = @$this->fdd[$k]['number_format']) { + if (! is_array($num_ar)) { + $num_ar = array($num_ar); + } + if (count($num_ar) == 1) { + list($nbDec) = $num_ar; + $value = number_format($value, $nbDec); + } else if (count($num_ar) == 3) { + list($nbDec, $decPoint, $thSep) = $num_ar; + $value = number_format($value, $nbDec, $decPoint, $thSep); + } + } + if (intval($this->fdd[$k]['trimlen']) > 0 && strlen($value) > $this->fdd[$k]['trimlen']) { + $value = ereg_replace("[\r\n\t ]+",' ',$value); + $value = substr($value, 0, $this->fdd[$k]['trimlen'] - 3).'...'; + } + if (@$this->fdd[$k]['mask']) { + $value = sprintf($this->fdd[$k]['mask'], $value); + } + if ($this->col_has_php($k)) { + return include($this->fdd[$k]['php']); + } + if ($this->col_has_URL($k)) { + return $this->urlDisplay($k, $original_value, $value, $css, $key_rec); + } + if (strlen($value) <= 0) { + return ' '; + } + if ($escape) { + $value = htmlspecialchars($value); + } + return nl2br($value); + } /* }}} */ + + /** + * Creates HTML submit input element + * + * @param name element name + * @param label key in the language hash used as label + * @param css_class_name CSS class name + * @param js_validation if add JavaScript validation subroutine to button + * @param disabled if mark the button as disabled + * @param js any extra text in tags + */ + function htmlSubmit($name, $label, $css_class_name, $js_validation = true, $disabled = false, $js = NULL) /* {{{ */ + { + // Note that isn't valid HTML, but most browsers support it + if($disabled == -1) return; + $markdisabled = $disabled ? ' disabled' : ''; + $ret = '
'; + echo $this->fdd[$k]['name'],'',$cell_value,'
'; + echo $this->fdd[$k]['name'],'getColAttributes($k),'>',$this->labels['hidden'],'',$cell_value,'
getColAttributes($k),">\n"; + if ($this->col_has_values($k)) { + $vals = $this->set_values($k); + $multiple = $this->col_has_multiple($k); + $readonly = $this->readonly($k); + $strip_tags = true; + //$escape = true; + if ($this->col_has_checkboxes($k) || $this->col_has_radio_buttons($k)) { + echo $this->htmlRadioCheck($this->cgi['prefix']['data'].$this->fds[$k], + $css_class_name, $vals, $row["qf$k"], $multiple, $readonly, + $strip_tags, $escape); + } else { + echo $this->htmlSelect($this->cgi['prefix']['data'].$this->fds[$k], + $css_class_name, $vals, $row["qf$k"], $multiple, $readonly, + $strip_tags, $escape); + } + } elseif (isset($this->fdd[$k]['textarea'])) { + echo '',"\n"; + } elseif ($this->col_has_php($k)) { + echo include($this->fdd[$k]['php']); + } else { + $len_props = ''; + $maxlen = intval($this->fdd[$k]['maxlen']); + $size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size'] : min($maxlen, 60); + if ($size > 0) { + $len_props .= ' size="'.$size.'"'; + } + if ($maxlen > 0) { + $len_props .= ' maxlength="'.$maxlen.'"'; + } + echo 'readonly($k) ? ' disabled' : ''); + echo ' name="',$this->cgi['prefix']['data'].$this->fds[$k],'" value="'; + if($escape) echo htmlspecialchars($row["qf$k"]); + else echo $row["qf$k"]; + echo '"',$len_props,' />',"\n"; + } + echo 'getColAttributes($k),">\n"; + $len_props = ''; + $maxlen = intval($this->fdd[$k]['maxlen']); + $size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size'] : min($maxlen, 60); + if ($size > 0) { + $len_props .= ' size="'.$size.'"'; + } + if ($maxlen > 0) { + $len_props .= ' maxlength="'.$maxlen.'"'; + } + echo 'readonly($k) ? ' disabled' : ''); + echo ' name="',$this->cgi['prefix']['data'].$this->fds[$k],'" value="'; + echo htmlspecialchars($row["qf$k"]),'"',$len_props,' />',"\n"; + echo 'getColAttributes($k),">\n"; + echo $this->cellDisplay($k, $row, $css_class_name); + echo '
',"\n"; + echo '',"\n"; + echo '',"\n"; + // Message is now written here + if (strlen(@$this->message) > 0) { + echo '',"\n"; + } + if($this->display['num_pages'] || $this->display['num_records']) + echo ''; + echo '
',"\n"; + echo $but_str,'',$this->message,'',"\n"; + if($this->display['num_pages']) { + if ($listall) { + echo $this->labels['Page'],': 1 ',$this->labels['of'],' 1'; + } else { + $current_page = intval($this->fm / $this->inc) + 1; + $total_pages = max(1, ceil($this->total_recs / abs($this->inc))); + echo $this->labels['Page'],': ',$current_page; + echo ' ',$this->labels['of'],' ',$total_pages; + } + } + if($this->display['num_records']) + echo '  ',$this->labels['Records'],': ',$this->total_recs; + if($this->display['num_pages'] || $this->display['num_records']) echo '
',"\n"; + if($position == 'up') echo '
'."\n"; + } /* }}} */ + + /* + * Display buttons at top and bottom of page + */ + function display_record_buttons($position) /* {{{ */ + { + if (($but_str = $this->display_buttons($position)) === null) + return; + if ($position == 'down') { + if ($this->tabs_enabled()) $this->display_tab_labels('down'); + echo '
',"\n"; + } + echo '',"\n"; + echo '',"\n"; + echo '',"\n"; + // Message is now written here + //echo '',"\n"; + if (strlen(@$this->message) > 0) { + echo '',"\n"; + } + echo '
',"\n"; + echo $but_str,'',$this->message,'
',"\n"; + if ($position == 'up') { + if ($this->tabs_enabled()) $this->display_tab_labels('up'); + echo '
',"\n"; + } + } /* }}} */ + + function display_buttons($position) /* {{{ */ + { + $nav_fnc = 'nav_'.$position; + if(! $this->$nav_fnc()) + return; + $buttons = (is_array($this->buttons[$this->page_type][$position])) + ? $this->buttons[$this->page_type][$position] + : $this->default_buttons[$this->page_type]; + foreach ($buttons as $name) { + $ret .= $this->display_button($name, $position)."\n"; + } + return $ret; + } /* }}} */ + + function display_button($name, $position = 'up') /* {{{ */ + { + if (is_array($name)) { + if (isset($name['code'])) return $name['code']; + return $this->htmlSubmit($name['name'], $name['value'], $name['css'], $name['js_validation'], $name['disabled'], $name['js']); + } + $disabled = 1; // show disabled by default + if ($name[0] == '+') { $name = substr($name, 1); $disabled = 0; } // always show disabled as enabled + if ($name[0] == '-') { $name = substr($name, 1); $disabled = -1; } // don't show disabled + if ($name == 'cancel') { + return $this->htmlSubmit('cancel'.$this->page_types[$this->page_type], 'Cancel', + $this->getCSSclass('cancel', $position), false); + } + if (in_array($name, array('add','view','change','copy','delete'))) { + $enabled_fnc = $name.'_enabled'; + $enabled = $this->$enabled_fnc(); + if ($name != 'add' && ! $this->total_recs && strstr('LF', $this->page_type)) + $enabled = false; + return $this->htmlSubmit('operation', ucfirst($name), + $this->getCSSclass($name, $position), false, $enabled ? 0 : $disabled); + } + if ($name == 'savedelete') { + $enabled = $this->delete_enabled(); + $js = 'onclick="return confirm(\''.$this->labels['Delete'].' ?\');"'; + return $this->htmlSubmit('savedelete', 'Delete', + $this->getCSSclass('save', $position), false, $enabled ? 0 : $disabled, $js); + } + if (in_array($name, array('save','more'))) { + $validation = true; // if js validation + if ($this->page_type == 'D' && $name == 'save' ) { $value = 'Delete'; $validation = false; } + elseif ($this->page_type == 'C' && $name == 'more' ) { $value = 'Apply'; } + else $value = ucfirst($name); + return $this->htmlSubmit($name.$this->page_types[$this->page_type], $value, + $this->getCSSclass($name, $position), $validation); + } + $listall = $this->inc <= 0; + if ($listall) { + $disabledprev = true; + $disablednext = true; + $total_pages = 1; + $current_page = 1; + } else { + $disabledprev = $this->fm <= 0; + $disablednext = $this->fm + $this->inc >= $this->total_recs; + $total_pages = max(1, ceil($this->total_recs / abs($this->inc))); + $current_page = ceil($this->fm / abs($this->inc)); // must + 1 + } + $disabledfirst = $disabledprev; + $disabledlast = $disablednext; + // some statistics first + if ($name == 'total_pages') return $total_pages; + if ($name == 'current_page') return ($current_page+1); + if ($name == 'total_recs') return ($this->total_recs); + // now some goto buttons/dropdowns/inputs... + if ($name == 'goto_text') { + $ret = 'cgi['prefix']['sys'].'navpn'.$position.'" value="'.($current_page+1).'"'; + $ret .= ' size="'.(strlen($total_pages)+1).'" maxlength="'.(strlen($total_pages)+1).'"'; + // TODO some js here.... on enter submit, on click erase ?... + $ret .=' oneypress="return PE_filter_handler(this.form, event);" />'; + return $ret; + } + if ($name == 'goto_combo') { + $disabledgoto = !($listall || ($disablednext && $disabledprev)) ? '' : ' disabled'; + if ($disablegoto != '' && $disabled < 0) return; + $kv_array = array(); + for ($i = 0; $i < $total_pages; $i++) { + $kv_array[$this->inc * $i] = $i + 1; + } + // TODO: add onchange="return this.form.submit();" DONE ??? + return $this->htmlSelect($this->cgi['prefix']['sys'].ltrim($disabledgoto).'navfm'.$position, + $this->getCSSclass('goto', $position), $kv_array, (string)$this->fm, false, $disabledgoto, + false, true, 'onchange="return this.form.submit();"'); + } + if ($name == 'goto') { + return $this->htmlSubmit('navop', 'Go to', $this->getCSSclass('goto', $position), + false, ($listall || ($disablednext && $disabledprev)) ? $disabled : 0); + } + if (in_array($name, array('first','prev','next','last','<<','<','>','>>'))) { + $disabled_var = 'disabled'.$name; + $name2 = $name; + if (strlen($name) <= 2) { + $nav_values = array('<<' => 'first', '<' => 'prev', '>' => 'next', '>>' => 'last'); + $disabled_var = 'disabled'.$nav_values[$name]; + $name2 = $nav_values[$name]; + } + return $this->htmlSubmit('navop', ucfirst($name), + $this->getCSSclass($name2, $position), false, $$disabled_var ? $disabled : 0); + } + if(isset($this->labels[$name])) return $this->labels[$name]; + return $name; + } /* }}} */ + + function number_of_recs() /* {{{ */ + { + $count_parts = array( + 'type' => 'select', + 'select' => 'count(*)', + 'from' => $this->get_SQL_join_clause(), + 'where' => $this->get_SQL_where_from_query_opts()); + $res = $this->myquery($this->get_SQL_main_list_query($count_parts), __LINE__); + $row = $this->sql_fetch($res, 'n'); + $this->total_recs = $row[0]; + } /* }}} */ + + /* + * Table Page Listing + */ + function list_table() /* {{{ */ + { + if ($this->fm == '') { + $this->fm = 0; + } + $this->fm = $this->navfm; + if ($this->prev_operation()) { + $this->fm = $this->fm - $this->inc; + if ($this->fm < 0) { + $this->fm = 0; + } + } + if ($this->first_operation()) { + $this->fm = 0; + } // last operation must be performed below, after retrieving total_recs + if ($this->next_operation()) { + $this->fm += $this->inc; + } + $this->number_of_recs(); + if ($this->last_operation() || $this->fm > $this->total_recs) { // if goto_text is badly set + $this->fm = (int)(($this->total_recs - 1)/$this->inc)*$this->inc; + } + // If sort sequence has changed, restart listing + $this->qfn != $this->prev_qfn && $this->fm = 0; + if (0) { // DEBUG + echo 'qfn vs. prev_qfn comparsion '; + echo '[',htmlspecialchars($this->qfn),']'; + echo '[',htmlspecialchars($this->prev_qfn),']
'; + echo 'comparsion ',($this->qfn == $this->prev_qfn ? 'proved' : 'failed'),''; + echo '
'; + } + /* + * If user is allowed to Change/Delete records, we need an extra column + * to allow users to select a record + */ + $select_recs = $this->key != '' && + ($this->change_enabled() || $this->delete_enabled() || $this->view_enabled()); + // Are we doing a listall? + $listall = $this->inc <= 0; + /* + * Display the SQL table in an HTML table + */ + $this->form_begin(); + echo $this->get_origvars_html($this->get_sfn_cgi_vars()); + echo $this->htmlHiddenSys('fl', $this->fl); + // Display buttons at top and/or bottom of page. + $this->display_list_table_buttons('up', $listall); + if ($this->cgi['persist'] != '') { + echo $this->get_origvars_html($this->cgi['persist']); + } + if (! $this->filter_operation()) { + echo $this->get_origvars_html($this->qfn); + } + echo $this->htmlHiddenSys('qfn', $this->qfn); + echo $this->htmlHiddenSys('fm', $this->fm); + echo '',"\n"; + echo '',"\n"; + /* + * System (navigation, selection) columns counting + */ + $sys_cols = 0; + $sys_cols += intval($this->filter_enabled() || $select_recs); + if ($sys_cols > 0) { + $sys_cols += intval($this->nav_buttons() + && ($this->nav_text_links() || $this->nav_graphic_links())); + } + /* + * We need an initial column(s) (sys columns) + * if we have filters, Changes or Deletes enabled + */ + if ($sys_cols) { + echo '',"\n"; + } + for ($k = 0; $k < $this->num_fds; $k++) { + $fd = $this->fds[$k]; + if (! $this->displayed[$k]) { + continue; + } + $css_postfix = @$this->fdd[$k]['css']['postfix']; + $css_class_name = $this->getCSSclass('header', null, null, $css_postfix); + $fdn = $this->fdd[$fd]['name']; + if (! $this->fdd[$fd]['sort'] || $this->password($fd)) { + echo '',"\n"; + } else { + // Clicking on the current sort field reverses the sort order + $new_sfn = $this->sfn; + array_unshift($new_sfn, in_array("$k", $new_sfn, 1) ? "-$k" : $k); + echo '',"\n"; + } + } + echo '',"\n"; + + /* + * Prepare the SQL Query from the data definition file + */ + $qparts['type'] = 'select'; + $qparts['select'] = $this->get_SQL_column_list(); + // Even if the key field isn't displayed, we still need its value + if ($select_recs) { + if (!in_array ($this->key, $this->fds)) { + $qparts['select'] .= ','.$this->fqn($this->key); + } + } + $qparts['from'] = $this->get_SQL_join_clause(); + $qparts['where'] = $this->get_SQL_where_from_query_opts(); + // build up the ORDER BY clause + if (isset($this->sfn)) { + $sort_fields = array(); + $sort_fields_w = array(); + foreach ($this->sfn as $field) { + if ($field[0] == '-') { + $field = substr($field, 1); + $desc = true; + } else { + $field = $field; + $desc = false; + } + $sort_field = $this->fqn($field); + $sort_field_w = $this->fdd[$field]['name']; + $this->col_has_sql($field) && $sort_field_w .= ' (sql)'; + if ($desc) { + $sort_field .= ' DESC'; + $sort_field_w .= ' '.$this->labels['descending']; + } else { + $sort_field_w .= ' '.$this->labels['ascending']; + } + $sort_fields[] = $sort_field; + $sort_fields_w[] = $sort_field_w; + } + if (count($sort_fields) > 0) { + $qparts['orderby'] = join(',', $sort_fields); + } + } + $qparts['limit'] = $listall ? '' : $this->sql_limit($this->fm,$this->inc); + + /* + * Main list_table() query + * + * Each row of the HTML table is one record from the SQL query. We must + * perform this query before filter printing, because we want to use + * $this->sql_field_len() function. We will also fetch the first row to get + * the field names. + */ + $query = $this->get_SQL_main_list_query($qparts); + $res = $this->myquery($query, __LINE__); + if ($res == false) { + $this->error('invalid SQL query', $query); + return false; + } + $row = $this->sql_fetch($res); + + /* FILTER {{{ + * + * Draw the filter and fill it with any data typed in last pass and stored + * in the array parameter keyword 'filter'. Prepare the SQL WHERE clause. + */ + if ($this->filter_operation()) { + // Filter row retrieval + $fields = false; + $filter_row = $row; + if (! is_array($filter_row)) { + unset($qparts['where']); + $query = $this->get_SQL_query($qparts); + $res = $this->myquery($query, __LINE__); + if ($res == false) { + $this->error('invalid SQL query', $query); + return false; + } + $filter_row = $this->sql_fetch($res); + } + /* Variable $fields is used to get index of particular field in + result. That index can be passed in example to $this->sql_field_len() + function. Use field names as indexes to $fields array. */ + if (is_array($filter_row)) { + $fields = array_flip(array_keys($filter_row)); + } + if ($fields != false) { + $css_class_name = $this->getCSSclass('filter'); + echo '',"\n"; + echo '', "\n"; + for ($k = 0; $k < $this->num_fds; $k++) { + if (! $this->displayed[$k]) { + continue; + } + $css_postfix = @$this->fdd[$k]['css']['postfix']; + $css_class_name = $this->getCSSclass('filter', null, null, $css_postfix); + $this->field_name = $this->fds[$k]; + $fd = $this->field_name; + $this->field = $this->fdd[$fd]; + $l = 'qf'.$k; + $lc = 'qf'.$k.'_comp'; + $li = 'qf'.$k.'_id'; + if ($this->clear_operation()) { + $m = null; + $mc = null; + $mi = null; + } else { + $m = $this->get_sys_cgi_var($l); + $mc = $this->get_sys_cgi_var($lc); + $mi = $this->get_sys_cgi_var($li); + } + echo '',"\n"; + } + echo '',"\n"; + } + } // }}} + + /* + * Display sorting sequence + */ + if ($qparts['orderby'] && $this->display['sort']) { + $css_class_name = $this->getCSSclass('sortinfo'); + echo '',"\n"; + echo '',"\n"; + echo '',"\n"; + } + + /* + * Display the current query + */ + $text_query = $this->get_SQL_where_from_query_opts(null, true); + if ($text_query != '' && $this->display['query']) { + $css_class_name = $this->getCSSclass('queryinfo'); + echo '',"\n"; + echo '',"\n"; + echo '',"\n"; + } + + if ($this->nav_text_links() || $this->nav_graphic_links()) { + $qstrparts = array(); + strlen($this->fl) > 0 && $qstrparts[] = $this->cgi['prefix']['sys'].'fl'.'='.$this->fl; + strlen($this->fm) > 0 && $qstrparts[] = $this->cgi['prefix']['sys'].'fm'.'='.$this->fm; + count($this->sfn) > 0 && $qstrparts[] = $this->get_sfn_cgi_vars(); + strlen($this->cgi['persist']) > 0 && $qstrparts[] = $this->cgi['persist']; + $qpview = $qstrparts; + $qpcopy = $qstrparts; + $qpchange = $qstrparts; + $qpdelete = $qstrparts; + $qp_prefix = $this->cgi['prefix']['sys'].'operation'.'='.$this->cgi['prefix']['operation']; + $qpview[] = $qp_prefix.'View'; + $qpcopy[] = $qp_prefix.'Copy'; + $qpchange[] = $qp_prefix.'Change'; + $qpdelete[] = $qp_prefix.'Delete'; + $qpviewStr = htmlspecialchars($this->page_name.'?'.join('&',$qpview).$this->qfn); + $qpcopyStr = htmlspecialchars($this->page_name.'?'.join('&',$qpcopy).$this->qfn); + $qpchangeStr = htmlspecialchars($this->page_name.'?'.join('&',$qpchange).$this->qfn); + $qpdeleteStr = htmlspecialchars($this->page_name.'?'.join('&',$qpdelete).$this->qfn); + } + + $fetched = true; + $first = true; + $rowCount = 0; + while ((!$fetched && ($row = $this->sql_fetch($res)) != false) + || ($fetched && $row != false)) { + $fetched = false; + echo '',"\n"; + if ($sys_cols) { /* {{{ */ + $key_rec = $row['qf'.$this->key_num]; + $queryAppend = htmlspecialchars('&'.$this->cgi['prefix']['sys'].'rec'.'='.$key_rec); + $viewQuery = $qpviewStr . $queryAppend; + $copyQuery = $qpcopyStr . $queryAppend; + $changeQuery = $qpchangeStr . $queryAppend; + $deleteQuery = $qpdeleteStr . $queryAppend; + $viewTitle = htmlspecialchars($this->labels['View']); + $changeTitle = htmlspecialchars($this->labels['Change']); + $copyTitle = htmlspecialchars($this->labels['Copy']); + $deleteTitle = htmlspecialchars($this->labels['Delete']); + $css_class_name = $this->getCSSclass('navigation', null, true); + if ($select_recs) { + if (! $this->nav_buttons() || $sys_cols > 1) { + echo '',"\n"; + } + if ($this->nav_buttons()) { + echo '',"\n"; + } + } elseif ($this->filter_enabled()) { + echo '',"\n"; + } + } /* }}} */ + for ($k = 0; $k < $this->num_fds; $k++) { /* {{{ */ + $fd = $this->fds[$k]; + if (! $this->displayed[$k]) { + continue; + } + $css_postfix = @$this->fdd[$k]['css']['postfix']; + $css_class_name = $this->getCSSclass('cell', null, true, $css_postfix); + if ($this->password($k)) { + echo '',"\n"; + continue; + } + echo '',"\n"; + } /* }}} */ + echo '',"\n"; + } + + /* + * Display and accumulate column aggregation info, do totalling query + * XXX this feature does not work yet!!! + */ + // aggregates listing (if any) + if ($$var_to_total) { + // do the aggregate query if necessary + //if ($vars_to_total) { + $qp = array(); + $qp['type'] = 'select'; + $qp['select'] = $aggr_from_clause; + $qp['from'] = $this->get_SQL_join_clause(); + $qp['where'] = $this->get_SQL_where_from_query_opts(); + $tot_query = $this->get_SQL_query($qp); + $totals_result = $this->myquery($tot_query,__LINE__); + $tot_row = $this->sql_fetch($totals_result); + //} + $qp_aggr = $qp; + echo "\n",'',"\n",'',"\n"; + /* + echo ''; + echo ''; + */ + // display the results + for ($k=0;$k<$this->num_fds;$k++) { + $fd = $this->fds[$k]; + if (stristr($this->fdd[$fd]['options'],'L') or !isset($this->fdd[$fd]['options'])) { + echo '',"\n"; + } + } + echo '',"\n"; + } + echo '
'; + if ($this->filter_enabled()) { + if ($this->filter_operation()) { + echo $this->htmlSubmit('sw', 'Hide', $this->getCSSclass('hide'), false); + echo $this->htmlSubmit('sw', 'Clear', $this->getCSSclass('clear'), false); + } else { + echo $this->htmlSubmit('sw', 'Search', $this->getCSSclass('search'), false); + } + } else { + echo ' '; + } + echo '',$fdn,''; + echo '',$fdn,'
'; + echo $this->htmlSubmit('filter', 'Query', $this->getCSSclass('query'), false); + echo ''; + if ($this->password($k)) { + echo ' '; + } else if ($this->fdd[$fd]['select'] == 'D' || $this->fdd[$fd]['select'] == 'M') { + // Multiple fields processing + // Default size is 2 and array required for values. + $from_table = ! $this->col_has_values($k) || isset($this->fdd[$k]['values']['table']); + $vals = $this->set_values($k, array('*' => '*'), null, $from_table); + $selected = $mi; + $multiple = $this->col_has_multiple_select($k); + $multiple |= $this->fdd[$fd]['select'] == 'M'; + $readonly = false; + $strip_tags = true; + $escape = true; + echo $this->htmlSelect($this->cgi['prefix']['sys'].$l.'_id', $css_class_name, + $vals, $selected, $multiple, $readonly, $strip_tags, $escape); + } elseif ($this->fdd[$fd]['select'] == 'N' || $this->fdd[$fd]['select'] == 'T') { + $len_props = ''; + $maxlen = intval($this->fdd[$k]['maxlen']); + $maxlen > 0 || $maxlen = intval($this->sql_field_len($res, $fields["qf$k"])); + $size = isset($this->fdd[$k]['size']) ? $this->fdd[$k]['size'] + : ($maxlen < 30 ? min($maxlen, 8) : 12); + $len_props .= ' size="'.$size.'"'; + $len_props .= ' maxlength="'.$maxlen.'"'; + if ($this->fdd[$fd]['select'] == 'N') { + $mc = in_array($mc, $this->comp_ops) ? $mc : '='; + echo $this->htmlSelect($this->cgi['prefix']['sys'].$l.'_comp', + $css_class_name, $this->comp_ops, $mc); + } + echo ''; + } else { + echo ' '; + } + echo '
'; + echo '',$this->labels['Clear'],''; + echo $this->labels['Sorted By'],': ',join(', ', $sort_fields_w),'
'; + echo '',$this->labels['Clear'],''; + echo $this->labels['Current Query'],': ',htmlspecialchars($text_query),'
'; + } + if ($this->nav_graphic_links()) { + $printed_out = false; + if ($this->view_enabled()) { + $printed_out = true; + echo ''; + } + if ($this->change_enabled()) { + $printed_out && print(' '); + $printed_out = true; + echo ''; + } + if ($this->copy_enabled()) { + $printed_out && print(' '); + $printed_out = true; + echo ''; + } + if ($this->delete_enabled()) { + $printed_out && print(' '); + $printed_out = true; + echo ''; + } + } + if ($this->nav_text_links()) { + if ($this->nav_graphic_links()) { + echo '
'; + } + $printed_out = false; + if ($this->view_enabled()) { + $printed_out = true; + echo 'V'; + } + if ($this->change_enabled()) { + $printed_out && print(' '); + $printed_out = true; + echo 'C'; + } + if ($this->copy_enabled()) { + $printed_out && print(' '); + $printed_out = true; + echo 'P'; + } + if ($this->delete_enabled()) { + $printed_out && print(' '); + $printed_out = true; + echo 'D'; + } + } + if (! $this->nav_buttons() || $sys_cols > 1) { + echo '
rec == '' && $first) || ($this->rec == $key_rec)) { + echo ' checked'; + $first = false; + } + echo ' /> ',$this->labels['hidden'],'getColAttributes($fd),'>'; + echo $this->cellDisplay($k, $row, $css_class_name); + echo '
 '; + echo printarray($qp_aggr); + echo printarray($vars_to_total); + echo ''.$var_to_total.' '.$$var_to_total.''; + $aggr_var = 'qf'.$k.'_aggr'; + $$aggr_var = $this->get_sys_cgi_var($aggr_var); + if ($$aggr_var) { + echo $this->sql_aggrs[$$aggr_var],': ',$tot_row[$aggr_var]; + } else { + echo ' '; + } + echo '
',"\n"; // end of table rows listing + $this->display_list_table_buttons('down', $listall); + $this->form_end(); + } /* }}} */ + + function display_record() /* {{{ */ + { + // PRE Triggers + $ret = true; + if ($this->change_operation()) { + $ret &= $this->exec_triggers_simple('update', 'pre'); + // if PRE update fails, then back to view operation + if (! $ret) { + $this->operation = $this->labels['View']; + $ret = true; + } + } + if ($this->add_operation() || $this->copy_operation()) { + $ret &= $this->exec_triggers_simple('insert', 'pre'); + } + if ($this->view_operation()) { + $ret &= $this->exec_triggers_simple('select', 'pre'); + } + if ($this->delete_operation()) { + $ret &= $this->exec_triggers_simple('delete', 'pre'); + } + // if PRE insert/view/delete fail, then back to the list + if ($ret == false) { + $this->operation = ''; + $this->list_table(); + return; + } + $this->form_begin(); + if ($this->cgi['persist'] != '') { + echo $this->get_origvars_html($this->cgi['persist']); + } + echo $this->get_origvars_html($this->get_sfn_cgi_vars()); + echo $this->get_origvars_html($this->qfn); + echo $this->htmlHiddenSys('cur_tab', $this->dhtml['prefix'].'tab'.$this->cur_tab); + echo $this->htmlHiddenSys('qfn', $this->qfn); + echo $this->htmlHiddenSys('rec', $this->copy_operation() ? '' : $this->rec); + echo $this->htmlHiddenSys('fm', $this->fm); + echo $this->htmlHiddenSys('fl', $this->fl); + $this->display_record_buttons('up'); + if ($this->tabs_enabled()) { + echo '
',"\n"; + } + echo '',"\n"; + if ($this->add_operation()) { + $this->display_add_record(); + } else { + $this->display_copy_change_delete_record(); + } + echo '
',"\n"; + if ($this->tabs_enabled()) { + echo '
',"\n"; + } + $this->display_record_buttons('down'); + + $this->form_end(); + } /* }}} */ + + /* + * Action functions + */ + + function do_add_record() /* {{{ */ + { + // Preparing query + $query = ''; + $key_col_val = ''; + $newvals = array(); + for ($k = 0; $k < $this->num_fds; $k++) { + if ($this->processed($k)) { + $fd = $this->fds[$k]; + if ($this->readonly($k)) { + $fn = (string) @$this->fdd[$k]['default']; + } else { + $fn = $this->get_data_cgi_var($fd); + } + if ($fd == $this->key) { + $key_col_val = $fn; + } + $newvals[$fd] = is_array($fn) ? join(',',$fn) : $fn; + } + } + // Creating array of changed keys ($changed) + $changed = array_keys($newvals); + // Before trigger, newvals can be efectively changed + if ($this->exec_triggers('insert', 'before', $oldvals, $changed, $newvals) == false) { + return false; + } + // Real query (no additional query in this method) + foreach ($newvals as $fd => $val) { + if ($fd == '') continue; + if ($this->col_has_sqlw($this->fdn[$fd])) { + $val_as = addslashes($val); + $val_qas = '"'.addslashes($val).'"'; + $value = $this->substituteVars( + $this->fdd[$this->fdn[$fd]]['sqlw'], array( + 'val_qas' => $val_qas, + 'val_as' => $val_as, + 'val' => $val + )); + } else { + $value = "'".addslashes($val)."'"; + } + if ($query == '') { + $query = 'INSERT INTO '.$this->sd.$this->tb.$this->ed.' ('.$this->sd.$fd.$this->ed.''; // ) + $query2 = ') VALUES ('.$value.''; + } else { + $query .= ', '.$this->sd.$fd.$this->ed.''; + $query2 .= ', '.$value.''; + } + } + $query .= $query2.')'; + $res = $this->myquery($query, __LINE__); + $this->message = $this->sql_affected_rows($this->dbh).' '.$this->labels['record added']; + if (! $res) { + return false; + } + $this->rec = $this->sql_insert_id(); + // Notify list + if (@$this->notify['insert'] || @$this->notify['all']) { + $this->email_notify(false, $newvals); + } + // Note change in log table + if ($this->logtable) { + $query = sprintf('INSERT INTO %s' + .' (updated, user, host, operation, tab, rowkey, col, oldval, newval)' + .' VALUES (NOW(), "%s", "%s", "insert", "%s", "%s", "", "", "%s")', + $this->logtable, addslashes($this->get_server_var('REMOTE_USER')), + addslashes($this->get_server_var('REMOTE_ADDR')), addslashes($this->tb), + addslashes($key_col_val), addslashes(serialize($newvals))); + $this->myquery($query, __LINE__); + } + // After trigger + if ($this->exec_triggers('insert', 'after', $oldvals, $changed, $newvals) == false) { + return false; + } + return true; + } /* }}} */ + + function do_change_record() /* {{{ */ + { + // Preparing queries + $query_real = ''; + $query_oldrec = ''; + $newvals = array(); + $oldvals = array(); + $changed = array(); + // Prepare query to retrieve oldvals + for ($k = 0; $k < $this->num_fds; $k++) { + if ($this->processed($k) && !$this->readonly($k)) { + $fd = $this->fds[$k]; + $fn = $this->get_data_cgi_var($fd); + $newvals[$this->fds[$k]] = is_array($fn) ? join(',',$fn) : $fn; + if ($query_oldrec == '') { + $query_oldrec = 'SELECT '.$this->sd.$fd.$this->ed; + } else { + $query_oldrec .= ','.$this->sd.$fd.$this->ed; + } + } + } + $where_part = " WHERE (".$this->sd.$this->key.$this->ed.'='.$this->key_delim.$this->rec.$this->key_delim.')'; + $query_newrec = $query_oldrec.' FROM ' . $this->tb; + $query_oldrec .= ' FROM ' . $this->sd.$this->tb.$this->ed . $where_part; + // Additional query (must go before real query) + $res = $this->myquery($query_oldrec, __LINE__); + $oldvals = $this->sql_fetch($res); + $this->sql_free_result($res); + // Creating array of changed keys ($changed) + foreach ($newvals as $fd => $value) { + if ($value != $oldvals[$fd]) + $changed[] = $fd; + } + // Before trigger + if ($this->exec_triggers('update', 'before', $oldvals, $changed, $newvals) == false) { + return false; + } + // Build the real query respecting changes to the newvals array + foreach ($newvals as $fd => $val) { + if ($fd == '') continue; + if ($this->col_has_sqlw($this->fdn[$fd])) { + $val_as = addslashes($val); + $val_qas = '"'.addslashes($val).'"'; + $value = $this->substituteVars( + $this->fdd[$this->fdn[$fd]]['sqlw'], array( + 'val_qas' => $val_qas, + 'val_as' => $val_as, + 'val' => $val + )); + } else { + $value = "'".addslashes($val)."'"; + } + if ($query_real == '') { + $query_real = 'UPDATE '.$this->sd.$this->tb.$this->ed.' SET '.$this->sd.$fd.$this->ed.'='.$value; + } else { + $query_real .= ','.$this->sd.$fd.$this->ed.'='.$value; + } + } + $query_real .= $where_part; + // Real query + $res = $this->myquery($query_real, __LINE__); + $this->message = $this->sql_affected_rows($this->dbh).' '.$this->labels['record changed']; + if (! $res) { + return false; + } + // Another additional query (must go after real query) + if (in_array($this->key, $changed)) { + $this->rec = $newvals[$this->key]; // key has changed + } + $query_newrec .= ' WHERE ('.$this->key.'='.$this->key_delim.$this->rec.$this->key_delim.')'; + $res = $this->myquery($query_newrec, __LINE__); + $newvals = $this->sql_fetch($res); + $this->sql_free_result($res); + // Creating array of changed keys ($changed) + $changed = array(); + foreach ($newvals as $fd => $value) { + if ($value != $oldvals[$fd]) + $changed[] = $fd; + } + // Notify list + if (@$this->notify['update'] || @$this->notify['all']) { + if (count($changed) > 0) { + $this->email_notify($oldvals, $newvals); + } + } + // Note change in log table + if ($this->logtable) { + foreach ($changed as $key) { + $qry = sprintf('INSERT INTO %s' + .' (updated, user, host, operation, tab, rowkey, col, oldval, newval)' + .' VALUES (NOW(), "%s", "%s", "update", "%s", "%s", "%s", "%s", "%s")', + $this->logtable, addslashes($this->get_server_var('REMOTE_USER')), + addslashes($this->get_server_var('REMOTE_ADDR')), addslashes($this->tb), + addslashes($this->rec), addslashes($key), + addslashes($oldvals[$key]), addslashes($newvals[$key])); + $this->myquery($qry, __LINE__); + } + } + // After trigger + if ($this->exec_triggers('update', 'after', $oldvals, $changed, $newvals) == false) { + return false; + } + return true; + } /* }}} */ + + function do_delete_record() /* {{{ */ + { + // Additional query + $query = 'SELECT * FROM '.$this->sd.$this->tb.$this->ed.' WHERE ('.$this->sd.$this->key.$this->ed.' = ' + .$this->key_delim.$this->rec.$this->key_delim.')'; // ) + $res = $this->myquery($query, __LINE__); + $oldvals = $this->sql_fetch($res); + $this->sql_free_result($res); + // Creating array of changed keys ($changed) + $changed = is_array($oldvals) ? array_keys($oldvals) : array(); + $newvals = array(); + // Before trigger + if ($this->exec_triggers('delete', 'before', $oldvals, $changed, $newvals) == false) { + return false; + } + // Real query + $query = 'DELETE FROM '.$this->tb.' WHERE ('.$this->key.' = ' + .$this->key_delim.$this->rec.$this->key_delim.')'; // ) + $res = $this->myquery($query, __LINE__); + $this->message = $this->sql_affected_rows($this->dbh).' '.$this->labels['record deleted']; + if (! $res) { + return false; + } + // Notify list + if (@$this->notify['delete'] || @$this->notify['all']) { + $this->email_notify($oldvals, false); + } + // Note change in log table + if ($this->logtable) { + $query = sprintf('INSERT INTO %s' + .' (updated, user, host, operation, tab, rowkey, col, oldval, newval)' + .' VALUES (NOW(), "%s", "%s", "delete", "%s", "%s", "%s", "%s", "")', + $this->logtable, addslashes($this->get_server_var('REMOTE_USER')), + addslashes($this->get_server_var('REMOTE_ADDR')), addslashes($this->tb), + addslashes($this->rec), addslashes($key), addslashes(serialize($oldvals))); + $this->myquery($query, __LINE__); + } + // After trigger + if ($this->exec_triggers('delete', 'after', $oldvals, $changed, $newvals) == false) { + return false; + } + return true; + } /* }}} */ + + function email_notify($old_vals, $new_vals) /* {{{ */ + { + if (! function_exists('mail')) { + return false; + } + if ($old_vals != false && $new_vals != false) { + $action = 'update'; + $subject = 'Record updated in'; + $body = 'An item with '.$this->fdd[$this->key]['name'].' = ' + .$this->key_delim.$this->rec.$this->key_delim .' was updated in'; + $vals = $new_vals; + } elseif ($new_vals != false) { + $action = 'insert'; + $subject = 'Record added to'; + $body = 'A new item was added into'; + $vals = $new_vals; + } elseif ($old_vals != false) { + $action = 'delete'; + $subject = 'Record deleted from'; + $body = 'An item was deleted from'; + $vals = $old_vals; + } else { + return false; + } + $addr = $this->get_server_var('REMOTE_ADDR'); + $user = $this->get_server_var('REMOTE_USER'); + $body = 'This notification e-mail was automatically generated by phpMyEdit.'."\n\n".$body; + $body .= ' table '.$this->tb.' in SQL database '.$this->db.' on '.$this->page_name; + $body .= ' by '.($user == '' ? 'unknown user' : "user $user").' from '.$addr; + $body .= ' at '.date('d/M/Y H:i').' with the following fields:'."\n\n"; + $i = 1; + foreach ($vals as $k => $text) { + $name = isset($this->fdd[$k]['name~']) + ? $this->fdd[$k]['name~'] : $this->fdd[$k]['name']; + if ($action == 'update') { + if ($old_vals[$k] == $new_vals[$k]) { + continue; + } + $body .= sprintf("[%02s] %s (%s)\n WAS: %s\n IS: %s\n", + $i, $name, $k, $old_vals[$k], $new_vals[$k]); + } else { + $body .= sprintf('[%02s] %s (%s): %s'."\n", $i, $name, $k, $text); + } + $i++; + } + $body .= "\n--\r\n"; // \r is needed for signature separating + $body .= "phpMyEdit\ninstant SQL table editor and code generator\n"; + $body .= "http://platon.sk/projects/phpMyEdit/\n\n"; + $subject = @$this->notify['prefix'].$subject.' '.$this->dbp.$this->tb; + $subject = trim($subject); // just for sure + $wrap_w = intval(@$this->notify['wrap']); + $wrap_w > 0 || $wrap_w = 72; + $from = (string) @$this->notify['from']; + $from != '' || $from = 'webmaster@'.strtolower($this->get_server_var('SERVER_NAME')); + $headers = 'From: '.$from."\n".'X-Mailer: PHP/'.phpversion().' (phpMyEdit)'; + $body = wordwrap($body, $wrap_w, "\n", 1); + $emails = (array) $this->notify[$action] + (array) $this->notify['all']; + foreach ($emails as $email) { + if (! empty($email)) { + mail(trim($email), $subject, $body, $headers); + } + } + return true; + } /* }}} */ + + /* + * Apply triggers function + * Run a (set of) trigger(s). $trigger can be an Array or a filename + * Break and return false as soon as a trigger return false + * we need a reference on $newvals to be able to change value before insert/update + */ + function exec_triggers($op, $step, $oldvals, &$changed, &$newvals) /* {{{ */ + { + if (! isset($this->triggers[$op][$step])) { + return true; + } + $ret = true; + $trig = $this->triggers[$op][$step]; + if (is_array($trig)) { + ksort($trig); + for ($t = reset($trig); $t !== false && $ret != false; $t = next($trig)) { + $ret = include($t); + } + } else { + $ret = include($trig); + } + return $ret; + } /* }}} */ + + function exec_triggers_simple($op, $step) /* {{{ */ + { + $oldvals = $newvals = $changed = array(); + return $this->exec_triggers($op, $step, $oldvals, $changed, $newvals); + } /* }}} */ + + /* + * Recreate functions + */ + function recreate_fdd($default_page_type = 'L') /* {{{ */ + { + // TODO: one level deeper browsing + $this->page_type = $default_page_type; + $this->filter_operation() && $this->page_type = 'F'; + $this->view_operation() && $this->page_type = 'V'; + if ($this->add_operation() + || $this->saveadd == $this->labels['Save'] + || $this->moreadd == $this->labels['More']) { + $this->page_type = 'A'; + } + if ($this->change_operation() + || $this->savechange == $this->labels['Save'] + || $this->morechange == $this->labels['Apply']) { + $this->page_type = 'C'; + } + if ($this->copy_operation() || $this->savecopy == $this->labels['Save']) { + $this->page_type = 'P'; + } + if ($this->delete_operation() || $this->savedelete == $this->labels['Delete']) { + $this->page_type = 'D'; + } + // Restore backups (if exists) + foreach (array_keys($this->fdd) as $column) { + foreach (array_keys($this->fdd[$column]) as $col_option) { + if ($col_option[strlen($col_option) - 1] != '~') + continue; + + $this->fdd[$column][substr($col_option, 0, strlen($col_option) - 1)] + = $this->fdd[$column][$col_option]; + unset($this->fdd[$column][$col_option]); + } + } + foreach (array_keys($this->fdd) as $column) { + foreach (array_keys($this->fdd[$column]) as $col_option) { + if (! strchr($col_option, '|')) { + continue; + } + $col_ar = explode('|', $col_option, 2); + if (! stristr($col_ar[1], $this->page_type)) { + continue; + } + // Make field backups + $this->fdd[$column][$col_ar[0] .'~'] = $this->fdd[$column][$col_ar[0]]; + $this->fdd[$column][$col_option.'~'] = $this->fdd[$column][$col_option]; + // Set particular field + $this->fdd[$column][$col_ar[0]] = $this->fdd[$column][$col_option]; + unset($this->fdd[$column][$col_option]); + } + } + } /* }}} */ + + function recreate_displayed() /* {{{ */ + { + $field_num = 0; + $num_fields_displayed = 0; + $this->fds = array(); + $this->fdn = array(); + $this->displayed = array(); + $this->guidance = false; + foreach (array_keys($this->fdd) as $key) { + if (preg_match('/^\d+$/', $key)) { // skipping numeric keys + continue; + } + $this->fds[$field_num] = $key; + $this->fdn[$key] = $field_num; + /* We must use here displayed() function, because displayed[] array + is not created yet. We will simultaneously create that array as well. */ + if ($this->displayed[$field_num] = $this->displayed($field_num)) { + $num_fields_displayed++; + } + if (is_array(@$this->fdd[$key]['values']) && ! isset($this->fdd[$key]['values']['table'])) { + foreach ($this->fdd[$key]['values'] as $val) { + $this->fdd[$key]['values2'][$val] = $val; + } + unset($this->fdd[$key]['values']); + } + isset($this->fdd[$key]['help']) && $this->guidance = true; + $this->fdd[$field_num] = $this->fdd[$key]; + $field_num++; + } + $this->num_fds = $field_num; + $this->num_fields_displayed = $num_fields_displayed; + $this->key_num = array_search($this->key, $this->fds); + /* Adds first displayed column into sorting fields by replacing last + array entry. Also remove duplicite values and change column names to + their particular field numbers. + + Note that entries like [0]=>'9' [1]=>'-9' are correct and they will + have desirable sorting behaviour. So there is no need to remove them. + */ + $this->sfn = array_unique($this->sfn); + $check_ar = array(); + foreach ($this->sfn as $key => $val) { + if (preg_match('/^[-]?\d+$/', $val)) { // skipping numeric keys + $val = abs($val); + if (in_array($val, $check_ar) || $this->password($val)) { + unset($this->sfn[$key]); + } else { + $check_ar[] = $val; + } + continue; + } + if ($val[0] == '-') { + $val = substr($val, 1); + $minus = '-'; + } else { + $minus = ''; + } + if (($val = array_search($val, $this->fds)) === false || $this->password($val)) { + unset($this->sfn[$key]); + } else { + $val = intval($val); + if (in_array($val, $check_ar)) { + unset($this->sfn[$key]); + } else { + $this->sfn[$key] = $minus.$val; + $check_ar[] = $val; + } + } + } + $this->sfn = array_unique($this->sfn); + return true; + } /* }}} */ + + function backward_compatibility() /* {{{ */ + { + foreach (array_keys($this->fdd) as $column) { + // move ['required'] to ['js']['required'] + if (! isset($this->fdd[$column]['js']['required']) && isset($this->fdd[$column]['required'])) { + $this->fdd[$column]['js']['required'] = $this->fdd[$column]['required']; + } + // move 'HWR' flags from ['options'] into ['input'] + if (isset($this->fdd[$column]['options'])) { + stristr($this->fdd[$column]['options'], 'H') && $this->fdd[$column]['input'] .= 'H'; + stristr($this->fdd[$column]['options'], 'W') && $this->fdd[$column]['input'] .= 'W'; + stristr($this->fdd[$column]['options'], 'R') && $this->fdd[$column]['input'] .= 'R'; + } + } + } /* }}} */ + + /* + * Error handling function + */ + function error($message, $additional_info = '') /* {{{ */ + { + echo '

phpMyEdit error: ',htmlspecialchars($message),'

',"\n"; + if ($additional_info != '') { + echo '
',htmlspecialchars($additional_info); + } + return false; + } /* }}} */ + + /* + * Database connection function + */ + function connect() /* {{{ */ + { + if (isset($this->dbh)) { + return true; + } + if (!isset($this->db)) { + $this->error('no database defined'); + return false; + } + if (!isset ($this->tb)) { + $this->error('no table defined'); + return false; + } + $this->sql_connect(); + if (!$this->dbh) { + $this->error('could not connect to SQL'); + return false; + } + return true; + } /* }}} */ + + /* + * The workhorse + */ + function execute() /* {{{ */ + { + // DEBUG - uncomment to enable + /* + //phpinfo(); + $this->print_get_vars(); + $this->print_post_vars(); + $this->print_vars(); + echo "
query opts:\n";
+		echo print_r($this->query_opts);
+		echo "
\n"; + echo "
get vars:\n";
+		echo print_r($this->get_opts);
+		echo "
\n"; + */ + + // Let's do explicit quoting - it's safer + set_magic_quotes_runtime(0); + // Checking if language file inclusion was successful + if (! is_array($this->labels)) { + $this->error('could not locate language files', 'searched path: '.$this->dir['lang']); + return false; + } + // Database connection + if ($this->connect() == false) { + return false; + } + + /* + * ====================================================================== + * Pass 3: process any updates generated if the user has selected + * a save or cancel button during Pass 2 + * ====================================================================== + */ + // Cancel button - Cancel Triggers + if ($this->add_canceled() || $this->copy_canceled()) { + $this->exec_triggers_simple('insert', 'cancel'); + } + if ($this->view_canceled()) { + $this->exec_triggers_simple('select', 'cancel'); + } + if ($this->change_canceled()) { + $this->exec_triggers_simple('update', 'cancel'); + } + if ($this->delete_canceled()) { + $this->exec_triggers_simple('delete', 'cancel'); + } + // Save/More Button - database operations + if ($this->saveadd == $this->labels['Save'] || $this->savecopy == $this->labels['Save']) { + $this->add_enabled() && $this->do_add_record(); + unset($this->saveadd); + unset($this->savecopy); + $this->recreate_fdd(); + } + elseif ($this->moreadd == $this->labels['More']) { + $this->add_enabled() && $this->do_add_record(); + $this->operation = $this->labels['Add']; // to force add operation + $this->recreate_fdd(); + $this->recreate_displayed(); + $this->backward_compatibility(); + } + elseif ($this->savechange == $this->labels['Save']) { + $this->change_enabled() && $this->do_change_record(); + unset($this->savechange); + $this->recreate_fdd(); + } + elseif ($this->morechange == $this->labels['Apply']) { + $this->change_enabled() && $this->do_change_record(); + $this->operation = $this->labels['Change']; // to force change operation + $this->recreate_fdd(); + $this->recreate_displayed(); + $this->backward_compatibility(); + } + elseif ($this->savedelete == $this->labels['Delete']) { + $this->delete_enabled() && $this->do_delete_record(); + unset($this->savedelete); + $this->recreate_fdd(); + } + + /* + * ====================================================================== + * Pass 2: display an input/edit/confirmation screen if the user has + * selected an editing button on Pass 1 through this page + * ====================================================================== + */ + if ($this->add_operation() + || $this->change_operation() || $this->delete_operation() + || $this->view_operation() || $this->copy_operation()) { + $this->display_record(); + } + + /* + * ====================================================================== + * Pass 1 and Pass 3: display the SQL table in a scrolling window on + * the screen (skip this step in 'Add More' mode) + * ====================================================================== + */ + else { + $this->list_table(); + } + + $this->sql_disconnect(); + if ($this->display['time'] && $this->timer != null) { + echo $this->timer->end(),' miliseconds'; + } + } /* }}} */ + + /* + * Class constructor + */ + function phpMyEdit($opts) /* {{{ */ + { + // Set desirable error reporting level + $error_reporting = error_reporting(E_ALL & ~E_NOTICE); + // Database handle variables + $this->sql_delimiter(); + if (isset($opts['dbh'])) { + $this->close_dbh = false; + $this->dbh = $opts['dbh']; + $this->dbp = ''; + } else { + $this->close_dbh = true; + $this->dbh = null; + $this->dbp = $this->sd.$opts['db'].$this->ed.'.'; + $this->hn = $opts['hn']; + $this->un = $opts['un']; + $this->pw = $opts['pw']; + $this->db = $opts['db']; + } + $this->tb = $opts['tb']; + // Other variables + $this->key = $opts['key']; + $this->key_type = $opts['key_type']; + $this->inc = $opts['inc']; + $this->options = $opts['options']; + $this->fdd = $opts['fdd']; + $this->multiple = intval($opts['multiple']); + $this->multiple <= 0 && $this->multiple = 2; + $this->filters = is_array(@$opts['filters']) ? join(' AND ', $opts['filters']) : @$opts['filters']; + $this->triggers = @$opts['triggers']; + $this->notify = @$opts['notify']; + $this->logtable = @$opts['logtable']; + $this->page_name = @$opts['page_name']; + if (! isset($this->page_name)) { + $this->page_name = basename($this->get_server_var('PHP_SELF')); + isset($this->page_name) || $this->page_name = $this->tb; + } + $this->display['query'] = @$opts['display']['query']; + $this->display['sort'] = @$opts['display']['sort']; + $this->display['time'] = @$opts['display']['time']; + if ($this->display['time']) { + $this->timer = new phpMyEdit_timer(); + } + $this->display['tabs'] = isset($opts['display']['tabs']) + ? $opts['display']['tabs'] : true; + $this->display['form'] = isset($opts['display']['form']) + ? $opts['display']['form'] : true; + $this->display['num_records'] = isset($opts['display']['num_records']) + ? $opts['display']['num_records'] : true; + $this->display['num_pages'] = isset($opts['display']['num_pages']) + ? $opts['display']['num_pages'] : true; + // Creating directory variables + $this->dir['root'] = dirname(realpath(__FILE__)) + . (strlen(dirname(realpath(__FILE__))) > 0 ? '/' : ''); + $this->dir['lang'] = $this->dir['root'].'lang/'; + // Creating URL variables + $this->url['images'] = 'images/'; + isset($opts['url']['images']) && $this->url['images'] = $opts['url']['images']; + // CSS classes policy + $this->css = @$opts['css']; + !isset($this->css['separator']) && $this->css['separator'] = '-'; + !isset($this->css['prefix']) && $this->css['prefix'] = 'pme'; + !isset($this->css['page_type']) && $this->css['page_type'] = false; + !isset($this->css['position']) && $this->css['position'] = false; + !isset($this->css['divider']) && $this->css['divider'] = 2; + $this->css['divider'] = intval(@$this->css['divider']); + // JS overall configuration + $this->js = @$opts['js']; + !isset($this->js['prefix']) && $this->js['prefix'] = 'PME_js_'; + // DHTML overall configuration + $this->dhtml = @$opts['dhtml']; + !isset($this->dhtml['prefix']) && $this->dhtml['prefix'] = 'PME_dhtml_'; + // Navigation + $this->navigation = @$opts['navigation']; + if (! $this->nav_buttons() && ! $this->nav_text_links() && ! $this->nav_graphic_links()) { + $this->navigation .= 'B'; // buttons are default + } + if (! $this->nav_up() && ! $this->nav_down()) { + $this->navigation .= 'D'; // down position is default + } + $this->buttons = $opts['buttons']; + // Language labels (must go after navigation) + $this->labels = $this->make_language_labels(isset($opts['language']) + ? $opts['language'] : $this->get_server_var('HTTP_ACCEPT_LANGUAGE')); + // CGI variables + $this->cgi = @$opts['cgi']; + $this->cgi['persist'] = ''; + if (@is_array($opts['cgi']['persist'])) { + foreach ($opts['cgi']['persist'] as $key => $val) { + if (is_array($val)) { + foreach($val as $key2 => $val2) { + $this->cgi['persist'] .= '&'.rawurlencode($key) + .'['.rawurlencode($key2).']='.rawurlencode($val2); + } + } else { + $this->cgi['persist'] .= '&'.rawurlencode($key).'='.rawurlencode($val); + } + } + } + foreach (array('operation', 'sys', 'data') as $type) { + if (! isset($this->cgi['prefix'][$type])) { + $this->cgi['prefix'][$type] = $this->get_default_cgi_prefix($type); + } + } + // Sorting variables + $this->sfn = $this->get_sys_cgi_var('sfn'); + isset($this->sfn) || $this->sfn = array(); + is_array($this->sfn) || $this->sfn = array($this->sfn); + isset($opts['sort_field']) || $opts['sort_field'] = array(); + is_array($opts['sort_field']) || $opts['sort_field'] = array($opts['sort_field']); + $this->sfn = array_merge($this->sfn, $opts['sort_field']); + // Form variables all around + $this->fl = intval($this->get_sys_cgi_var('fl')); + $this->fm = intval($this->get_sys_cgi_var('fm')); +// $old_page = ceil($this->fm / abs($this->inc)) + 1; + $this->qfn = $this->get_sys_cgi_var('qfn'); + $this->sw = $this->get_sys_cgi_var('sw'); + $this->rec = $this->get_sys_cgi_var('rec', ''); + $this->navop = $this->get_sys_cgi_var('navop'); + $navfmup = $this->get_sys_cgi_var('navfmup'); + $navfmdown = $this->get_sys_cgi_var('navfmdown'); + $navpnup = $this->get_sys_cgi_var('navpnup'); + $navpndown = $this->get_sys_cgi_var('navpndown'); + if($navfmdown!=NULL && $navfmdown != $this->fm) $this->navfm = $navfmdown; + elseif($navfmup!=NULL && $navfmup != $this->fm) $this->navfm = $navfmup; + elseif($navpndown!=NULL && ($navpndown-1)*$this->inc != $this->fm) $this->navfm = ($navpndown-1)*$this->inc; + elseif($navpnup!=NULL && ($navpnup-1)*$this->inc != $this->fm) $this->navfm = ($navpnup-1)*$this->inc; + else $this->navfm = $this->fm; + $this->operation = $this->get_sys_cgi_var('operation'); + $oper_prefix_len = strlen($this->cgi['prefix']['operation']); + if (! strncmp($this->cgi['prefix']['operation'], $this->operation, $oper_prefix_len)) { + $this->operation = $this->labels[substr($this->operation, $oper_prefix_len)]; + } + $this->saveadd = $this->get_sys_cgi_var('saveadd'); + $this->moreadd = $this->get_sys_cgi_var('moreadd'); + $this->canceladd = $this->get_sys_cgi_var('canceladd'); + $this->savechange = $this->get_sys_cgi_var('savechange'); + $this->morechange = $this->get_sys_cgi_var('morechange'); + $this->cancelchange = $this->get_sys_cgi_var('cancelchange'); + $this->savecopy = $this->get_sys_cgi_var('savecopy'); + $this->cancelcopy = $this->get_sys_cgi_var('cancelcopy'); + $this->savedelete = $this->get_sys_cgi_var('savedelete'); + $this->canceldelete = $this->get_sys_cgi_var('canceldelete'); + $this->cancelview = $this->get_sys_cgi_var('cancelview'); + // Filter setting + if (isset($this->sw)) { + $this->sw == $this->labels['Search'] && $this->fl = 1; + $this->sw == $this->labels['Hide'] && $this->fl = 0; + //$this->sw == $this->labels['Clear'] && $this->fl = 0; + } + // TAB names + $this->tabs = array(); + // Setting key_delim according to key_type + if ($this->key_type == 'real') { + /* If 'real' key_type does not work, + try change MySQL datatype from float to double */ + $this->rec = doubleval($this->rec); + $this->key_delim = ''; + } elseif ($this->key_type == 'int') { + $this->rec = intval($this->rec); + $this->key_delim = ''; + } else { + $this->key_delim = '"'; + // $this->rec remains unmodified + } + // Specific $fdd modifications depending on performed action + $this->recreate_fdd(); + // Extract SQL Field Names and number of fields + $this->recreate_displayed(); + // Issue backward compatibility + $this->backward_compatibility(); + // Gathering query options + $this->gather_query_opts(); + // Call to action + !isset($opts['execute']) && $opts['execute'] = 1; + $opts['execute'] && $this->execute(); + // Restore original error reporting level + error_reporting($error_reporting); + } /* }}} */ + +} + +/* Modeline for ViM {{{ + * vim:set ts=4: + * vim600:fdm=marker fdl=0 fdc=0: + * }}} */ + +?> diff --git a/service-admin.inc.php-dist b/service-admin.inc.php-dist new file mode 100644 index 0000000..58c3a21 --- /dev/null +++ b/service-admin.inc.php-dist @@ -0,0 +1,73 @@ +SetY(-15); + //Arial italic 8 + $this->SetFont('Arial','I',8); + //Page number + $this->Cell(0,10,$this->PageNo().'/{nb}',0,0,'C'); +} +} + +?> diff --git a/services.php b/services.php new file mode 100644 index 0000000..bd3dbdd --- /dev/null +++ b/services.php @@ -0,0 +1,185 @@ + + + + + Services + + + +

Services

+ true, + 'query' => true, + 'sort' => true, + 'time' => true, + 'tabs' => true +); + +// Set default prefixes for variables +$opts['js']['prefix'] = 'PME_js_'; +$opts['dhtml']['prefix'] = 'PME_dhtml_'; +$opts['cgi']['prefix']['operation'] = 'PME_op_'; +$opts['cgi']['prefix']['sys'] = 'PME_sys_'; +$opts['cgi']['prefix']['data'] = 'PME_data_'; + +/* Get the user's default language and use it if possible or you can + specify particular one you want to use. Refer to official documentation + for list of available languages. */ +$opts['language'] = $_SERVER['HTTP_ACCEPT_LANGUAGE'] . '-UTF8'; + +/* Table-level filter capability. If set, it is included in the WHERE clause + of any generated SELECT statement in SQL query. This gives you ability to + work only with subset of data from table. + +$opts['filters'] = "column1 like '%11%' AND column2<17"; +$opts['filters'] = "section_id = 9"; +$opts['filters'] = "PMEtable0.sessions_count > 200"; +*/ + +/* Field definitions + +Fields will be displayed left to right on the screen in the order in which they +appear in generated list. Here are some most used field options documented. + +['name'] is the title used for column headings, etc.; +['maxlen'] maximum length to display add/edit/search input boxes +['trimlen'] maximum length of string content to display in row listing +['width'] is an optional display width specification for the column + e.g. ['width'] = '100px'; +['mask'] a string that is used by sprintf() to format field output +['sort'] true or false; means the users may sort the display on this column +['strip_tags'] true or false; whether to strip tags from content +['nowrap'] true or false; whether this field should get a NOWRAP +['select'] T - text, N - numeric, D - drop-down, M - multiple selection +['options'] optional parameter to control whether a field is displayed + L - list, F - filter, A - add, C - change, P - copy, D - delete, V - view + Another flags are: + R - indicates that a field is read only + W - indicates that a field is a password field + H - indicates that a field is to be hidden and marked as hidden +['URL'] is used to make a field 'clickable' in the display + e.g.: 'mailto:$value', 'http://$value' or '$page?stuff'; +['URLtarget'] HTML target link specification (for example: _blank) +['textarea']['rows'] and/or ['textarea']['cols'] + specifies a textarea is to be used to give multi-line input + e.g. ['textarea']['rows'] = 5; ['textarea']['cols'] = 10 +['values'] restricts user input to the specified constants, + e.g. ['values'] = array('A','B','C') or ['values'] = range(1,99) +['values']['table'] and ['values']['column'] restricts user input + to the values found in the specified column of another table +['values']['description'] = 'desc_column' + The optional ['values']['description'] field allows the value(s) displayed + to the user to be different to those in the ['values']['column'] field. + This is useful for giving more meaning to column values. Multiple + descriptions fields are also possible. Check documentation for this. +*/ + +$opts['fdd']['serviceid'] = array( + 'name' => 'Serviceid', + 'select' => 'T', + 'options' => 'AVCPDR', // auto increment + 'maxlen' => 20, + 'default' => '0', + 'sort' => true +); +$opts['fdd']['servicename'] = array( + 'name' => 'Service', + 'select' => 'T', + 'maxlen' => 128, + 'sort' => true +); +$opts['fdd']['nrc'] = array( + 'name' => 'Nrc', + 'select' => 'T', + 'maxlen' => 12, + 'sort' => false +); +$opts['fdd']['mrc'] = array( + 'name' => 'Mrc', + 'select' => 'T', + 'maxlen' => 12, + 'sort' => false +); +$opts['fdd']['qrc'] = array( + 'name' => 'Qrc', + 'select' => 'T', + 'maxlen' => 12, + 'sort' => false +); +$opts['fdd']['yrc'] = array( + 'name' => 'Yrc', + 'select' => 'T', + 'maxlen' => 12, + 'sort' => false +); + +// Now important call to phpMyEdit +require_once 'phpMyEdit.class.php'; +new phpMyEdit($opts); + +?> + + + + diff --git a/sql/data.sql b/sql/data.sql new file mode 100644 index 0000000..c14004a --- /dev/null +++ b/sql/data.sql @@ -0,0 +1,48 @@ +-- phpMyAdmin SQL Dump +-- version 2.9.1.1-Debian-9 +-- http://www.phpmyadmin.net +-- +-- Host: toledo.simsplace.com +-- Generation Time: Jan 25, 2009 at 06:00 PM +-- Server version: 5.0.51 +-- PHP Version: 5.2.0-8+etch13 +-- +-- Database: `safe-demo` +-- + +-- +-- Dumping data for table `customers` +-- + +INSERT INTO `customers` (`customerid`, `customername`, `attn`, `street`, `zipcode`, `city`, `country`, `vatnr`, `language`) VALUES +(14, 'Example BV', '', 'Dummy straat', '1111 XY', 'Nergensheen', '', '', 'nl'); + +-- +-- Dumping data for table `domains` +-- + + +-- +-- Dumping data for table `invoicelines` +-- + +INSERT INTO `invoicelines` (`invoicelineid`, `invoiceid`, `customerid`, `subscriptionid`, `description`, `invoicelinedate`, `amount`, `charge`) VALUES +(212, 1, 14, 1, 'Setup charge: SAFE as a Service hosted for Example BV', '2009-01-03', 1, 150.00), +(213, 1, 14, 1, 'SAFE as a Service hosted for Example BV january', '2009-01-03', 1, 25.00); + +-- +-- Dumping data for table `services` +-- + +INSERT INTO `services` (`serviceid`, `servicename`, `nrc`, `mrc`, `qrc`, `yrc`) VALUES +(17, 'SAFE as a Service', 150.00, 25.00, 0.00, 0.00), +(18, 'Call charges', 0.00, 0.00, 0.00, 0.00); + +-- +-- Dumping data for table `subscriptions` +-- + +INSERT INTO `subscriptions` (`subscriptionid`, `customerid`, `serviceid`, `description`, `amount`, `lastinvoiced`) VALUES +(1, 14, 17, 'hosted for Example BV', 1, '2009-01-03'), +(2, 14, 18, 'example_sip', 1, '2009-01-25'); + diff --git a/sql/schema.sql b/sql/schema.sql new file mode 100644 index 0000000..6c2d267 --- /dev/null +++ b/sql/schema.sql @@ -0,0 +1,114 @@ +-- phpMyAdmin SQL Dump +-- version 2.9.1.1-Debian-9 +-- http://www.phpmyadmin.net +-- +-- Host: toledo.simsplace.com +-- Generation Time: Jan 03, 2009 at 08:57 PM +-- Server version: 5.0.51 +-- PHP Version: 5.2.0-8+etch13 +-- +-- Database: `safe` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `customers` +-- + +CREATE TABLE `customers` ( + `customerid` bigint(20) NOT NULL auto_increment, + `customername` varchar(80) NOT NULL, + `attn` varchar(80) NOT NULL, + `street` varchar(80) NOT NULL, + `zipcode` varchar(80) NOT NULL, + `city` varchar(80) NOT NULL, + `country` varchar(80) NOT NULL, + `vatnr` varchar(20) NOT NULL, + `language` varchar(2) NOT NULL default 'nl', + PRIMARY KEY (`customerid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `domains` +-- + +CREATE TABLE `domains` ( + `domainid` bigint(20) NOT NULL auto_increment, + `domain` varchar(120) NOT NULL, + `rsp` varchar(120) NOT NULL, + `registrar` varchar(120) NOT NULL, + `whoisglue` varchar(120) NOT NULL, + `dnshosts` varchar(120) NOT NULL, + `mxhosts` varchar(120) NOT NULL, + `web` varchar(120) NOT NULL, + PRIMARY KEY (`domainid`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=91 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `invoicelines` +-- + +CREATE TABLE `invoicelines` ( + `invoicelineid` bigint(20) NOT NULL auto_increment, + `invoiceid` bigint(20) default NULL, + `customerid` bigint(20) NOT NULL, + `subscriptionid` bigint(20) default NULL, + `description` varchar(80) NOT NULL, + `invoicelinedate` date NOT NULL, + `amount` float NOT NULL default '1', + `charge` decimal(10,2) NOT NULL, + PRIMARY KEY (`invoicelineid`), + KEY `customerid` (`customerid`), + KEY `customerserviceid` (`subscriptionid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=210 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `services` +-- + +CREATE TABLE `services` ( + `serviceid` bigint(20) NOT NULL auto_increment, + `servicename` varchar(128) NOT NULL, + `nrc` decimal(10,2) NOT NULL, + `mrc` decimal(10,2) NOT NULL, + `qrc` decimal(10,2) NOT NULL, + `yrc` decimal(10,2) NOT NULL, + PRIMARY KEY (`serviceid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `subscriptions` +-- + +CREATE TABLE `subscriptions` ( + `subscriptionid` bigint(20) NOT NULL auto_increment, + `customerid` bigint(20) NOT NULL, + `serviceid` bigint(20) NOT NULL, + `description` varchar(80) NOT NULL, + `amount` bigint(20) NOT NULL default '1', + `lastinvoiced` date NOT NULL, + PRIMARY KEY (`subscriptionid`), + KEY `customerid` (`customerid`), + KEY `serviceid` (`serviceid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=76 ; + +-- +-- Constraints for dumped tables +-- + +-- +-- Constraints for table `subscriptions` +-- +ALTER TABLE `subscriptions` + ADD CONSTRAINT `subscriptions_ibfk_1` FOREIGN KEY (`customerid`) REFERENCES `customers` (`customerid`), + ADD CONSTRAINT `subscriptions_ibfk_2` FOREIGN KEY (`serviceid`) REFERENCES `services` (`serviceid`); + diff --git a/subscriptions.php b/subscriptions.php new file mode 100644 index 0000000..e55a417 --- /dev/null +++ b/subscriptions.php @@ -0,0 +1,197 @@ + + + + + Subscriptions + + + +

Subscriptions

+ true, + 'query' => true, + 'sort' => true, + 'time' => true, + 'tabs' => true +); + +// Set default prefixes for variables +$opts['js']['prefix'] = 'PME_js_'; +$opts['dhtml']['prefix'] = 'PME_dhtml_'; +$opts['cgi']['prefix']['operation'] = 'PME_op_'; +$opts['cgi']['prefix']['sys'] = 'PME_sys_'; +$opts['cgi']['prefix']['data'] = 'PME_data_'; + +/* Get the user's default language and use it if possible or you can + specify particular one you want to use. Refer to official documentation + for list of available languages. */ +$opts['language'] = $_SERVER['HTTP_ACCEPT_LANGUAGE'] . '-UTF8'; + +/* Table-level filter capability. If set, it is included in the WHERE clause + of any generated SELECT statement in SQL query. This gives you ability to + work only with subset of data from table. + +$opts['filters'] = "column1 like '%11%' AND column2<17"; +$opts['filters'] = "section_id = 9"; +$opts['filters'] = "PMEtable0.sessions_count > 200"; +*/ + +/* Field definitions + +Fields will be displayed left to right on the screen in the order in which they +appear in generated list. Here are some most used field options documented. + +['name'] is the title used for column headings, etc.; +['maxlen'] maximum length to display add/edit/search input boxes +['trimlen'] maximum length of string content to display in row listing +['width'] is an optional display width specification for the column + e.g. ['width'] = '100px'; +['mask'] a string that is used by sprintf() to format field output +['sort'] true or false; means the users may sort the display on this column +['strip_tags'] true or false; whether to strip tags from content +['nowrap'] true or false; whether this field should get a NOWRAP +['select'] T - text, N - numeric, D - drop-down, M - multiple selection +['options'] optional parameter to control whether a field is displayed + L - list, F - filter, A - add, C - change, P - copy, D - delete, V - view + Another flags are: + R - indicates that a field is read only + W - indicates that a field is a password field + H - indicates that a field is to be hidden and marked as hidden +['URL'] is used to make a field 'clickable' in the display + e.g.: 'mailto:$value', 'http://$value' or '$page?stuff'; +['URLtarget'] HTML target link specification (for example: _blank) +['textarea']['rows'] and/or ['textarea']['cols'] + specifies a textarea is to be used to give multi-line input + e.g. ['textarea']['rows'] = 5; ['textarea']['cols'] = 10 +['values'] restricts user input to the specified constants, + e.g. ['values'] = array('A','B','C') or ['values'] = range(1,99) +['values']['table'] and ['values']['column'] restricts user input + to the values found in the specified column of another table +['values']['description'] = 'desc_column' + The optional ['values']['description'] field allows the value(s) displayed + to the user to be different to those in the ['values']['column'] field. + This is useful for giving more meaning to column values. Multiple + descriptions fields are also possible. Check documentation for this. +*/ + +$opts['fdd']['subscriptionid'] = array( + 'name' => 'Subscriptionid', + 'select' => 'T', + 'options' => 'AVCPDR', // auto increment + 'maxlen' => 20, + 'default' => '0', + 'sort' => true +); +$opts['fdd']['customerid'] = array( + 'name' => 'Customer', + 'select' => 'T', + 'maxlen' => 20, + 'values' => array( + 'table' => 'customers', + 'column' => 'customerid', + 'description' => 'customername' + ), + + 'sort' => true +); +$opts['fdd']['serviceid'] = array( + 'name' => 'Service', + 'select' => 'T', + 'maxlen' => 20, + 'values' => array( + 'table' => 'services', + 'column' => 'serviceid', + 'description' => 'servicename' + ), + + 'sort' => true +); +$opts['fdd']['description'] = array( + 'name' => 'Description', + 'select' => 'T', + 'maxlen' => 80, + 'sort' => true +); +$opts['fdd']['amount'] = array( + 'name' => 'Amount', + 'select' => 'N', + 'maxlen' => 10, + 'sort' => false +); +$opts['fdd']['lastinvoiced'] = array( + 'name' => 'Last invoiced', + 'select' => 'T', + 'maxlen' => 10, + 'sort' => true +); + +// Now important call to phpMyEdit +require_once 'phpMyEdit.class.php'; +new phpMyEdit($opts); + +?> + + + + diff --git a/upload-cdr.php b/upload-cdr.php new file mode 100644 index 0000000..d7b447d --- /dev/null +++ b/upload-cdr.php @@ -0,0 +1,133 @@ + + + + + Items to invoice + + + +

Upload CDR and create invoice lines

+"; + $csvfile = file($file['tmp_name']); + // Process the cdrfile + for($l=0; $l"; + } + } + + // Connect to database + mysql_connect($opts['hn'], $opts['un'], $opts['pw']); + mysql_select_db($opts['db']); + + // Get all subscriptions + $qry = "SELECT * FROM ".$opts['tb']." LEFT JOIN ".$opts['sv']." "; + $qry .= "ON ".$opts['tb'].".serviceid = ".$opts['sv'].".serviceid WHERE servicename='$callchargetext'"; + $result = mysql_query($qry) or die("A fatal MySQL error occured.\n
Query: " . $qry . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + + // Loop through them + while ($subscription = mysql_fetch_array($result)) { + // Process the subscription + $subid = $subscription['subscriptionid']; + $custid = $subscription['customerid']; + $description = $subscription['servicename']." ".$subscription['description']; + $today = date("Y-m-d"); + $updated = false; + $callcharges = $cdr[$subscription['description']]; + + if($callcharges != 0) { + // Store the accumulated records in a related subscription + $ins = "INSERT INTO ".$opts['in']." (customerid, subscriptionid, description, invoicelinedate, amount, charge) "; + $ins .= "VALUES ($custid, $subid, '$description', NOW(), 1, $callcharges)"; + $insres = mysql_query($ins) or die("A fatal MySQL error occured.\n
Query: " . $ins . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + $upd = "UPDATE ".$opts['tb']." SET lastinvoiced=NOW() WHERE subscriptionid=$subid"; + $updres = mysql_query($upd) or die("A fatal MySQL error occured.\n
Query: " . $upd . "
\nError: (" . mysql_errno() . ") " . mysql_error()); + + echo "Invoiced $description $callcharges
"; + $totalcharged += $callcharges; + } + // Unset the stored data so we can check what might be left behind in the end + unset($cdr[$subscription['description']]); + } + echo "Total call charges invoiced: $callcharges
"; + if(count($cdr) > 0) { + // Warning that not all acounts have been invoiced + echo "

Warning: Remaining records:
"; + foreach($cdr as $account => $value) echo "Account $account has not been invoiced (missed $value)
"; + echo "
"; + } + + // Everything went OK, no need to show the form again. + $showform = false; + } else { + echo "File upload failed (".$file['error'].")"; + } +} + +if($showform) { +?> +

Upload a Comma Separated CDR file. The CDR file is processed with these fields: +

cid,time,from,to,account,duration,costs,destination
+

Account is matched to the description field of a subscription 'Call charges' +

+ + + + + + + + + +
 CDR file
  + +
+
+ + +
+Process CDR +
+
+ + +