Compare commits

..

740 commits

Author SHA1 Message Date
Jim Jagielski
4793daceb2 Update to account for deprecated usage from 5->7.x 2019-06-06 10:05:23 -04:00
Jim Jagielski
6e2aa303f4 Fix https://github.com/jimjag/telaen/issues/8
o Correct path
  o Namespace awareness
2018-12-17 09:06:35 -05:00
Jim Jagielski
5810b5e535 force top-level namespace 2018-12-12 10:26:48 -05:00
Jim Jagielski
267e74c463 Fix https://github.com/jimjag/telaen/issues/7
o We need to make it aware that we are using SQLite3 before we can extend it
2018-12-12 09:59:27 -05:00
Jim Jagielski
29e4692786 Update link and authors 2018-11-19 16:13:40 -05:00
Jim Jagielski
2e8b1d1ae6 Upgrade to latest vCard parser version (v1.0.0) 2018-11-17 11:44:11 -05:00
Jim Jagielski
6af3047c7f Port to using namespaces 2018-11-16 17:02:00 -05:00
Jim Jagielski
300cfcceac Make more PHP7 friendly. Avoid use of array() 2018-11-16 16:05:50 -05:00
Jim Jagielski
46c1938c4e move to latest version of Smarty 2018-11-16 16:00:10 -05:00
Jim Jagielski
35097f28e0 Make iCalcreator PHP7 compatible.
Note: We can't use the latest version due to license issues (it is AGPLv3)
2018-11-16 14:07:32 -05:00
Jim Jagielski
9e95dbcd2c Allow for charset encoding change 2018-11-16 13:55:13 -05:00
Jim Jagielski
93b4bb7e00 Update to latest rev... maintain PHP-5.6 compat for now. 2018-11-16 10:56:42 -05:00
Jim Jagielski
4c35c94003 more array() -> [] updates 2018-08-20 15:41:57 -04:00
Jim Jagielski
2149ed6d1f No longer use old-style array declaration 2018-08-17 09:26:14 -04:00
Jim Jagielski
b7c4a0e69f latest 5.2 version... need to upgrade/port for 6 2018-08-02 08:48:13 -04:00
Jim Jagielski
f7477f5966 Update to latest rev 2018-08-02 08:44:43 -04:00
Jim Jagielski
8603c64fc6 fold in minor improvement 2018-08-02 08:42:40 -04:00
Jim Jagielski
f0f3d7e7d1 latest htmLawed 2018-08-02 08:39:37 -04:00
Jim Jagielski
c6d15b1146 correct the location 2018-08-02 08:36:46 -04:00
Jim Jagielski
a7926ea2c3 Updated w/ smarty 3.1.32 2018-08-02 08:24:52 -04:00
Jim Jagielski
f94858511d update PHPMailer 2016-12-28 11:01:50 -05:00
Jim Jagielski
607833afa2 Use latest 2016-12-28 09:38:37 -05:00
Jim Jagielski
296a2ebc2d update w/ latest PHPMailer 2016-12-26 11:41:12 -05:00
Jim Jagielski
939c428a03 4.4.8 2015-12-17 08:10:12 -05:00
Jim Jagielski
84f7e2cd10 Update w/ latest jquery 2015-12-02 12:42:01 -05:00
Jim Jagielski
7326373bda Add in pointer to vendor lib sources 2015-12-02 08:07:08 -05:00
Jim Jagielski
9b847da1a7 Update to latest version 2015-12-02 07:37:13 -05:00
Jim Jagielski
05fb7374bb Fold in latest PHPMailer 2015-11-02 14:41:52 -05:00
Jim Jagielski
b2940a85f8 Updates 2015-09-14 11:54:07 -04:00
Jim Jagielski
beeb9e117b Move jquery to vendor subdir; 2015-08-27 15:16:24 -04:00
Jim Jagielski
2b1ee21139 simpler quoting 2015-05-13 13:38:58 -04:00
Jim Jagielski
9c5cc8c8f7 clean up 2015-04-18 14:44:37 -04:00
Jim Jagielski
064123eb95 not needed. For safety 2015-04-18 14:44:22 -04:00
Jim Jagielski
02f42eb98c And align 2015-04-04 10:11:11 -04:00
Jim Jagielski
4508535552 grr 2015-04-04 10:05:23 -04:00
Jim Jagielski
9f3634806f More quoting 2015-04-04 09:59:06 -04:00
Jim Jagielski
14c0a12362 Quoting 2015-04-04 09:53:45 -04:00
Jim Jagielski
60c7872239 Nope. Need to be explicit 2015-04-04 09:40:23 -04:00
Jim Jagielski
68c2074f41 pull out 2015-04-04 09:36:43 -04:00
Jim Jagielski
8bf306e4d1 This did it. 2015-04-03 15:28:00 -04:00
Jim Jagielski
ab1a0a7edf OK... for some reaosn, delatt() is not being see... see if we
can force by making it part of the returned HTML
2015-04-03 15:25:26 -04:00
Jim Jagielski
aafb2ea508 Use canon method 2015-04-03 15:20:39 -04:00
Jim Jagielski
e1bd221a30 Refac 2015-04-03 15:09:32 -04:00
Jim Jagielski
00e776dbb6 Beautify 2015-04-03 14:50:44 -04:00
Jim Jagielski
d389fdf085 use 9am as def 2015-04-03 12:11:34 -04:00
Jim Jagielski
7c2f0f4155 Now rem with() 2015-04-02 10:20:40 -04:00
Jim Jagielski
44a2714256 use with() for now 2015-04-02 10:17:41 -04:00
Jim Jagielski
c40e88cbdb more js 2015-04-02 10:04:26 -04:00
Jim Jagielski
ecc5d1e6bc js fixes 2015-04-02 10:03:27 -04:00
Jim Jagielski
14bf066f77 with() is deprecated 2015-04-02 10:02:03 -04:00
Jim Jagielski
febfb0038f And 2015-04-02 09:46:38 -04:00
Jim Jagielski
00119d89ad terminate 2015-04-02 09:44:32 -04:00
Jim Jagielski
1812df67fa more 2015-04-02 09:43:44 -04:00
Jim Jagielski
f3702817cd Use specified func 2015-04-02 09:38:13 -04:00
Jim Jagielski
c79668c2bd need to get js to work on current html pulled in via ajax 2015-04-02 09:24:41 -04:00
Jim Jagielski
a4b59fa180 work on events 2015-04-02 09:06:33 -04:00
Jim Jagielski
e55c0a53e6 update 2015-03-25 14:17:53 -04:00
Jim Jagielski
93b026c761 Update 2015-03-25 14:13:43 -04:00
Jim Jagielski
0de405312b reset 2015-03-09 07:06:13 -04:00
Jim Jagielski
0a3b0861fd canon name 2015-03-09 05:56:09 -04:00
Jim Jagielski
afbfb09ea4 cVard uses exc. 2015-03-08 12:58:53 -04:00
Jim Jagielski
83aa5e8a6d match 2015-03-08 12:50:45 -04:00
Jim Jagielski
0cc0f7e7e1 vCard uses __toString. 2015-03-06 15:49:19 -05:00
Jim Jagielski
2b5521dead pull in manually 2015-03-06 14:50:02 -05:00
Jim Jagielski
fcdab164de Save if replaced 2015-03-06 14:41:45 -05:00
Jim Jagielski
0dce543ab5 And w/ QA 2015-03-06 14:06:29 -05:00
Jim Jagielski
9248b22040 Use new Vcard format 2015-03-06 14:01:49 -05:00
Jim Jagielski
6a34f66db1 fix 2015-03-02 14:50:23 -05:00
Jim Jagielski
9d017a097e no spc 2015-03-02 14:42:36 -05:00
Jim Jagielski
a3ac176f63 fix unreads 2015-03-02 14:09:51 -05:00
Jim Jagielski
e4f1317185 better 2015-03-02 13:32:55 -05:00
Jim Jagielski
cbe49e9e7e clean up old flags 2015-02-26 10:55:40 -05:00
Jim Jagielski
19dea6ec83 pull from config 2015-02-26 09:21:57 -05:00
Jim Jagielski
570ff9470a return string 2015-02-26 09:15:24 -05:00
Jim Jagielski
33b9520e3a use 2^ 2015-02-26 09:14:19 -05:00
Jim Jagielski
8573e11e6f Use flags which really contains the info is message was
read or not.
2015-02-25 19:59:34 -05:00
Jim Jagielski
6139d0e6fb remve complexity 2015-02-25 17:34:15 -05:00
Jim Jagielski
2bc58c7cfc prevent underflow... 2015-02-25 16:59:46 -05:00
Jim Jagielski
e182e37d0e maintain unread 2015-02-25 16:45:20 -05:00
Jim Jagielski
4bbe3b9e28 abstract away 2015-02-25 16:11:02 -05:00
Jim Jagielski
6b08258182 sets 2015-02-25 16:01:53 -05:00
Jim Jagielski
5f9fa91f61 make flags easier to use 2015-02-25 15:58:22 -05:00
Jim Jagielski
f7eddc94fa jquery 2015-02-25 14:02:44 -05:00
Jim Jagielski
596725c3e5 and pass uidl 2015-02-25 13:57:50 -05:00
Jim Jagielski
4b221304cd allow for server-side only deletion and handling of keep_on_server 2015-02-25 13:37:04 -05:00
Jim Jagielski
69b02bf6ab Change to a uniq tag instead... 2015-02-25 12:00:12 -05:00
Jim Jagielski
7e5bab178a use canon method 2015-02-25 11:50:32 -05:00
Jim Jagielski
831f968c9d make as class 2015-02-25 11:13:36 -05:00
Jim Jagielski
7f9bc063d4 force 2015-02-25 11:10:00 -05:00
Jim Jagielski
cef31fc526 use canon format 2015-02-25 11:08:11 -05:00
Jim Jagielski
0fb6e1bfef ensure we have a string 2015-02-25 11:06:44 -05:00
Jim Jagielski
15b04ea280 make text/plain look 2015-02-25 11:01:17 -05:00
Jim Jagielski
0b0b2537b2 need to array it 2015-02-25 10:23:09 -05:00
Jim Jagielski
5a97d074fd logic 2015-02-25 09:51:25 -05:00
Jim Jagielski
1ea399f4a8 ugg 2015-02-25 09:48:47 -05:00
Jim Jagielski
ffd3434bb0 just one preg 2015-02-25 09:41:23 -05:00
Jim Jagielski
731ec45d0e make content-type of message top level 2015-02-25 09:35:46 -05:00
Jim Jagielski
988e794454 simplify delete 2015-02-25 09:05:12 -05:00
Jim Jagielski
29cf7624a6 Upd 2015-02-25 07:55:17 -05:00
Jim Jagielski
6bfce471a7 debug 2015-02-25 06:58:37 -05:00
Jim Jagielski
46a2540af4 fast path 2015-02-25 06:50:34 -05:00
Jim Jagielski
84bd89f431 fix cached/local logic 2015-02-25 06:40:16 -05:00
Jim Jagielski
8dc4ec3585 more adj of inbox handling for POP3... should we have 2
(hidden) Inboxes for POP? Might be easier.
2015-02-25 06:16:49 -05:00
Jim Jagielski
1f0724f96c use correct path 2015-02-24 18:18:13 -05:00
Jim Jagielski
2411627a39 better 2015-02-24 17:39:51 -05:00
Jim Jagielski
905064d671 Allow for adjusting of mnum for POP3 messages, when we move messages 2015-02-24 16:55:55 -05:00
Jim Jagielski
2fe8f633b3 supression not needed 2015-02-24 16:01:06 -05:00
Jim Jagielski
f7d74482b0 error detect prepare... 2015-02-24 15:55:49 -05:00
Jim Jagielski
629a7a1fac just change... and allow passthru for newMessage 2015-02-24 13:08:54 -05:00
Jim Jagielski
99aea324be fix 2015-02-24 12:22:42 -05:00
Jim Jagielski
be8c9c61df and rename 2015-02-24 12:19:46 -05:00
Jim Jagielski
fa9e2db04c one at a time 2015-02-24 12:19:02 -05:00
Jim Jagielski
764218500d Also copy parsed file if exists 2015-02-24 12:01:52 -05:00
Jim Jagielski
ed2b014433 fix the test 2015-02-24 11:53:17 -05:00
Jim Jagielski
c044f800dd for POP, all folder are local 2015-02-24 11:43:24 -05:00
Jim Jagielski
fb5f456bf2 follow up 2015-02-24 11:29:45 -05:00
Jim Jagielski
8cc2ae44fe During message move, sync db 2015-02-24 11:24:36 -05:00
Jim Jagielski
69f7138f05 if we don't want to keep mail on the server, then delete
as needed and keep track of what is cached and what is local
2015-02-24 10:49:54 -05:00
Jim Jagielski
02cd607215 error detect 2015-02-23 17:33:17 -05:00
Jim Jagielski
2060e6b15c use regex 2015-02-23 17:22:59 -05:00
Jim Jagielski
6a13b33ac8 typo 2015-02-23 17:07:28 -05:00
Jim Jagielski
b39f220a9b use actual folders, not magic file-system scanning 2015-02-23 17:02:07 -05:00
Jim Jagielski
d44ff57eed new method: check that msg is still on server 2015-02-23 16:46:16 -05:00
Jim Jagielski
53e4015571 1. check for file-upload support
2. default to true
3. use msg
2015-02-23 14:04:27 -05:00
Jim Jagielski
f526e504c5 use [] format 2015-02-23 13:51:30 -05:00
Jim Jagielski
35adc27abc use def func 2015-02-23 13:46:00 -05:00
Jim Jagielski
2119d9262e grab uidl not index 2015-02-23 13:41:23 -05:00
Jim Jagielski
2df835a2e7 force utf-8 2015-02-23 13:41:15 -05:00
Jim Jagielski
8d5a796646 use standard method 2015-02-23 13:21:33 -05:00
Jim Jagielski
bc7458e689 ensure we are ints 2015-02-23 12:44:20 -05:00
Jim Jagielski
c95c1b20b2 reset w/ newer rev 2015-02-23 12:42:31 -05:00
Jim Jagielski
a2634d55cc need edir 2015-02-23 12:38:25 -05:00
Jim Jagielski
c16de05901 rem 2015-02-23 12:35:38 -05:00
Jim Jagielski
b793517da5 use ID 2015-02-23 12:31:25 -05:00
Jim Jagielski
c52bd379ce no need func 2015-02-23 12:28:12 -05:00
Jim Jagielski
3a53fabf5a xfer to jquery 2015-02-23 12:20:03 -05:00
Jim Jagielski
5e91362585 Get rid of Alternative files when/if they exist after parsing 2015-02-23 11:37:02 -05:00
Jim Jagielski
4600803fff correct localtion 2015-02-23 11:21:37 -05:00
Jim Jagielski
c0fe346a76 update db 2015-02-23 11:03:01 -05:00
Jim Jagielski
a96fbbddc5 freshen 2015-02-23 10:50:24 -05:00
Jim Jagielski
59a417d3eb better encoding 2015-02-23 10:38:22 -05:00
Jim Jagielski
de57fc9860 align... not needed but nice 2015-02-23 10:20:33 -05:00
Jim Jagielski
94564cb92e requires array 2015-02-23 10:14:46 -05:00
Jim Jagielski
bb0e6b8e7c minor movement 2015-02-23 10:06:30 -05:00
Jim Jagielski
049e297cad fluff 2015-02-23 10:00:12 -05:00
Jim Jagielski
8b71b5969a mapping of emailbox names to actual (safe) directory names 2015-02-23 09:55:56 -05:00
Jim Jagielski
5dba1db229 silly rabbit. Minutes 2015-02-23 08:39:27 -05:00
Jim Jagielski
ce1130998c consistent naming of attachments... Also allows for
future parsing
2015-02-23 08:19:12 -05:00
Jim Jagielski
8c8ef7c16c and be aware of old, existing parsed bodies 2015-02-23 07:57:17 -05:00
Jim Jagielski
b7a5896dc7 Only worry about messages old Telaen created 2015-02-23 07:50:48 -05:00
Jim Jagielski
a405f954ee another item that should be in parseheaders 2015-02-23 07:41:46 -05:00
Jim Jagielski
1ac0906e75 sep out folders by function 2015-02-23 07:26:33 -05:00
Jim Jagielski
73c6feb129 need correct dir name 2015-02-23 07:17:35 -05:00
Jim Jagielski
e86e9d4b29 add in the uidl header 2015-02-23 07:06:54 -05:00
Jim Jagielski
31dbf76f65 allow scaning of subdir 2015-02-23 06:54:39 -05:00
Jim Jagielski
de1cf0134b fix comment 2015-02-23 06:51:22 -05:00
Jim Jagielski
a01eb4f5c1 parseheaders should also create 'header' field 2015-02-23 06:44:26 -05:00
Jim Jagielski
3fc29f557c need header 2015-02-22 20:45:41 -05:00
Jim Jagielski
153a0a7696 restore symlink prep 2015-02-22 19:30:29 -05:00
Jim Jagielski
d20587a599 trim once 2015-02-22 19:11:18 -05:00
Jim Jagielski
f32477a51f use regex 2015-02-22 19:07:00 -05:00
Jim Jagielski
bf841e6b5a be safe 2015-02-22 19:01:14 -05:00
Jim Jagielski
f68bf6920e OK means OK 2015-02-22 18:51:08 -05:00
Jim Jagielski
6bbb3269a5 Ugg. if preg_match fails, then it's NOK 2015-02-22 18:39:33 -05:00
Jim Jagielski
5c5144318e streamline 2015-02-22 18:31:00 -05:00
Jim Jagielski
f1dc7a40e2 No need for these 2015-02-22 17:09:21 -05:00
Jim Jagielski
78094bcfce fix 2015-02-22 17:03:35 -05:00
Jim Jagielski
a04dcebcb0 refactor 2015-02-22 16:42:41 -05:00
Jim Jagielski
32a8bb9473 don't user userfolder directly 2015-02-22 16:31:42 -05:00
Jim Jagielski
d135efe5ae Use a specific _upload folder 2015-02-22 16:16:50 -05:00
Jim Jagielski
7432a31a39 some minor formatting... need to update css 2015-02-22 15:59:59 -05:00
Jim Jagielski
9a66c891ed Use strings 2015-02-22 15:53:37 -05:00
Jim Jagielski
98825ddb61 move 2015-02-22 15:48:53 -05:00
Jim Jagielski
8c63228af7 just one 2015-02-22 15:44:41 -05:00
Jim Jagielski
4495ad9a9a Ugg. Not this 2015-02-22 15:41:29 -05:00
Jim Jagielski
826b04d008 use correct class 2015-02-22 15:35:12 -05:00
Jim Jagielski
79e5306cfb pretty 2015-02-22 15:34:07 -05:00
Jim Jagielski
0f802c99a0 need full table 2015-02-22 15:31:39 -05:00
Jim Jagielski
ae73c0dbff fixme 2015-02-22 15:28:52 -05:00
Jim Jagielski
894711d0ae better usage 2015-02-22 15:26:08 -05:00
Jim Jagielski
47422013ec use arra 2015-02-22 15:21:47 -05:00
Jim Jagielski
a829264d30 use both 2015-02-22 15:18:56 -05:00
Jim Jagielski
d9e9affe8d correct field 2015-02-22 15:11:05 -05:00
Jim Jagielski
acedf07fec and update w/ uploads 2015-02-22 15:07:24 -05:00
Jim Jagielski
9de1c8e891 keep attachment info tohgether 2015-02-22 14:07:25 -05:00
Jim Jagielski
18b15464bb use tmp/tmp as folder/uidl for to-include attachments
for new messages.
2015-02-22 13:55:17 -05:00
Jim Jagielski
43c55685a7 start work on allowing attachments for new messages
(and preping using existing attachments for replies)
2015-02-22 12:57:22 -05:00
Jim Jagielski
550ad4ad77 standardize method 2015-02-22 12:15:38 -05:00
Jim Jagielski
74d93d4c09 oops 2015-02-22 11:20:37 -05:00
Jim Jagielski
546d79d883 need name 2015-02-22 11:17:56 -05:00
Jim Jagielski
adaa7afd0d force correct dispo 2015-02-22 11:07:43 -05:00
Jim Jagielski
db867ffe07 fix tpl 2015-02-22 11:01:00 -05:00
Jim Jagielski
4641c1ce6c use index 2015-02-22 10:57:19 -05:00
Jim Jagielski
26d40ff759 dummy... execute takes no params 2015-02-21 16:44:17 -05:00
Jim Jagielski
d4b44d8e2c Huh? prepared no work on SELECT? 2015-02-21 16:40:19 -05:00
Jim Jagielski
b06d9b0675 expose just one method for changing msg fields 2015-02-21 15:59:43 -05:00
Jim Jagielski
5385abbdbb use refs as needed 2015-02-21 15:50:22 -05:00
Jim Jagielski
fb410035e6 set field 2015-02-21 14:59:02 -05:00
Jim Jagielski
8186128947 set field 2015-02-21 14:48:08 -05:00
Jim Jagielski
2cfaa594e7 oops`ZZ 2015-02-21 14:46:19 -05:00
Jim Jagielski
2b65531d30 adjust for single field sets 2015-02-21 14:43:19 -05:00
Jim Jagielski
c6b7ad189f simplify 2015-02-21 13:31:12 -05:00
Jim Jagielski
6313854578 Store uploaded attachements for outgoing messages 2015-02-21 10:55:06 -05:00
Jim Jagielski
75f771de66 Better and safer xlation 2015-02-21 10:54:51 -05:00
Jim Jagielski
f75dc844e5 No need for NOT NULL 2015-02-21 10:54:34 -05:00
Jim Jagielski
23ec990466 some minor 2015-02-20 14:16:50 -05:00
Jim Jagielski
43c179e2e1 We need 2 buffer sizes... allocate as needed 2015-02-18 16:31:42 -05:00
Jim Jagielski
25cf0919e7 Only set if was previously unread. 2015-02-18 16:18:58 -05:00
Jim Jagielski
6ddab52889 use correct path 2015-02-18 13:10:29 -05:00
Jim Jagielski
ac9629978e mainatin type/subtype 2015-02-18 13:10:17 -05:00
Jim Jagielski
b269ca100f Use the correct field 2015-02-18 12:51:15 -05:00
Jim Jagielski
82da905c8c fetchStructure always returns body as a stream 2015-02-18 12:12:08 -05:00
Jim Jagielski
09ed6ab87f body is a resource stream 2015-02-18 12:07:39 -05:00
Jim Jagielski
4f6ad8715f memory 2015-02-18 11:35:58 -05:00
Jim Jagielski
7e00f3bb42 Correct object 2015-02-18 11:04:09 -05:00
Jim Jagielski
5e5aa6ad50 style 2015-02-17 14:50:52 -05:00
Jim Jagielski
9617271b1b id 2015-02-17 13:17:15 -05:00
Jim Jagielski
eb88d75e79 inc 2015-02-17 13:14:12 -05:00
Jim Jagielski
077e299949 reset 2015-02-17 13:09:40 -05:00
Jim Jagielski
3af3c3cc15 formatting 2015-02-17 12:56:26 -05:00
Jim Jagielski
c661843c44 Don't use heredoc yet 2015-02-17 12:13:13 -05:00
Jim Jagielski
29c695e3de Ajax upload for attachments (new) 2015-02-17 11:51:07 -05:00
Jim Jagielski
063e1fc6cc part 2: Smarty vars have 'sm' prefix 2015-02-15 12:03:49 -05:00
Jim Jagielski
601bda9b4c Smarty vars now use 'sm' prefix instead of 'um' 2015-02-15 11:48:11 -05:00
Jim Jagielski
37adda38f4 more notice 2015-02-11 15:25:22 -05:00
Jim Jagielski
950207a770 class var descriptions 2015-02-11 15:22:30 -05:00
Jim Jagielski
e87849eaf4 Update w/ refs 2015-02-11 12:29:18 -05:00
Jim Jagielski
9d6b10f4f9 and more vCard 2015-02-10 09:34:19 -05:00
Jim Jagielski
0e92118308 continue w/ vCard 2015-02-10 09:14:42 -05:00
Jim Jagielski
7b1c379406 start migration to vCard. With old format, xlate. 2015-02-10 08:39:40 -05:00
Jim Jagielski
9c7e149f86 Sync w/ github fork. keys are case non-sens 2015-02-10 08:39:05 -05:00
Jim Jagielski
4d5970b7bc fix logic... $pag is always >=1 2015-02-10 08:38:37 -05:00
Jim Jagielski
fcd85be786 Use a lib that creates and parses 2015-02-07 09:35:41 -05:00
Jim Jagielski
3bd78f7081 reorg 2015-02-07 09:34:59 -05:00
Jim Jagielski
965df08719 url 2015-02-06 15:53:24 -05:00
Jim Jagielski
300c7f3ed2 not for a long while 2015-02-06 15:42:51 -05:00
Jim Jagielski
0bcd90082b Changes 2015-02-06 15:40:32 -05:00
Jim Jagielski
8356d7bdec Initial load 2015-02-06 15:15:35 -05:00
Jim Jagielski
39c34820b4 Add 2015-02-06 14:27:52 -05:00
Jim Jagielski
fb2fd44194 Hmmm 2015-02-06 14:27:36 -05:00
Jim Jagielski
a24c62b176 not this :) 2015-02-06 13:27:16 -05:00
Jim Jagielski
96d7ee26d7 force default for time being 2015-02-06 13:15:23 -05:00
Jim Jagielski
3bd5e8ebd5 For now, have a single, canonical theme 2015-02-06 12:57:51 -05:00
Jim Jagielski
899fdc249c working downloads 2015-02-06 10:42:28 -05:00
Jim Jagielski
424c354077 retrMsg can now also return the full message, headers
included (ie: the "raw" email)
2015-02-06 09:27:11 -05:00
Jim Jagielski
fc28ba8e62 default is using html 2015-02-05 15:46:38 -05:00
Jim Jagielski
b2230eb94e our stored message-id lacks '<>'... add when needed and ensure no spaces 2015-02-05 15:42:10 -05:00
Jim Jagielski
d3b84a0619 Rearrange arg to allow for def of utf-8. 2015-02-05 15:25:46 -05:00
Jim Jagielski
c8c40ea3ec We use utf-8 for our functions, and convert when/if needed
for the user.
2015-02-05 15:13:03 -05:00
Jim Jagielski
ec910575b6 ensure conversion 2015-02-05 15:05:59 -05:00
Jim Jagielski
c8bda7bace catch addresses updates 2015-02-05 14:12:35 -05:00
Jim Jagielski
c8d9e1f4e5 make show headers work 2015-02-05 14:01:05 -05:00
Jim Jagielski
4b24a2bc7e We always tuck away the "best" version of the message, which
is usually the HTML one, sanitized as required. We convert
as and when needed
2015-02-05 13:35:33 -05:00
Jim Jagielski
f1fc55ba4c fix var names 2015-02-05 11:15:10 -05:00
Jim Jagielski
5e3288d59a and log it 2015-02-05 10:57:09 -05:00
Jim Jagielski
fcaceae20c better error 2015-02-05 10:54:45 -05:00
Jim Jagielski
3e54fb52b3 we need to immediately sync since show_message wants hparsed 2015-02-05 10:50:23 -05:00
Jim Jagielski
35bf29fb2f Only get messages if we had a current folder 2015-02-05 10:50:04 -05:00
Jim Jagielski
f7eed128f2 its uidl 2015-02-05 10:24:37 -05:00
Jim Jagielski
0ab99acb49 oops 2015-02-05 10:22:31 -05:00
Jim Jagielski
19f2ae20e0 use jquery form 2015-02-05 10:18:48 -05:00
Jim Jagielski
0d92dd50ad clean-up... remove old, unused code 2015-02-05 09:08:52 -05:00
Jim Jagielski
20ea2c1500 make it static and public 2015-02-05 09:00:25 -05:00
Jim Jagielski
f5c13bf92a use correct function 2015-02-05 08:18:07 -05:00
Jim Jagielski
c5fbf11d36 use new converter 2015-02-05 08:15:13 -05:00
Jim Jagielski
54731eaa59 We will be using jquery instead of prototype
and an external html2txt filter
2015-02-05 06:55:58 -05:00
Jim Jagielski
294fe3c780 not needed. 2015-02-05 06:54:58 -05:00
Jim Jagielski
6816734c3d updates for PHPMailer 2015-02-05 06:47:17 -05:00
Jim Jagielski
2bbbb79e41 threading on sent messages (if replied) 2015-02-02 15:36:23 -05:00
Jim Jagielski
ce483a8573 work on new message transition 2015-02-02 15:05:20 -05:00
Jim Jagielski
30f0818995 new method 2015-02-02 15:05:12 -05:00
Jim Jagielski
30667adb40 use uidl 2015-02-02 14:24:48 -05:00
Jim Jagielski
8aea967153 this is now a boolean, not a string 2015-02-02 12:06:47 -05:00
Jim Jagielski
a77c245300 No need folder_list anymore 2015-02-01 10:52:49 -05:00
Jim Jagielski
c12dc03064 fix read/unread login 2015-01-31 15:16:43 -05:00
Jim Jagielski
73c92f7c54 move to attachments folder 2015-01-31 15:07:49 -05:00
Jim Jagielski
30fe3271a7 need subtype and replacing cid: entries 2015-01-30 17:42:55 -05:00
Jim Jagielski
ecba8a633e WIP 2015-01-30 14:42:58 -05:00
Jim Jagielski
e055ef03e5 Don't worry about these, and make sure we get length/size 2015-01-30 13:49:39 -05:00
Jim Jagielski
72ceb1d59a use common buffersize 2015-01-30 13:26:21 -05:00
Jim Jagielski
1384c5f543 Start w/ new parser 2015-01-30 13:24:02 -05:00
Jim Jagielski
0d069bdaab more PSR formatting 2015-01-30 11:11:31 -05:00
Jim Jagielski
a7cddb4945 formatting 2015-01-30 11:02:24 -05:00
Jim Jagielski
e210bf307a detab 2015-01-30 10:54:39 -05:00
Jim Jagielski
3634ac5442 PSR studlyCaps 2015-01-30 07:15:36 -05:00
Jim Jagielski
5a1058706d we use msg 2015-01-29 16:48:21 -05:00
Jim Jagielski
ae31708bb1 Unstale when we refresh, and not a cached message 2015-01-29 16:34:21 -05:00
Jim Jagielski
ac3ff14c55 pull in just the message body, as parsed. 2015-01-29 14:41:59 -05:00
Jim Jagielski
07daf5ebd7 and more stream goodness. 2015-01-29 14:08:44 -05:00
Jim Jagielski
41fe13b068 work around stream_copy_to_stream memory issues... 2015-01-29 13:44:03 -05:00
Jim Jagielski
8548f4d7e7 prepare subdir 2015-01-29 13:15:45 -05:00
Jim Jagielski
825b4c4a41 work thru attachs 2015-01-29 12:58:07 -05:00
Jim Jagielski
3a4dec0b9e all rets 2015-01-29 10:14:43 -05:00
Jim Jagielski
56dadda63b hash return 2015-01-29 10:09:54 -05:00
Jim Jagielski
719b7c402a we use header 2015-01-29 10:05:25 -05:00
Jim Jagielski
b4e90de73a Once we initially add it, allow for updates in same session 2015-01-29 10:05:01 -05:00
Jim Jagielski
a30c120955 stream logging 2015-01-29 09:21:07 -05:00
Jim Jagielski
c581c7c0a1 fix localname 2015-01-29 09:10:36 -05:00
Jim Jagielski
93aff54dee priority fixes 2015-01-29 08:47:04 -05:00
Jim Jagielski
ea8136f7e3 we are really concerned if the dir structure is flat or not 2015-01-29 06:26:41 -05:00
Jim Jagielski
774db4f2e0 localname is now the filename, not full path. We calc full path
when/if we need it.
2015-01-29 05:20:21 -05:00
Jim Jagielski
8179c27a0c always return tstreams rewound 2015-01-29 04:23:27 -05:00
Jim Jagielski
6613aef830 tune 2015-01-29 04:17:49 -05:00
Jim Jagielski
5bed11a465 Make the transition easier... fetch_structure is the key
to where we can either use a stream or string for the
body. By calling it with a string, we can maintain
the old flow while still allow for tuning elsewhere
as time progresses.
2015-01-29 04:10:41 -05:00
Jim Jagielski
d2f9b78250 allow maxmem to be changed 2015-01-29 03:41:09 -05:00
Jim Jagielski
72a265c9e4 Use a wrapper so we can adjust, universally, the max size. 2015-01-28 18:31:49 -05:00
Jim Jagielski
595eb90e5e for large strings, allow for use of php temp streams
to keep memory under control.
2015-01-28 18:00:18 -05:00
Jim Jagielski
5f21b85cf5 faster check 2015-01-28 16:36:02 -05:00
Jim Jagielski
80333e770a use temp streams and refactor to make it clear 2015-01-28 16:07:29 -05:00
Jim Jagielski
838c6c135a We need 2 options: create a full msg from a raw email message,
and just parse the body
2015-01-28 15:15:09 -05:00
Jim Jagielski
f742a1654c We need a better way to handle the local name... for sure,
storing complete path info is dangerous and screws with
migration.
2015-01-28 14:09:38 -05:00
Jim Jagielski
46de498473 better logging 2015-01-28 13:33:36 -05:00
Jim Jagielski
d21db3881c prevent err 2015-01-28 12:34:26 -05:00
Jim Jagielski
be93b05a0a not used 2015-01-28 12:27:40 -05:00
Jim Jagielski
ed0467f857 parse 2015-01-28 12:16:00 -05:00
Jim Jagielski
5cca22800e trans 2015-01-28 12:12:06 -05:00
Jim Jagielski
f13b220b48 start using uidl as key, instead of idx for some funcs 2015-01-28 10:35:21 -05:00
Jim Jagielski
af4aab5f8c indent 2015-01-27 16:32:39 -05:00
Jim Jagielski
44b08779a2 more simplyfication 2015-01-27 16:30:45 -05:00
Jim Jagielski
fdaee5becf easier way 2015-01-27 16:20:16 -05:00
Jim Jagielski
199394c4ff Fold all common JS into commonJS and eval as needed.
Yeah, I know. eval.
2015-01-27 16:00:29 -05:00
Jim Jagielski
d6034596b3 move this big block of js out. 2015-01-27 14:41:41 -05:00
Jim Jagielski
68265b5624 start attachments logic 2015-01-27 13:24:20 -05:00
Jim Jagielski
40e475aca9 only allow for send/edit 2015-01-27 13:02:33 -05:00
Jim Jagielski
3d5f8b62a3 reorg 2015-01-27 13:02:17 -05:00
Jim Jagielski
aa0a26784c new method: get_message() 2015-01-27 10:31:47 -05:00
Jim Jagielski
df1d442989 o more formatting
o new uniq_id method to make it even more unique and random
2015-01-26 15:58:15 -05:00
Jim Jagielski
554e1adf21 indent 2015-01-26 15:09:19 -05:00
Jim Jagielski
df9a1724cc style changes phpms 2015-01-26 14:54:15 -05:00
Jim Jagielski
312ceed643 Move all 3rd party tools/classes/add to vendor/ 2015-01-26 10:57:00 -05:00
Jim Jagielski
af64400860 simplify stringing 2015-01-26 10:48:16 -05:00
Jim Jagielski
326926d816 close parens 2015-01-26 10:31:00 -05:00
Jim Jagielski
3b191b0f36 better navigation 2015-01-26 10:09:50 -05:00
Jim Jagielski
2fc1437990 leverage UID FETCH 2015-01-23 07:56:07 -05:00
Jim Jagielski
9cd3131999 use a ref here, since listing messages may change folder[]
data behind the scenes
2015-01-22 16:10:52 -05:00
Jim Jagielski
8c44df2062 use flags[] 2015-01-22 10:31:43 -05:00
Jim Jagielski
4c8b49aab0 adjust to get names and emails 2015-01-22 09:17:14 -05:00
Jim Jagielski
a4cf9d3c61 restore serialize: For large datasets, it's much more expensive
to keep on parsing headers.
2015-01-22 07:58:55 -05:00
Jim Jagielski
8f10be26d7 Simplify:
1. No need for hparsed
 2. the serialize/unserialize is expensive. No need to store headers[]
 3. make message-id top level
2015-01-22 06:21:26 -05:00
Jim Jagielski
c60a642757 just grab 1st element 2015-01-21 17:58:57 -05:00
Jim Jagielski
0db8eee30f stop w/ refs... 2015-01-21 17:46:52 -05:00
Jim Jagielski
54889f33da and push 2015-01-21 17:24:09 -05:00
Jim Jagielski
fdfe640f94 Keep headers around as raw source 2015-01-21 17:11:17 -05:00
Jim Jagielski
f06faa899c fast path 2015-01-21 16:35:03 -05:00
Jim Jagielski
7256619afe put these back 2015-01-21 16:22:41 -05:00
Jim Jagielski
0aae9b2b71 i 2015-01-21 16:16:35 -05:00
Jim Jagielski
de74ce2985 use old uidl if exists 2015-01-21 16:02:14 -05:00
Jim Jagielski
ba8db42d13 fix w/ new array 2015-01-21 15:54:27 -05:00
Jim Jagielski
038f9c8ad1 parse headers only once and store away. No need to keep
raw headers in the DB.
2015-01-21 15:18:15 -05:00
Jim Jagielski
0e935c58bb knowledge of thread's parent 2015-01-21 12:41:49 -05:00
Jim Jagielski
2563e42c57 Add in method that parses output of imap THREAD 2015-01-21 08:53:49 -05:00
Michael Hill
9d315a7c80 Wireframes Update
Added the Inbox view
2015-01-18 19:47:17 -05:00
Michael Hill
0ab85e0756 Login
Added a wireframe for the login screen
2015-01-18 16:44:09 -05:00
Michael Hill
c87b94fae7 Wireframe
Initial wireframe for new client UI
2015-01-18 16:30:06 -05:00
Michael Hill
ba85e8e217 Screenshots
Screenshots of existing clients
2015-01-18 16:28:31 -05:00
Jim Jagielski
aa4d73a800 Better doc 2015-01-13 15:04:31 -05:00
Jim Jagielski
f517be9d49 phpdocs 2015-01-13 14:55:19 -05:00
Jim Jagielski
32daaee1ab Ordering 2015-01-10 13:25:22 -05:00
Jim Jagielski
0e1e99edd3 keep pag always 1, if not set 2015-01-10 11:45:34 -05:00
Jim Jagielski
e33e40638d now use keys 2015-01-10 11:43:23 -05:00
Jim Jagielski
aa0f0e2208 this is an int 2015-01-10 11:38:47 -05:00
Jim Jagielski
60b996523b make this def for now 2015-01-10 11:36:04 -05:00
Jim Jagielski
6dcab67520 Keep isset logic correct 2015-01-10 11:33:54 -05:00
Jim Jagielski
1e20bcc7e6 adjust 2015-01-10 11:24:45 -05:00
Jim Jagielski
ea948300da use tdb 2015-01-10 10:42:38 -05:00
Jim Jagielski
d3d866648d need correct path 2015-01-10 09:53:20 -05:00
Jim Jagielski
fc451a07e0 streamline 2015-01-10 09:42:46 -05:00
Jim Jagielski
c48be40970 first login fixes 2015-01-10 09:16:48 -05:00
Jim Jagielski
df7676b2b8 simplier 2015-01-09 13:32:50 -05:00
Jim Jagielski
a1570f6184 better sanitize user input and check for valid folder and
log them off if not.
2015-01-09 13:21:23 -05:00
Jim Jagielski
ecbacf46dc can't be neg 2015-01-09 13:02:02 -05:00
Jim Jagielski
9632ec8f75 always an int and at least 1 2015-01-09 13:00:57 -05:00
Jim Jagielski
990934ae5b use Smarty 3.1 methods 2015-01-09 12:43:57 -05:00
Jim Jagielski
510cb1e0d6 make these public 2015-01-09 12:24:46 -05:00
Jim Jagielski
26440bad8c forgot these 2015-01-09 12:07:30 -05:00
Jim Jagielski
9d0de036c6 foo 2015-01-09 11:43:38 -05:00
Jim Jagielski
eb1c45e67a Ugg. Only update on INSERTs 2015-01-09 11:14:20 -05:00
Jim Jagielski
4a31a23761 allow for capa_override to honor null which means "no change" 2015-01-09 10:54:24 -05:00
Jim Jagielski
0e796baf4e make checking and reseting staleness 2 sep actions 2015-01-09 09:47:44 -05:00
Jim Jagielski
f0ce9c2cf0 this does nothing 2015-01-09 09:31:36 -05:00
Jim Jagielski
0fc74c8505 typo 2015-01-09 09:28:25 -05:00
Jim Jagielski
4ed7d0e9cd null out old and update 2015-01-09 09:27:39 -05:00
Jim Jagielski
28488cf74e Better hash impl... Forgot about longer passwords :) 2015-01-08 20:19:34 -05:00
Jim Jagielski
013e7f3959 for future safety 2015-01-08 16:51:56 -05:00
Jim Jagielski
43469b81f4 more sql tuning 2015-01-08 16:49:22 -05:00
Jim Jagielski
fb108dc2ec OK, this is weird. For insert and updates, col names can
be escaped with ' fine, but in the WHERE section,
col names surrounded with ' silently fail, but you can
surround w/ " or [].

Sooooo unless we know for sure what col names are
used, protect the SET/UPDATE parts with ' and
the col names for WHERE with "
2015-01-08 16:26:33 -05:00
Jim Jagielski
0821f400bd WHERE fields die w/ quotes 2015-01-08 16:09:07 -05:00
Jim Jagielski
e754b218bc fix 2015-01-08 15:16:44 -05:00
Jim Jagielski
477f638802 allow false 2015-01-08 15:01:12 -05:00
Jim Jagielski
ba549d8d6f ensure local is OK, since we are using += 2015-01-08 14:50:10 -05:00
Jim Jagielski
7060ece0d9 put Local into Telaen itself 2015-01-08 14:24:22 -05:00
Jim Jagielski
e4e3bb0100 disable for now 2015-01-08 14:07:15 -05:00
Jim Jagielski
05cf6444ab we dont need to explicitly log in 2015-01-08 14:07:02 -05:00
Jim Jagielski
e966bd126b Send CAPA before we login, to get login capabilities 2015-01-08 14:06:28 -05:00
Jim Jagielski
f9bdb6ec11 don't auto size folder 2015-01-08 11:56:15 -05:00
Jim Jagielski
7311333338 and protect 2015-01-08 10:24:46 -05:00
Jim Jagielski
00629ea1fe skip blank lines 2015-01-08 10:23:28 -05:00
Jim Jagielski
f552972b0a since we are baselining php5.4, use the newer [] array format 2015-01-08 10:10:13 -05:00
Jim Jagielski
babc25f091 add in auto-login capability for sending commands. 2015-01-08 09:55:52 -05:00
Jim Jagielski
6588bb980b debug/log the DB functions 2015-01-08 08:34:05 -05:00
Jim Jagielski
713fddc55c Use whatever fields are there if we need to create some
random uidl
2015-01-08 08:05:31 -05:00
Jim Jagielski
e5e8f27f53 debug to file 2015-01-08 07:43:53 -05:00
Jim Jagielski
30c4433446 comments 2015-01-08 07:43:46 -05:00
Jim Jagielski
4599aef0bf Use destructors for clean shutdown (and sync) 2015-01-07 23:01:47 -05:00
Jim Jagielski
cb8865256e better check 2015-01-07 23:01:30 -05:00
Jim Jagielski
196e997a3f comments and sizing 2015-01-07 18:20:56 -05:00
Jim Jagielski
6b33094c2e use positional since markers w/ '-' and '_' are nasty 2015-01-07 17:36:18 -05:00
Jim Jagielski
2032ff9d0f arrays need serialization 2015-01-07 15:56:42 -05:00
Jim Jagielski
46bcae81a0 minor fixes 2015-01-07 15:08:38 -05:00
Jim Jagielski
949f17808c needs access 2015-01-07 14:57:37 -05:00
Jim Jagielski
f6bbcbef77 Fix 2015-01-07 14:46:50 -05:00
Jim Jagielski
0d760b69cd safer feof 2015-01-07 14:43:18 -05:00
Jim Jagielski
976a40d96b push 2015-01-07 14:23:50 -05:00
Jim Jagielski
8226c10675 oops... not python 2015-01-07 13:52:44 -05:00
Jim Jagielski
802cfe48e2 this is way easier now 2015-01-07 13:36:42 -05:00
Jim Jagielski
a27b35ab10 bypass until we better figure out the logic 2015-01-07 13:30:37 -05:00
Jim Jagielski
417e060993 better prep 2015-01-07 13:28:28 -05:00
Jim Jagielski
5eb492f565 And CRAM-MD5 for pop3 as well. 2015-01-07 13:08:27 -05:00
Jim Jagielski
93f18e214a CRAM-MD5 auth for imap 2015-01-07 12:32:35 -05:00
Jim Jagielski
06fe3b2146 whenever we add/update/rm a message, be sure to
update the folders entries as needed. Sync when
required
2015-01-07 10:18:18 -05:00
Jim Jagielski
6afdc32584 new_folder should just use do_insert 2015-01-07 09:11:03 -05:00
Jim Jagielski
b259bb6370 we no longer restrict folder names to something soooo simple 2015-01-07 08:50:14 -05:00
Jim Jagielski
752dfc3db2 urlencode as needed 2015-01-07 08:44:36 -05:00
Jim Jagielski
7321046112 config cleanup / not used 2015-01-07 08:33:10 -05:00
Jim Jagielski
13032fd52c start handling IMAP-7 folder names 2015-01-07 08:30:23 -05:00
Jim Jagielski
8fe20c7385 We need safe dir names, since we will be allowing
all valid UTF-IMAP folder/box names.
2015-01-07 08:00:00 -05:00
Jim Jagielski
9444ab5164 reflow 2015-01-06 20:37:34 -05:00
Jim Jagielski
4494eb2390 reflow 2015-01-06 20:28:35 -05:00
Jim Jagielski
2dcdd0cbb4 rename 2015-01-06 20:27:30 -05:00
Jim Jagielski
149b093865 typo 2015-01-06 20:22:01 -05:00
Jim Jagielski
071f8d7bcf Streamline checking 2015-01-06 20:21:36 -05:00
Jim Jagielski
8ff68b1c69 allow for unread to be stored and determined when grabbing the stored messge 2015-01-06 18:22:47 -05:00
Jim Jagielski
357dde752c use boolean 2015-01-06 17:53:55 -05:00
Jim Jagielski
ae21c5dea3 Start on grand refreshing 2015-01-06 17:51:30 -05:00
Jim Jagielski
fb8de2730f logical and consist naming 2015-01-06 16:45:41 -05:00
Jim Jagielski
e9310a3c7b Use if avail 2015-01-06 16:31:18 -05:00
Jim Jagielski
15201c8404 use correct appversion 2015-01-06 16:24:04 -05:00
Jim Jagielski
76e5eb209b update configs 2015-01-06 16:16:41 -05:00
Jim Jagielski
cf1d13e2c5 put in class 2015-01-06 16:04:41 -05:00
Jim Jagielski
9c824e7673 accept refs 2015-01-06 15:47:44 -05:00
Jim Jagielski
8055580554 make links work 2015-01-06 15:28:43 -05:00
Jim Jagielski
26d73fbaa7 inf loop 2015-01-06 15:17:26 -05:00
Jim Jagielski
fc21849628 We don't tuck these away in the session 2015-01-06 15:10:36 -05:00
Jim Jagielski
1a215908cf keep secret 2015-01-06 14:45:42 -05:00
Jim Jagielski
caeae84c51 correct name 2015-01-06 14:18:52 -05:00
Jim Jagielski
3332892681 fix is_dir weirdness 2015-01-06 14:07:39 -05:00
Jim Jagielski
d483e2ad5d fix method 2015-01-06 13:38:26 -05:00
Jim Jagielski
6786d9833a Use isset 2015-01-06 13:28:38 -05:00
Jim Jagielski
4c04b802f0 Do later on 2015-01-06 13:10:57 -05:00
Jim Jagielski
299f531ff9 fix determination 2015-01-06 12:51:44 -05:00
Jim Jagielski
7f925e199d for now 2015-01-06 12:44:12 -05:00
Jim Jagielski
05d9e1a94e correct return val 2015-01-06 12:29:49 -05:00
Jim Jagielski
4a5eddb407 refresh the logic here. Use consitent naming and allow for ignored fields 2015-01-06 12:03:18 -05:00
Jim Jagielski
3e5c5c4325 create new for each 2015-01-06 10:31:45 -05:00
Jim Jagielski
ee31968558 no need to create large arrays if not needed 2015-01-06 10:28:31 -05:00
Jim Jagielski
f78a154313 style change 2015-01-06 09:47:27 -05:00
Jim Jagielski
1d100537ab use ours 2015-01-06 09:46:26 -05:00
Jim Jagielski
c560bd5037 better error 2015-01-06 09:45:21 -05:00
Jim Jagielski
771324d15e ensure perms 2015-01-06 09:20:59 -05:00
Jim Jagielski
ff096f7049 more uidl/uid changes and allow for subdirs for local storage
of messages
2015-01-06 09:08:33 -05:00
Jim Jagielski
a4920cf149 Adjust so we can still honor old uidl's, but start using
what the servers provide
2015-01-06 00:30:54 -05:00
Jim Jagielski
be8f867747 check as well for false, not just null 2015-01-05 20:44:01 -05:00
Jim Jagielski
958a1c2ee9 faster listing of messages for POP3 2015-01-05 18:38:45 -05:00
Jim Jagielski
43ae91b4fc start streamlining the spam stuff w/ the view window 2015-01-05 15:31:49 -05:00
Jim Jagielski
1d8b13e7f1 folders should be added via array 2015-01-05 14:12:46 -05:00
Jim Jagielski
567b8e2545 Make Telaen itself smart enough about the refresh-time. 2015-01-05 12:48:25 -05:00
Jim Jagielski
b9cd559fb8 Adjust listing of messages. Note that messages can be on the
email server (and not local) or on the webmail server (and
this local). So read in from the email server and then
load in all messages stored locally for the email folder.
After this, the DB will match what's local, and we won't need
to do that again.
2015-01-05 11:56:17 -05:00
Jim Jagielski
46315af9d2 abstract out hashing 2015-01-03 18:15:33 -05:00
Jim Jagielski
775ed351e8 When obtaining UIDL for POP, tuck away stuff we've
gone ahead and obtained.
2015-01-03 12:32:24 -05:00
Jim Jagielski
04306934e1 Allow for actual changing by calling by ref 2015-01-03 12:31:41 -05:00
Jim Jagielski
600ec2a16c faster 2015-01-03 12:07:27 -05:00
Jim Jagielski
654f382cb9 The hash('md5'..) vector is faster than md5() 2015-01-03 11:26:21 -05:00
Jim Jagielski
9517c51d12 md5 looks even faster, and helps avoid collisions w/
small strings (such as folder names).
2015-01-03 11:18:04 -05:00
Jim Jagielski
a51f8c1d4c adler32 is much faster 2015-01-03 11:11:14 -05:00
Jim Jagielski
08ddeea668 Add in STLS/STARTTLS capability, and streamline command check 2015-01-02 16:13:45 -05:00
Jim Jagielski
6f3a06394b use better field name 2015-01-02 15:00:47 -05:00
Jim Jagielski
fbea97f3d8 Handle clean, virgin copies of db as required 2015-01-02 14:18:24 -05:00
Jim Jagielski
c689f690e0 simplify 2015-01-02 13:47:43 -05:00
Jim Jagielski
e2a364c336 Abstract out location of user data folder. 2015-01-02 13:32:24 -05:00
Jim Jagielski
cffc2d85e1 Add some design notes 2015-01-01 15:58:13 -05:00
Jim Jagielski
de93d7834b Start usage of "uidl" as key for all messages. 2015-01-01 14:20:57 -05:00
Jim Jagielski
3f1c22468c some phpdocs 2015-01-01 12:24:24 -05:00
Jim Jagielski
52ac255e08 addtl tests 2015-01-01 12:04:24 -05:00
Jim Jagielski
1a243bfed2 allow force_* to force anything 2014-12-31 13:26:53 -05:00
Jim Jagielski
da89dfd4c5 force sync 2014-12-29 10:48:07 -05:00
Jim Jagielski
9aab9482ec comment 2014-12-29 09:48:58 -05:00
Jim Jagielski
e703b2f6d7 Allow sanitize as static and use as needed / start migration to htmLawed 2014-12-29 09:47:54 -05:00
Jim Jagielski
a8fa7fd196 Allow (default) use of htmLawed for HTML sanitization. 2014-12-29 09:23:12 -05:00
Jim Jagielski
ef803ffbe4 refactor 2014-12-27 23:18:39 -05:00
Jim Jagielski
2a4f0b9320 PSR2 2014-12-27 22:45:35 -05:00
Jim Jagielski
856813c9f1 refresh 2014-12-27 20:14:22 -05:00
Jim Jagielski
a96fb3f923 updates for custom filter... some from sq 2014-12-27 19:42:11 -05:00
Jim Jagielski
3af36e7e0d make todo 2014-12-19 16:27:57 -05:00
Jim Jagielski
22f1fc1880 Updates 2014-12-19 16:27:37 -05:00
Jim Jagielski
4435c48495 simplify and comment 2014-12-19 11:47:30 -05:00
Jim Jagielski
6ad2c24072 And can be static, so use as such 2014-12-19 09:37:09 -05:00
Jim Jagielski
11b245aa40 these are useful. Externalize 2014-12-19 09:34:57 -05:00
Jim Jagielski
201dd37d24 cont: baseline UTF-8 2014-12-19 07:12:39 -05:00
Jim Jagielski
6779071c34 update 2014-12-18 16:23:22 -05:00
Jim Jagielski
ae1afd9c05 Baseline UTF8 and convert only as needed. 2014-12-18 15:55:52 -05:00
Jim Jagielski
2227a1c386 Another function check 2014-12-18 15:55:39 -05:00
Jim Jagielski
3bd8d79d09 streamline 2014-12-18 11:28:11 -05:00
Jim Jagielski
826c4e9ffa Put empty/not-yet-translated files into todo folder and
prevent us from "seeing"/using them for now
2014-12-18 10:29:57 -05:00
Jim Jagielski
37862e04be Updates 2014-12-18 10:26:56 -05:00
Jim Jagielski
b9aff05aa8 more ui 2014-12-18 09:22:42 -05:00
Jim Jagielski
9b676d460e some ui changes 2014-12-18 09:11:03 -05:00
Jim Jagielski
fa693a5412 Add in ckeditor as possible editor 2014-12-18 08:03:42 -05:00
Jim Jagielski
51db972d24 Update NOTICE 2014-12-18 08:03:19 -05:00
Jim Jagielski
c41c261cdf fix tst 2014-12-17 10:28:44 -05:00
Jim Jagielski
c583d79e8f require smarty3 2014-12-17 10:10:31 -05:00
Jim Jagielski
029df00d85 Some nits detected by PhpStorm 2014-12-15 15:51:05 -05:00
Jim Jagielski
1111ed3a58 no idea why this was a string 2014-12-15 13:40:21 -05:00
Jim Jagielski
af2fe222bd Simplify. 2014-12-15 11:57:25 -05:00
Jim Jagielski
fb463abdf7 comment use 2014-12-15 09:22:48 -05:00
Jim Jagielski
1417c140f5 Re-use prepared when we can 2014-12-15 09:02:45 -05:00
Jim Jagielski
ef38213ea1 use prepared statements for most quesries. Be sure to close them 2014-12-15 08:27:28 -05:00
Jim Jagielski
72eb53bb10 refactor 2014-12-15 07:49:35 -05:00
Jim Jagielski
9e3cd4ef07 canonical version check 2014-12-15 07:17:28 -05:00
Jim Jagielski
7f362ade92 reuse 2014-12-14 20:12:43 -05:00
Jim Jagielski
940000e98c More 2014-12-14 19:09:21 -05:00
Jim Jagielski
82753d910a better cleanups on 1st session login(auth) 2014-12-14 16:32:06 -05:00
Jim Jagielski
7d15549881 Allow for us to also force a recreate of DB files as needed/required 2014-12-14 16:31:31 -05:00
Jim Jagielski
bbed539ca3 these should be in default_prefs and allow for
system-wide setting/enforcing
2014-12-14 14:52:50 -05:00
Jim Jagielski
25c4921d13 save some time, for LARGE emailboxes 2014-12-14 14:52:22 -05:00
Jim Jagielski
9d8216c733 iAnother old file 2014-12-14 14:51:36 -05:00
Jim Jagielski
3386cab8b5 more restruct 2014-12-12 16:04:46 -05:00
Jim Jagielski
23a79cd74c clean-up... the internal/local syncs are done internally 2014-12-12 14:53:28 -05:00
Jim Jagielski
874baefb68 We need to create/update the size when we first
create the folders array. After that, it will be
done automatically
2014-12-12 14:42:52 -05:00
Jim Jagielski
7af7a97c12 New method to allow for size to be part of the info 2014-12-12 14:11:33 -05:00
Jim Jagielski
86ffc80848 Hmmm name 2014-12-12 12:45:49 -05:00
Jim Jagielski
e54925eeaa Add count)headers() 2014-12-12 12:45:04 -05:00
Jim Jagielski
5f445fb607 LocalMbox is required 2014-12-12 12:17:20 -05:00
Jim Jagielski
a40dea9b8b Align w/ folder_list 2014-12-12 11:07:00 -05:00
Jim Jagielski
c979ca6a83 setup sys folders 2014-12-12 10:47:40 -05:00
Jim Jagielski
075d45debc use standard message 2014-12-12 10:36:23 -05:00
Jim Jagielski
53de9de1a2 Safe print the text 2014-12-12 10:36:04 -05:00
Jim Jagielski
804751c121 move auth to init 2014-12-12 10:09:51 -05:00
Jim Jagielski
58d61947b1 protect prefs 2014-12-12 09:09:11 -05:00
Jim Jagielski
42638d02c2 Use similar keys so that we can add to the default_prefs hash
with no real other code changes
2014-12-12 08:54:15 -05:00
Jim Jagielski
ce0d3c21bd Adjust for better naming 2014-12-12 08:30:18 -05:00
Jim Jagielski
176859bdd3 No ending ')' 2014-12-12 08:19:51 -05:00
Jim Jagielski
d98e7f19ab use common naming 2014-12-05 15:15:22 -05:00
Jim Jagielski
4e855eb22f missed some 2014-12-05 15:00:49 -05:00
Jim Jagielski
96c5153e91 use prepared statements and a more useful/cleaner approach 2014-12-05 14:51:35 -05:00
Jim Jagielski
46975ebb53 Code re-use... restruct 2014-12-04 18:37:30 -05:00
Jim Jagielski
7b155d4549 reflow 2014-12-04 17:12:57 -05:00
Jim Jagielski
6275518573 New pref... 2014-12-04 17:03:47 -05:00
Jim Jagielski
089d2142e4 Lives in config 2014-12-04 17:03:04 -05:00
Jim Jagielski
581a411ec1 Don't bother syncing/updating DB until we have to.
Instead, tuck away all changes until needed
2014-12-04 16:18:38 -05:00
Jim Jagielski
36f0db1ae3 some refinements 2014-12-04 14:55:52 -05:00
Jim Jagielski
a7d3a7b25f Major work... in progress 2014-12-04 13:31:11 -05:00
Jim Jagielski
30a0a0cf76 Restruct:
isset is faster than array_key_exists
 Mbox forms
2014-12-04 10:39:33 -05:00
Jim Jagielski
29e39b0e90 n 2014-12-03 21:13:33 -05:00
Jim Jagielski
1258bdebaf prep 2014-12-03 21:11:02 -05:00
Jim Jagielski
b5ab46506e tester 2014-12-03 21:03:42 -05:00
Jim Jagielski
f07f424d0d push 2014-12-03 17:13:28 -05:00
Jim Jagielski
c2191d5740 move to using sqlite3, which is default in PHP 5.4+ AND is quicker
than using arrays and serialize/etc
2014-12-03 17:07:33 -05:00
Jim Jagielski
465f495d6b need global 2014-12-03 15:34:12 -05:00
Jim Jagielski
7d7d6ed35a naming convention 2014-12-03 15:29:35 -05:00
Jim Jagielski
6bb5d2394d work around 2014-12-03 14:50:26 -05:00
Jim Jagielski
61b533fe9c Since we require a 5.4 PHPMailer, we no longer need this 2014-12-03 14:23:43 -05:00
Jim Jagielski
f9fca60e19 need this 2014-12-03 14:09:31 -05:00
Jim Jagielski
71636b844f more 2014-12-03 14:04:03 -05:00
Jim Jagielski
d222728fac fix 2014-12-03 14:00:56 -05:00
Jim Jagielski
1796b8f295 Some adj 2014-12-03 13:51:29 -05:00
Jim Jagielski
705c125f09 This slows things WAY down 2014-12-03 13:32:44 -05:00
Jim Jagielski
27b5e62172 t 2014-12-03 13:10:18 -05:00
Jim Jagielski
9d2813e56d test 2014-12-03 13:03:40 -05:00
Jim Jagielski
066d6009cb push 2014-12-03 12:42:36 -05:00
Jim Jagielski
734f92c268 better awareness of connected and auth status 2014-12-03 12:30:19 -05:00
Jim Jagielski
8f79ee4df8 use members 2014-12-03 10:55:40 -05:00
Jim Jagielski
57a797b6ac use static 2014-12-03 10:42:31 -05:00
Jim Jagielski
bd5d575e72 not a variable 2014-12-03 10:40:25 -05:00
Jim Jagielski
25ec3b5a11 remove debug 2014-12-03 10:36:33 -05:00
Jim Jagielski
4d837f2728 Some event tuning 2014-12-03 10:13:03 -05:00
Jim Jagielski
8f99d3c4b9 colspan 2014-12-03 09:25:11 -05:00
Jim Jagielski
2d2c791ee5 clean up 2014-12-03 09:19:07 -05:00
Jim Jagielski
1555632f71 some fixes 2014-12-03 09:18:58 -05:00
Jim Jagielski
8ac4c61b51 changes w/ tmce4 2014-12-03 08:26:32 -05:00
Jim Jagielski
356941f615 new tiny 2014-12-03 08:06:41 -05:00
Jim Jagielski
b317e9c5d8 Correct location 2014-12-03 07:52:36 -05:00
Jim Jagielski
d6ae432d34 !exists 2014-12-03 07:35:59 -05:00
Jim Jagielski
99e0dbd56a more methods 2014-12-03 07:35:00 -05:00
Jim Jagielski
3d568f7c2c Updates 2014-12-03 07:29:39 -05:00
Jim Jagielski
e6ada8a049 refresh 2014-12-02 16:08:18 -05:00
Jim Jagielski
e7ba1ca633 use index 2014-12-02 16:02:04 -05:00
Jim Jagielski
48b041947a keep case of folders 2014-12-02 15:57:27 -05:00
Jim Jagielski
8d12d958d8 use canon 2014-12-02 15:17:40 -05:00
Jim Jagielski
1f669d82ef no need for base64 of folders 2014-12-01 11:16:17 -05:00
Jim Jagielski
e599b028eb some refinements... no more base64 2014-12-01 10:31:35 -05:00
Jim Jagielski
cfafefbfc8 n 2014-12-01 09:57:28 -05:00
Jim Jagielski
41e5a77e5c oops 2014-12-01 09:56:26 -05:00
Jim Jagielski
303c9c7343 use self:: version 2014-12-01 09:55:17 -05:00
Jim Jagielski
916f123e47 use correct prefs 2014-12-01 09:50:40 -05:00
Jim Jagielski
a45baeb870 missed more config[] 2014-12-01 09:42:23 -05:00
Jim Jagielski
eda6519d4b Just safe the filename 2014-12-01 09:18:12 -05:00
Jim Jagielski
b7ce204cfb Some missed changes 2014-12-01 09:10:11 -05:00
Jim Jagielski
200ea78f6e default 2014-12-01 09:02:57 -05:00
Jim Jagielski
fafb2f48a2 and work 2014-11-28 14:57:09 -05:00
Jim Jagielski
3583b33d0b Adjust 2014-11-28 14:55:41 -05:00
Jim Jagielski
d81c830a19 And adjust all refs to point to ./inc/themes 2014-11-28 14:53:59 -05:00
Jim Jagielski
a93e0ffc50 more reorg... all supl files place in inc, for security and
other reasons.
2014-11-28 14:42:53 -05:00
Jim Jagielski
7958cba63e And the installer checker 2014-11-27 12:27:51 -05:00
Jim Jagielski
1d02f15299 name change 2014-11-27 12:27:21 -05:00
Jim Jagielski
60d977b601 Rework to allow for other prefs and configs 2014-11-27 12:25:24 -05:00
Jim Jagielski
b0a30bb696 some 1.7.2 backports 2014-11-26 19:30:01 -05:00
Jim Jagielski
7c5de78610 and populate 2014-11-26 17:24:21 -05:00
Jim Jagielski
b9268dd089 rename 2014-11-26 17:22:57 -05:00
Jim Jagielski
4bf03f0f88 update 2014-11-26 17:21:28 -05:00
Jim Jagielski
be9e7d1beb Use canon suffix for smarty templates 2014-11-26 12:26:54 -05:00
Jim Jagielski
d0442b4e6e another xlation 2014-11-26 12:04:23 -05:00
Jim Jagielski
5ba7dc2041 2 possible xlations 2014-11-26 09:45:34 -05:00
Jim Jagielski
a6c856d616 Make dev easier 2014-11-26 09:45:23 -05:00
Jim Jagielski
0c0bd09f3e missed some more config[] stuff 2014-11-26 08:44:14 -05:00
Jim Jagielski
c595313c67 fix 2014-11-26 08:37:20 -05:00
Jim Jagielski
ce05b7e6d3 and more 2014-11-26 08:33:19 -05:00
Jim Jagielski
9a1b4f388a more config 2014-11-26 08:31:09 -05:00
Jim Jagielski
f2bb0b3ace these are now in config 2014-11-26 08:23:49 -05:00
Jim Jagielski
9f5533e604 move around 2014-11-26 08:19:36 -05:00
Jim Jagielski
bdb2757565 correct path 2014-11-26 08:15:42 -05:00
Jim Jagielski
06e8ae017d prep 2014-11-26 08:10:03 -05:00
Jim Jagielski
f85051f5a1 OK, enough for now. 2014-11-25 08:12:30 -05:00
Jim Jagielski
82f6312b82 Just create a file which are the diffs between
their old config and our defaults
2014-11-23 10:55:18 -05:00
Jim Jagielski
951a3808c6 standard html formatting for themes 2014-11-23 09:02:35 -05:00
Jim Jagielski
a0333bd466 use css for close box 2014-11-22 23:30:18 -05:00
Jim Jagielski
51a668e6e8 some css niceness 2014-11-22 23:14:33 -05:00
Jim Jagielski
bf14398272 Be extra safe 2014-11-22 14:10:23 -05:00
Jim Jagielski
eb86acf363 print out on browser 2014-11-22 08:43:07 -05:00
Jim Jagielski
225fd79a64 finals for now 2014-11-21 18:23:21 -05:00
Jim Jagielski
d539e6d71d snicker 2014-11-21 17:07:11 -05:00
Jim Jagielski
825fe69027 Have the check script also try to create a replacement
config file
2014-11-21 16:48:29 -05:00
Jim Jagielski
de0462ba29 oops 2014-11-21 15:42:25 -05:00
Jim Jagielski
0dbc8a65b1 fix default 2014-11-21 15:20:38 -05:00
Jim Jagielski
a92d90c82e Don't define 2014-11-21 15:15:49 -05:00
Jim Jagielski
0f1c1c87b4 some fixes 2014-11-21 14:43:16 -05:00
Jim Jagielski
0adb94062c why rename?? 2014-11-21 14:11:12 -05:00
Jim Jagielski
c57441de92 iwip 2014-11-21 14:10:48 -05:00
Jim Jagielski
4a1f8fec60 start updgrade notes and scripr 2014-11-21 13:56:56 -05:00
Jim Jagielski
6837c18c88 Some reorg 2014-11-21 12:48:21 -05:00
Jim Jagielski
26b7faac62 old fluff 2014-11-21 12:40:10 -05:00
Jim Jagielski
d658e4f543 rename 2014-11-21 12:39:37 -05:00
Jim Jagielski
2251ed3caf avoid use of base64... why?? 2014-11-21 12:26:24 -05:00
Jim Jagielski
aa9d27909e wip status 2014-11-21 11:39:01 -05:00
Jim Jagielski
b457490e81 And start moving from external old lib.php funcs to
telaen methods
2014-11-21 10:47:45 -05:00
Jim Jagielski
af90fbe629 Start process of having Telaen process/load/save
config and prefs, etc... centralize
2014-11-21 10:02:04 -05:00
Jim Jagielski
4df2898178 Start process of removing lib.php and pull funcs
into Telaen_core (or Telaen) as needed
2014-11-21 09:12:33 -05:00
Jim Jagielski
7da23115e9 formatting style 2014-11-21 07:28:58 -05:00
Jim Jagielski
c3e33d9e1e some language updates 2014-11-21 06:57:11 -05:00
Jim Jagielski
13accea36f n/a 2014-11-20 18:44:13 -05:00
Jim Jagielski
1b2e7c7d7b Wrond func 2014-11-20 18:40:33 -05:00
Jim Jagielski
325ba9f105 ttoreply_quote 2014-11-20 18:35:01 -05:00
Jim Jagielski
e9d9d1bbed Ups 2014-11-20 18:33:29 -05:00
Jim Jagielski
65008ddfc1 And the compl reverse function. Keep naming somewhat
consistent
2014-11-20 16:42:41 -05:00
Jim Jagielski
788e2ce142 use '' when you can instead of "" 2014-11-20 16:06:39 -05:00
Jim Jagielski
17677f03e4 Start conversion to using bytes internally for all size 2014-11-20 16:06:08 -05:00
Jim Jagielski
d7ab5fcbd1 Use the actual old smarty code 2014-11-20 15:16:32 -05:00
Jim Jagielski
a8c3518e4f rushing is bad 2014-11-20 15:09:27 -05:00
Jim Jagielski
2ae7c7cc2e minor 2014-11-20 15:06:29 -05:00
Jim Jagielski
430ccb93e0 No longer use smarty function, but work around cases
where it might be pre-installed from Telaen 1.x
2014-11-20 15:02:02 -05:00
Jim Jagielski
cc46951f8f Fix! 2014-11-20 14:58:16 -05:00
Jim Jagielski
5d4cf76552 not needed yet 2014-11-20 14:16:08 -05:00
Jim Jagielski
270bfdc470 Use correct lang[] entries (no longer global vars)
Decrease some NOTICE
2014-11-20 14:07:09 -05:00
Jim Jagielski
ef4f73f8d2 more refactor w/ namespace 2014-11-19 17:32:41 -05:00
Jim Jagielski
9750e2b230 Some more safety bits 2014-11-19 15:58:56 -05:00
Jim Jagielski
8fa5e4b512 state 2014-11-19 13:56:10 -05:00
Jim Jagielski
87c8608c97 standard syntax 2014-11-19 13:47:16 -05:00
Jim Jagielski
6847c6f91c just in case ;) 2014-11-19 13:40:37 -05:00
Jim Jagielski
d496f9cfa7 simplify 2014-11-19 13:17:53 -05:00
Jim Jagielski
2ea7c885ef remove cruft 2014-11-19 12:41:42 -05:00
Jim Jagielski
40ff0b651d more login fooness 2014-11-19 11:53:43 -05:00
Jim Jagielski
434271b945 maintain switch of theme 2014-11-19 10:59:24 -05:00
Jim Jagielski
e3c1886705 strings as keys 2014-11-19 10:28:42 -05:00
Jim Jagielski
bb7e47e591 more case foo 2014-11-19 10:14:52 -05:00
Jim Jagielski
4ee3f88bc9 Hmmm casing isn't adjusted! 2014-11-19 10:12:09 -05:00
Jim Jagielski
ae9f8a65a2 more 2014-11-19 10:09:27 -05:00
Jim Jagielski
10c2eac11c Some nits from lang transition 2014-11-19 09:37:47 -05:00
Jim Jagielski
b912bbe751 Some fluff 2014-11-19 09:11:31 -05:00
Jim Jagielski
53650956a1 Use direct labels... faster 2014-11-19 08:55:16 -05:00
Jim Jagielski
23de0e4eba Make login aware of changes 2014-11-19 07:59:57 -05:00
Jim Jagielski
587ef53a17 low hanging fruit 2014-11-19 07:31:43 -05:00
Jim Jagielski
266933dd34 freshen up 2014-11-18 21:15:40 -05:00
Jim Jagielski
ceca949fc9 More xlation changes 2014-11-18 20:49:36 -05:00
Jim Jagielski
0ed11734bb Some works in progress 2014-11-18 20:06:36 -05:00
Jim Jagielski
fedb692d78 Some translations and some blank ones... mostly blank
so far.
2014-11-18 17:49:54 -05:00
Jim Jagielski
9cbfe9af94 update w/ reformat 2014-11-18 15:59:52 -05:00
Jim Jagielski
a90b4a6538 start process of better translations 2014-11-18 14:12:26 -05:00
Jim Jagielski
053465b8b9 add Phone, Cell and Notes.
Trans for filters
2014-11-18 11:57:35 -05:00
Jim Jagielski
f1586724e2 Extend filters to header and body (expensive!) 2014-11-18 10:42:19 -05:00
Jim Jagielski
05af2e2aee page aware addressbook 2014-11-18 10:27:28 -05:00
Jim Jagielski
452064a6b0 whitespace 2014-11-18 09:32:28 -05:00
Jim Jagielski
aedda0ea03 whitespace 2014-11-17 10:40:25 -05:00
Jim Jagielski
93820360de alignment 2014-11-17 08:27:16 -05:00
Jim Jagielski
70099d2821 PSR0 2014-11-16 19:13:35 -05:00
Jim Jagielski
b3485bc4fc PSR0 2014-11-16 19:11:55 -05:00
Jim Jagielski
142ce340f5 Revert class names 2014-11-16 19:09:58 -05:00
Jim Jagielski
3978c99588 more PSR2 fixes 2014-11-16 19:04:46 -05:00
Jim Jagielski
ef95e657c4 PSR2 fixes 2014-11-16 19:02:19 -05:00
Jim Jagielski
53e03a1344 trigger errors instead of non-existant "message" 2014-11-15 09:46:54 -05:00
Jim Jagielski
a4497e285d Just in case, define safe_print right before the error handler.
It's still globally available to everyone.
2014-11-14 17:18:33 -05:00
Jim Jagielski
497b662c8c compressor init no longer needed 2014-11-14 14:03:14 -05:00
Jim Jagielski
cdf1d5151a make Smarty's compiled dir its own subdir 2014-11-14 13:37:41 -05:00
Jim Jagielski
4f9bb9ba8b minor fluff 2014-11-14 13:25:32 -05:00
Jim Jagielski
e0f77fd61e provide correct patch 2014-11-14 12:36:48 -05:00
Jim Jagielski
c7709cb18c Scope issues
foreach and false w/ iCalCreator
Smarty3 uses difference method to grab vars
2014-11-14 12:30:34 -05:00
Jim Jagielski
817f3cf14e Push cal updates 2014-11-14 11:49:09 -05:00
Jim Jagielski
e6544df4b4 reset to working 2014-11-14 11:12:21 -05:00
Jim Jagielski
c654bda6b2 UC 2014-11-14 11:07:38 -05:00
Jim Jagielski
264fd1eba2 oops 2014-11-14 10:42:21 -05:00
Jim Jagielski
696c30cc60 nits 2014-11-14 10:40:20 -05:00
Jim Jagielski
2fff17bbc5 Simple debugging 2014-11-14 10:20:40 -05:00
Jim Jagielski
4ec24f65e6 more style changes: use ' when appropriate 2014-11-14 09:10:00 -05:00
Jim Jagielski
7140d3252b style changes: Use ' when appropriate 2014-11-14 08:38:11 -05:00
Jim Jagielski
797f204420 Add safe_print function
We only work w/ 5.4 and later
2014-11-14 07:53:59 -05:00
Jim Jagielski
7ec6778560 Sometimes we need to check for an EXPLICIT error from the server,
and sometimes an EXPLICIT OK response... for example, when
scarfing data, we want to check that we didn't get an error
(and if we did, then skip out) but keep on scarfing until
we get the final OK.
2014-11-13 17:32:14 -05:00
Jim Jagielski
da88aa075f Restruct 2014-11-13 17:00:47 -05:00
Jim Jagielski
7c18b47b8d Restructure the capabilities and override aspects 2014-11-13 16:11:24 -05:00
Jim Jagielski
03146ecf08 Streamline checking of email server response code
Use stream for connection
Obtain both POP3 CAPA and IMAP CAPABILITY
2014-11-13 15:29:33 -05:00
Jim Jagielski
64c03c58c0 perms 2014-11-13 12:14:55 -05:00
Jim Jagielski
9f2cf98a2d Update tinymce 2014-11-13 12:13:35 -05:00
Jim Jagielski
f9c24981d2 Latest Smarty 2014-11-13 11:56:38 -05:00
Jim Jagielski
ffa161e3eb PHP5 class contructor 2014-11-13 11:38:00 -05:00
Jim Jagielski
6e26aeffd9 Error handling 2014-11-13 11:23:17 -05:00
Jim Jagielski
57cfe7d74c sync w/ 1.3.2 release 2014-11-13 07:49:46 -05:00
Jim Jagielski
98989e0a7c Reorg to be more composer compatible (future growth) 2014-11-12 19:52:03 -05:00
Jim Jagielski
c04a0eee21 streamline decision tree 2014-11-12 14:58:06 -05:00
Jim Jagielski
20d45f2369 Coding style: private starts with _ 2014-11-12 13:38:08 -05:00
Jim Jagielski
93c9d87b27 more scoping 2014-11-12 13:07:08 -05:00
Jim Jagielski
d0384e39d8 Correct scoping and privacy errors 2014-11-12 12:51:00 -05:00
Jim Jagielski
a8e1a80d46 headers, attachments and folders are part of the mbox[] array,
not the auth[] array.
2014-11-12 10:37:33 -05:00
Jim Jagielski
294a13a7b9 Use PHPmailer methods where/when possible. Avoid duplication 2014-11-12 10:12:11 -05:00
Jim Jagielski
fe6bb3bef9 rename for restructure 2014-11-12 09:42:54 -05:00
Jim Jagielski
1c161da259 More refactoring....
1. headers now in mbox[]
2. SS now AuthSession (complete)
3. sess now auth (complete)
2014-11-12 09:34:03 -05:00
Jim Jagielski
0137dbf0e7 remove public from non-class methods 2014-11-12 08:06:10 -05:00
Jim Jagielski
88e5ad4944 Some nits w/ mail_protocol 2014-11-12 07:45:05 -05:00
Jim Jagielski
27907f0cfa refactor: UM --> TLN
mail_protocol now a defined constant instead of string
2014-11-12 07:31:26 -05:00
Jim Jagielski
f2d8c35c9f more docblocks 2014-11-11 19:55:38 -05:00
Jim Jagielski
629ac86dc0 docblocks 2014-11-11 19:42:06 -05:00
Jim Jagielski
da49cbad44 Start adding PHP inline docs... use booleans 2014-11-11 17:13:13 -05:00
Jim Jagielski
49a8167284 Standardize on array()
Session is auth, so we can later pull out into auth[] and email[]
2014-11-11 15:56:57 -05:00
Jim Jagielski
b9e89f482a Update to PHP5 class specs 2014-11-11 14:13:35 -05:00
1863 changed files with 106562 additions and 112106 deletions

1
.gitignore vendored
View file

@ -0,0 +1 @@
/telaen/nbproject/private/

372
CHANGELOG.md Normal file
View file

@ -0,0 +1,372 @@
INTRO: This documents the changes made to Telaen.
First of all: Telaen would be nowhere without the effort of many beta
testers, other bug-and-patch submitters.
Telaen was originally based on Uebimiau.
LICENSE: Telaen is released under the GPLv2.
CHANGELOG:
----------------------------------------------------------------
2.0.0-dev
* Vcard support via https://github.com/jimjag/vCard-parser
* Use better HTML sanitizer: *htmLawed*
* Use better HTML->Txt converter: *Html2Text*
* More robust MIME Message parsing
* Drop support for PHP 5.3 and older
* Email message cache no longer stored in Session data
* Explicit error handler
* Communication w/ IMAP and POP3 servers now uses PHP streams
* 3rd party dependencies now located in ./vendor directory for
future Composer compatibility
* Updated *PHPMailer* (5.2.9), *iCalcreator* (2.20.2), *tinymce* (4.1.6),
*Smarty* (3.1.21)
1.3.2
* [New] Performance enhancements : avoid array copying
* [Fix] Prevent direct access to libs even if not using web-server ACLs
(security)
* [New] Update to *tiny_mce* 3.5.8
* [New] Update to *Smarty* 2.6.27
* [Fix] Correct bug w/ *PHPMailer* 5 compatibility
1.3.1
* [Fix] Sanitize `f_email` and `redir` url
1.3.0
* [New] Support for *PHPMailer* 5.2.1.
* [New] Now includes an embedded appointment/event Calendar using the
iCal format under the hood.
* [New] Ability to display a System-wide "news" banner via
inc/news/news.system.php
* [New] Major speed improvements when handling the POP3 Inbox. Even
though it's not recommended to store all your Email in the POP3
Inbox, lots of people do which slowed down Telaen.
* [Fix] No longer extracts vars willy-nilly from $_GET, $_POST, or
$_FILES.
* [Misc] Moved all `class.\*.php` files to `./inc/class/`. and all `config.\*`
files to `./inc/config/`. This means that upgrading may involve
moving and/or deleting older stale versions of files.
* [New] Upgraded to latest *TinyMce*.
1.2.1
* [New] New **Forwarded** status flag and icon added.
* [New] Since `ereg\*` is deprecated, all regexes now use the `preg_\*`
family.
* [New] *Smarty* upgraded to 2.6.26
* [New] *PHPMailer* upgraded to 2.0.3
* [Fix] Users cannot create folder that have the same names as system
folders
1.2.0
[Released]
1.2.0-RC1
* [New] Updated Thai translation
* [Fix] Sorting by To in Sent Messages now works.
* [Fix] HTML Emails now have plain-text component, so that SpamAssassin
doesn't score them too badly.
* [Fix] Fixed bug on IMAP when using prefix
1.2.0-beta1
* [New] Removed support for versions of PHP < 4.1.0
* [New] Smarty upgraded to 2.6.18.
* [New] Quota handling can now be set per user or per domain (or any
combination) via the new $quota_limits config variable.
* [New] Uses POP3 UIDL for better message tracking. If server does not
provide a UIDL, we create our own.
* [New] Email filters
* [New] Ajax function: session is mantained alive in the compose page,
allowing writing long email without lose work.
* [New] Login page now alerts when you kicked out on a session expire.
* [Fix] Fixed regression with forward/reply of email with embedded
images. downloads.php causes logout on recipient if uses telaen.
* [Fix] Various performance improvements
* [Fix] IMAP bug: extra text added on saved sent message cause wrong
date/time display
* [Fix] Hide attachments links only if they are embedded images. Some
clients (like pine) set Content-Id on all attachment types.
``1.1.3
* [New] Added Malay translation
* [New] Updates to some languages
* [New] Included Outlook theme into package
* [Fix] Solved bug with imap when move or delete multiple message only
one was moved or deleted.
1.1.3-rc2:
* [Fix] Added check for on CAPA detection, avoid hangs when command is
not supported.
* [Fix] Removed target->new on attach download (not open), causes blank
window remains open on IE.
* [New] de lang up-to-date
1.1.3-rc1:
* [Fix] check_install.php(.txt) now correctly checks memory_limit
value.
* [New] Now automatically detects if the POP3 server supports
PIPELINING, APOP, ATOP and UIDL. Can be overruled (enable or
disable) from config.php.
* [Fix] Email parsing enhancement, now can parse correctly
multipart/alternative emails with multipart/mixed nested content.
This emails are usually generate form Apple Mail Clients Also
attachments types with dots (like application/vnd.ms-exel) are
detected correctly.
* [New] Little usability issue, error/badlogin pages are merged with
login page, the errors are simply displayed in a box. This also
removes unuseful/redudant code. To use this feature, themes need to
update their login.htm file (look at default/login.htm for
guidance).
* [New] TinyMce updated to version 2.0.9
* [New] New feauture: Button for download the entire message
1.1.2:
* [New] Moved to subversion. This allowed us to rearrange the default
layout more easily and move the bundled Smarty package from
underneath the telaen path.
* [New] Provide notice that the ./smarty/ directory should be moved
someplace outside of the web-space. Done by renaming the directory.
* [New] Updated Smarty to 2.6.16 Updated tinyMce to 2.0.8
* [New] Added korean language.
* [Fix] Fixed error when using TOP retrieve mode, the msg[size]
contained an EOF that caused a bad response on the next command.
Also improved the move function, the message is deleted only if the
copy is done on filesystem.
* [New] Added APOP login support. To enable, add `$mail_use_apop = yes;` to your config.php file.
* [Fix] Better header parsing, support multi-line headers avoid wrong
content-type detect.
* [Fix] Bug on attachment filename, sometimes the name ends with ';'
when receving emails from Hotmail accounts.
* [Fix] Use the configured port on ONE-FOR-ALL mode, not depending from
protocol.
* [Fix] Use relative path on redir.php links, avoid problems on https
servers.
1.1.1:
* Fixed little bug on catch-address where wrong address was added to
addressbook.
1.1.1-rc2:
* Fixed problem where messages disappear on refresh with zero quota.
* Little fixes on themes.
1.1.1-rc1:
* Added sort for personal folders on folders list and fixed a bug can
cause duplicate entries in the list.
* Fixed problem with missing header info when using IMAP. Also
addresses possible "double showing" of SPAM email both Inbox and
Spam folder.
* Solved issue when attached images with upcase or capitalized
extension (like .JPG or .Gif) are not displayed inline
* Added check for exclude user address in reply-all
* Added ability to require a return-receipt on a new message
* Improved signature/footer attach and multiple quotes on HTML messages
* umask value and default directory permission bitmask now configurable
via the config.php file. Useful for some environs that need a more
"open" permission setup. NOTE: this requires people upgrading from
1.1.0 or earlier to modify their config.security.php file! Look at
the config.security.php.default file for these variable settings.
* Templates improvements: - now header.htm contains also the <head>
section of html - meta tags output in <head> instead of a bad echo
- menu.htm template used instead of nav_menu.htm - webmail title
configurable in config.php - little restyling on quick address
window (mozilla style) - added a different header for popups
* New check on quick address window, avoid to add an address multiple
times.
1.1.0:
* Updated Smarty to version 2.6.14
* Added $phpmailer_sendmail and $phpmailer_timeout to
config.php.default to allow admin to easily override PHPMailer's
default sendmail path and SMTP timeout
* Changed attachment window size to something large enough to be
readable, but not too large.
1.1.0-rc2:
* Updated TinyMCE to latest rev.
* Fixed bug on email time calc.
* Adjusted titles alignment an other little improvements on themes.
1.1.0-rc1:
* Fix bug where selected messages disappear from list on mark/unmark
read functions with 20 or more messages.
* Fix bug where auto-deleting SPAM could affect other messages in the
INBOX.
* Fix nasty bug where CC addresses were not being delivered if using
the 'mail' Mailer (PHPMailer bug).
* Templates improvement, now we have a page header and footer included
in all pages (actually not for login and pop-ups). This allow a
faster style personalization.
1.1.0-beta2:
* Telaen is now aware of the SpamAssassin X-Spam-Level header, and
allows users to control auto-SPAM detection sensitivity and SPAM
folder autopopulation. For example, a user can specify a
sensitivity of 2 (very sensitive), and all messages that have a
X-Spam-Level of 2 or more will get auto-moved to the SPAM folder.
* Bundled themes converted to be xhtml1.0 compliant.
* Force magic_quotes_runtime to be disabled, since it conflicts with
Smarty.
* Fix issue with message lists when quotas are not used.
* Provide ways to work around some issues with Redirects. We can now
select whether these redirects are performed via HTTP redirects
(the Location header) or via META REFRESH and Javascript (see
$redirects_use_meta). Also, we can select whether the URLs used for
redirects are absolute (as required by HTTP) or relative (see
$redirects_are_relative).
* New feature: mark as read/unread on message list
1.1.0-beta1:
* Fixed problem with possible incorrect redirects. Instead of checking
that $_SERVER['HTTPS'] is non-empty, we check explicitly for it
being set to 'on'. The official PHP docs are misleading (wrong)
here.
* Add in extra/check_install.php.txt which performs some simple tests
of your installation and setup.
* No longer require short_open_tag.
* Some under-the-hood code improvements.
* Remove the SPAM folder from the list of "folders that stuff can be
moved to by the user."
* The Advanced HTML Editor is now TinyMCE, which is bundled with
Telaen. Changes to the newmsg.htm template file may be required
(depending on the template) to fully use this.
* Now, whenever Telaen adds body content (eg: whenever we parseBody), we
choose to sanitize or not. This means that messages are sanitized
when printed or forwarded/replied to. Added a global variable,
$sanitize_html to control this ($allow_scripts also works, but is
being depreciated since it doesn't reflect what we're really
concerned about).
* Fixed bug where show_body was not using the correct charset (since it
was removed by HTMLFilter).
* Removed old krufty session code to use native PHP session()
capability.
* Removed the tid/lid/sid stuff from the URL. Stored in user sessions,
as it should be.
1.0.0:
* Revised de.txt and pt_BR.txt files.
1.0.0-RC2:
* Fix the default theme to use a draft Telaen logo instead of the old
Uebimiau one.
* The preferences page is now shown whenever the previously used
version and the present version differ by either the Major or Minor
version number. For example, moving from 1.0.0 to 1.0.1 will not
make it happen, but going from 1.0.4 to 1.1.0 will. This therefore
sets the assumption of what the "API" is :)
* HTML Emails are now filtered through HTMLFilter, to protect against
XSS attacks.
* We no longer get that weird '1' on the upper left of the message list
page.
* Add in a method to adjust for server timezone offsets, if we can't
figure out the real offset.
* Use output buffering within process.php to prevent breakage with
redirects.
* Force exit after all redirects.
* All redirects are now HTTP/1.1 compliant (ie: the use absolute URLs).
* Some HTML cleanups for the default theme.
1.0.0-RC1:
* Fix calculation of timezones.
* Rename of class files and other notices from Uebimiau to Telaen.
* Enable marking READ messages as either READ or UNREAD upon logout.
The default is UNREAD. This allows users who check their mail with
other Email clients to see those messages as "new" and unread.
SysAdmin can overrule user prefs by setting:
$force_unmark_read_overrule; $force_unmark_read_settingyes; in
config.php. Changes: o en_UK.txt: prf_unmark_read_on_exit o
preferences.htm
----------------------------------------------------------------
Uebimiau - the "jimjag" patches:
----------------------------------------------------------------
-------- 2.7.8p3 --------
* "What is SPAM" regex now definable for
each UM class.
* Enable auto-population of the spam folder and add a user pref to
auto-delete it at logout time. Spam folder options require the
_autospamfolder variable in the Uebimiau class be TRUE. o
en_UK.txt: spam_extended prf_empty_spam_on_exit o preferences.htm
* Make the spam folder a system folder.
* If using cookies, have the login page explain why a login may not
have succeeded due to cookie error (eg: user does not have cookies
enabled). Only important if using cookie security. This required
changes to the login themes and the lang file. o en_UK.txt
:lng_cookie_not_enabled lng_cookie_not_valid o login.htm
* Store version number in pref's file; since new versions might change
or add preferences, this means that UM can now direct the user to
their Preferences page as soon as the login after an upgrade
(similar to the First Login). Updated preference page theme. o
preferences.htm
* Address book now usable with CC and BCC fields. o newmsg.htm
* Fold in many improvements submitted by MBR (Martin Blapp) regarding
file and folder speedups, detection of ATOP and pipelining support,
and spam folders.
-------- 2.7.8p2 --------
* Change format of session ID to be more file
system friendly.
* Folders are now mode 700, for security.
* No longer depend on the bundled versions of PHPMailer or Smarty,
which were kind of old. Instead, force any custom changes to these
external projects to be local in scope, allowing us to upgrade them
as needed, or to use system-installed versions. (we *do* bundle
what we need, for completeness, and to make it a one-shot
installation - we just bundle the latest, non-altered versions, but
we don't require the version we bundle).
* Fix some incorrect regex matching, especially when they touch the
file system (like allowed folder names).
* Fix MSIE display errors (usually exhibited as just a blank page)
especially with attachments.
* On login, do the inbox/attachments clean-up. Many people don't bother
to logout. :)
* Auto-clean the server-side inbox and attachments folder to save disk
space.
* Misc code cleanups.
-- Jim Jagielski / jim@jaguNET.com

68
INSTALL.txt Normal file
View file

@ -0,0 +1,68 @@
----------------------------------------------------
INSTALL
----------------------------------------------------
- Read the README file... really, you should!
- Unpack the package (.tar.gz or .zip file) into temporary directory.
- Move the 'telaen' folder to where you want it under your
public webspace.
eg /home/httpd/webmail (*unix) or c:\inetpub\wwwroot\webmail (Win32).
- Make a non web-shared folder (users cannot see this folder through a web
browser), eg. /home/telaen or c:\winnt\temp\telaen
- IMPORTANT: If using the bundled Smarty package, move the ./smarty_move_me/
directory to a non web-shared folder.
- The user which the webserver is running (nobody, apache, IUSR_machine,etc)
need permission to write on this folder. It is best to make
it owned by the webserver ID and mode 700.
- The default configuration is stored in "inc/config/configv2.php.default".
Any and all changes should be placed in the "inc/config/configv2.php"
file; there is no need to copy over settings which don't have any
local changes, but if you prefer to just copy configv2.php.default
to configv2.php and make your edits there, that is fine too.
All instructions are commented on in this file; pay attention to
the $config['temporary_folder'] variable and the SMARTY_DIR define!
Set them according your above folder names.
- Check your installation setup by performing the following
tasks:
o Rename extra/check_install.php.txt to extra/check_install.php
o Access check_install.php via your browser, eg:
http://jimjag.github.io/telaen/telaen/extra/check_install.php
o Make any required changes.
o Be SURE to REMOVE check_install.php or RENAME it back to
check_install.php.txt !!!
- Ensure that the ./inc/ directory cannot be accessed directly.
There are many ways to do this, but the easiest is using
ACLs:
<Location /webmail/inc> # or whatever
order allow,deny
deny from all
</Location>
---------------
PERFORMANCE
---------------
The performance of Telaen, of course, depends on the speed of
your Webserver, PHP and your POP3/IMAP Email server. Even so,
here are some helpful hints:
a. Use Apache 2.4.
b. Just for Telaen, configure PHP with a large memory
allocation and a long (or non-existent) time-limit.
c. Use a good PHP cache, like XCache or APC.
d. If possible, host your Email server on your Web server,
so you can connect to the loopback address.
e. IMAP itself is a faster interface, so use that if you can.
f. If using POP3, there are some additional hints:
1. Encourage people to use Folders and to keep their
Inbox as small as possible.
2. Remove any SPAM as quickly as possible.
g. Enabling quotas involves some overhead which you
may wish to avoid.

View file

@ -5,25 +5,42 @@
Telaen is a web-based e-mail client written in PHP. What is particularly
nice about Telaen is that it is fast, lean and simple, but also extremely
powerful. It does not require much more than a "standard" PHP
installation, nor does it require a database. It supports multiple
folders, POP3 and IMAP, is SPAM aware and incorporates a WYSIWYG editor
installation, nor does it require an external database. It supports multiple
folders, both POP3 and IMAP, is SPAM aware and incorporates WYSIWYG editors
for Email composition. It supports multiple languages as well as
multiple themes (or "skins").
Telaen 1.3.x is compatible with PHP4 and PHP5. Starting with Telaen
2.x, support for PHP4 will be dropped.
Telaen was originally based on Uebimiau.
2.x, we require PHP 5.4 and later.
We recommend that you read the other documents in the docs/ subdirectory,
especially the CHANGELOG.txt and INSTALL.txt files.
## Design Philosophy
First of all, Telaen is designed and architectured to be as small
and as compact as possible; some may even say Telaen is "minimalistic".
The reason is that as projects get larger and more complex, they are
more difficult to update, to vet and review, and to keep secure.
Simplicity, after all, is a virtue.
The other basic philosophy is to leverage PHP and existing 3rd
party libraries as much as possible, but without making the level
of dependencies onerous for the sys-admin. There's no need to
re-create the wheel, unless we can do it faster, or easier.
Finally, as ex-sys-admins ourselves, as well as developers,
Telaen is designed to be plug-and-play. Plugins are a great
idea, and maybe Telaen will support them in the future, but
requiring sys-admins to find, install, config and debug Plugins
to add basic features that should be core to a webapp, doesn't
make sense to us.
## Why you might need it
Other PHP-based webmails require database support as well as a long
Other PHP-based webmails require external database support as well as a long
laundry-list of other PHP libs and extensions; not Telaen. If
you need an expandable, powerful yet simple webmail system,
Telaen will likely fit the bill.
you need an powerful yet simple and clean webmail system, Telaen will likely fit the bill.
And, if you are stuck running ancient Uebimiau, you should
really move to Telaen asap.
@ -48,13 +65,14 @@ software availability and distribution.
- Language support
- Themes support
- Search in messages
- Personalized order messages
- Personalized ordering of messages
- Personal preferences
- Send HTML e-mails
- HTML e-mail support (read/write)
- Quota Limit
- Auto population of SPAM folder for tagged SPAM messages
## Localization
PHPMailer defaults to English, but supports other language and UI themes (or 'skins').
## Documentation
@ -69,20 +87,22 @@ possible. The below external dependencies are bundled for convenience:
- Smarty
- TinyMCE
- PHPMailer
- iCalCreator
- iCalCreator (https://github.com/jimjag/iCalcreator.git fork)
- vCard-parser (https://github.com/jimjag/vCard-parser fork)
- Html2Text.php
Telaen is designed to work with both the bundled as well as the system-provided
versions of these tools.
No database is required.
No external database is required.
## Contributing
Please submit bug reports, suggestions and pull requests to the [GitHub issue tracker](https://github.com/jimjag/telaen/issues).
We're particularly interested in fixing edge-cases, expanding test coverage and dropping support for PHP4, PHP5.1
and PHP5.2.
We're particularly interested in fixing edge-cases, expanding test coverage and freshing-up
the user UI.
## Changelog
See CHANGELOG.md in ./docs/
See [CHANGELOG.md](https://github.com/jimjag/telaen/blob/master/CHANGELOG.md)

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

View file

@ -1,393 +0,0 @@
<?php
/**
* Config_File class.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* For questions, help, comments, discussion, etc., please join the
* Smarty mailing list. Send a blank e-mail to
* smarty-discussion-subscribe@googlegroups.com
*
* @link http://www.smarty.net/
* @version 2.6.25-dev
* @copyright Copyright: 2001-2005 New Digital Group, Inc.
* @author Andrei Zmievski <andrei@php.net>
* @access public
* @package Smarty
*/
/* $Id: Config_File.class.php 3149 2009-05-23 20:59:25Z monte.ohrt $ */
/**
* Config file reading class
* @package Smarty
*/
class Config_File {
/**#@+
* Options
* @var boolean
*/
/**
* Controls whether variables with the same name overwrite each other.
*/
var $overwrite = true;
/**
* Controls whether config values of on/true/yes and off/false/no get
* converted to boolean values automatically.
*/
var $booleanize = true;
/**
* Controls whether hidden config sections/vars are read from the file.
*/
var $read_hidden = true;
/**
* Controls whether or not to fix mac or dos formatted newlines.
* If set to true, \r or \r\n will be changed to \n.
*/
var $fix_newlines = true;
/**#@-*/
/** @access private */
var $_config_path = "";
var $_config_data = array();
/**#@-*/
/**
* Constructs a new config file class.
*
* @param string $config_path (optional) path to the config files
*/
function Config_File($config_path = NULL)
{
if (isset($config_path))
$this->set_path($config_path);
}
/**
* Set the path where configuration files can be found.
*
* @param string $config_path path to the config files
*/
function set_path($config_path)
{
if (!empty($config_path)) {
if (!is_string($config_path) || !file_exists($config_path) || !is_dir($config_path)) {
$this->_trigger_error_msg("Bad config file path '$config_path'");
return;
}
if(substr($config_path, -1) != DIRECTORY_SEPARATOR) {
$config_path .= DIRECTORY_SEPARATOR;
}
$this->_config_path = $config_path;
}
}
/**
* Retrieves config info based on the file, section, and variable name.
*
* @param string $file_name config file to get info for
* @param string $section_name (optional) section to get info for
* @param string $var_name (optional) variable to get info for
* @return string|array a value or array of values
*/
function get($file_name, $section_name = NULL, $var_name = NULL)
{
if (empty($file_name)) {
$this->_trigger_error_msg('Empty config file name');
return;
} else {
$file_name = $this->_config_path . $file_name;
if (!isset($this->_config_data[$file_name]))
$this->load_file($file_name, false);
}
if (!empty($var_name)) {
if (empty($section_name)) {
return $this->_config_data[$file_name]["vars"][$var_name];
} else {
if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name]))
return $this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name];
else
return array();
}
} else {
if (empty($section_name)) {
return (array)$this->_config_data[$file_name]["vars"];
} else {
if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"]))
return (array)$this->_config_data[$file_name]["sections"][$section_name]["vars"];
else
return array();
}
}
}
/**
* Retrieves config info based on the key.
*
* @param $file_name string config key (filename/section/var)
* @return string|array same as get()
* @uses get() retrieves information from config file and returns it
*/
function &get_key($config_key)
{
list($file_name, $section_name, $var_name) = explode('/', $config_key, 3);
$result = &$this->get($file_name, $section_name, $var_name);
return $result;
}
/**
* Get all loaded config file names.
*
* @return array an array of loaded config file names
*/
function get_file_names()
{
return array_keys($this->_config_data);
}
/**
* Get all section names from a loaded file.
*
* @param string $file_name config file to get section names from
* @return array an array of section names from the specified file
*/
function get_section_names($file_name)
{
$file_name = $this->_config_path . $file_name;
if (!isset($this->_config_data[$file_name])) {
$this->_trigger_error_msg("Unknown config file '$file_name'");
return;
}
return array_keys($this->_config_data[$file_name]["sections"]);
}
/**
* Get all global or section variable names.
*
* @param string $file_name config file to get info for
* @param string $section_name (optional) section to get info for
* @return array an array of variables names from the specified file/section
*/
function get_var_names($file_name, $section = NULL)
{
if (empty($file_name)) {
$this->_trigger_error_msg('Empty config file name');
return;
} else if (!isset($this->_config_data[$file_name])) {
$this->_trigger_error_msg("Unknown config file '$file_name'");
return;
}
if (empty($section))
return array_keys($this->_config_data[$file_name]["vars"]);
else
return array_keys($this->_config_data[$file_name]["sections"][$section]["vars"]);
}
/**
* Clear loaded config data for a certain file or all files.
*
* @param string $file_name file to clear config data for
*/
function clear($file_name = NULL)
{
if ($file_name === NULL)
$this->_config_data = array();
else if (isset($this->_config_data[$file_name]))
$this->_config_data[$file_name] = array();
}
/**
* Load a configuration file manually.
*
* @param string $file_name file name to load
* @param boolean $prepend_path whether current config path should be
* prepended to the filename
*/
function load_file($file_name, $prepend_path = true)
{
if ($prepend_path && $this->_config_path != "")
$config_file = $this->_config_path . $file_name;
else
$config_file = $file_name;
ini_set('track_errors', true);
$fp = @fopen($config_file, "r");
if (!is_resource($fp)) {
$this->_trigger_error_msg("Could not open config file '$config_file'");
return false;
}
$contents = ($size = filesize($config_file)) ? fread($fp, $size) : '';
fclose($fp);
$this->_config_data[$config_file] = $this->parse_contents($contents);
return true;
}
/**
* Store the contents of a file manually.
*
* @param string $config_file file name of the related contents
* @param string $contents the file-contents to parse
*/
function set_file_contents($config_file, $contents)
{
$this->_config_data[$config_file] = $this->parse_contents($contents);
return true;
}
/**
* parse the source of a configuration file manually.
*
* @param string $contents the file-contents to parse
*/
function parse_contents($contents)
{
if($this->fix_newlines) {
// fix mac/dos formatted newlines
$contents = preg_replace('!\r\n?!', "\n", $contents);
}
$config_data = array();
$config_data['sections'] = array();
$config_data['vars'] = array();
/* reference to fill with data */
$vars =& $config_data['vars'];
/* parse file line by line */
preg_match_all('!^.*\r?\n?!m', $contents, $match);
$lines = $match[0];
for ($i=0, $count=count($lines); $i<$count; $i++) {
$line = $lines[$i];
if (empty($line)) continue;
if ( substr($line, 0, 1) == '[' && preg_match('!^\[(.*?)\]!', $line, $match) ) {
/* section found */
if (substr($match[1], 0, 1) == '.') {
/* hidden section */
if ($this->read_hidden) {
$section_name = substr($match[1], 1);
} else {
/* break reference to $vars to ignore hidden section */
unset($vars);
$vars = array();
continue;
}
} else {
$section_name = $match[1];
}
if (!isset($config_data['sections'][$section_name]))
$config_data['sections'][$section_name] = array('vars' => array());
$vars =& $config_data['sections'][$section_name]['vars'];
continue;
}
if (preg_match('/^\s*(\.?\w+)\s*=\s*(.*)/s', $line, $match)) {
/* variable found */
$var_name = rtrim($match[1]);
if (strpos($match[2], '"""') === 0) {
/* handle multiline-value */
$lines[$i] = substr($match[2], 3);
$var_value = '';
while ($i<$count) {
if (($pos = strpos($lines[$i], '"""')) === false) {
$var_value .= $lines[$i++];
} else {
/* end of multiline-value */
$var_value .= substr($lines[$i], 0, $pos);
break;
}
}
$booleanize = false;
} else {
/* handle simple value */
$var_value = preg_replace('/^([\'"])(.*)\1$/', '\2', rtrim($match[2]));
$booleanize = $this->booleanize;
}
$this->_set_config_var($vars, $var_name, $var_value, $booleanize);
}
/* else unparsable line / means it is a comment / means ignore it */
}
return $config_data;
}
/**#@+ @access private */
/**
* @param array &$container
* @param string $var_name
* @param mixed $var_value
* @param boolean $booleanize determines whether $var_value is converted to
* to true/false
*/
function _set_config_var(&$container, $var_name, $var_value, $booleanize)
{
if (substr($var_name, 0, 1) == '.') {
if (!$this->read_hidden)
return;
else
$var_name = substr($var_name, 1);
}
if (!preg_match("/^[a-zA-Z_]\w*$/", $var_name)) {
$this->_trigger_error_msg("Bad variable name '$var_name'");
return;
}
if ($booleanize) {
if (preg_match("/^(on|true|yes)$/i", $var_value))
$var_value = true;
else if (preg_match("/^(off|false|no)$/i", $var_value))
$var_value = false;
}
if (!isset($container[$var_name]) || $this->overwrite)
$container[$var_name] = $var_value;
else {
settype($container[$var_name], 'array');
$container[$var_name][] = $var_value;
}
}
/**
* @uses trigger_error() creates a PHP warning/error
* @param string $error_msg
* @param integer $error_type one of
*/
function _trigger_error_msg($error_msg, $error_type = E_USER_WARNING)
{
trigger_error("Config_File error: $error_msg", $error_type);
}
/**#@-*/
}
?>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,477 @@
<?php
/**
* Project: Smarty: the PHP compiling template engine
* File: SmartyBC.class.php
* SVN: $Id: $
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library 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
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* For questions, help, comments, discussion, etc., please join the
* Smarty mailing list. Send a blank e-mail to
* smarty-discussion-subscribe@googlegroups.com
*
* @link http://www.smarty.net/
* @copyright 2008 New Digital Group, Inc.
* @author Monte Ohrt <monte at ohrt dot com>
* @author Uwe Tews
* @author Rodney Rehm
* @package Smarty
*/
/**
* @ignore
*/
require_once dirname(__FILE__) . '/Smarty.class.php';
/**
* Smarty Backward Compatibility Wrapper Class
*
* @package Smarty
*/
class SmartyBC extends Smarty
{
/**
* Smarty 2 BC
*
* @var string
*/
public $_version = self::SMARTY_VERSION;
/**
* This is an array of directories where trusted php scripts reside.
*
* @var array
*/
public $trusted_dir = array();
/**
* Initialize new SmartyBC object
*/
public function __construct()
{
parent::__construct();
}
/**
* wrapper for assign_by_ref
*
* @param string $tpl_var the template variable name
* @param mixed &$value the referenced value to assign
*/
public function assign_by_ref($tpl_var, &$value)
{
$this->assignByRef($tpl_var, $value);
}
/**
* wrapper for append_by_ref
*
* @param string $tpl_var the template variable name
* @param mixed &$value the referenced value to append
* @param boolean $merge flag if array elements shall be merged
*/
public function append_by_ref($tpl_var, &$value, $merge = false)
{
$this->appendByRef($tpl_var, $value, $merge);
}
/**
* clear the given assigned template variable.
*
* @param string $tpl_var the template variable to clear
*/
public function clear_assign($tpl_var)
{
$this->clearAssign($tpl_var);
}
/**
* Registers custom function to be used in templates
*
* @param string $function the name of the template function
* @param string $function_impl the name of the PHP function to register
* @param bool $cacheable
* @param mixed $cache_attrs
*
* @throws \SmartyException
*/
public function register_function($function, $function_impl, $cacheable = true, $cache_attrs = null)
{
$this->registerPlugin('function', $function, $function_impl, $cacheable, $cache_attrs);
}
/**
* Unregister custom function
*
* @param string $function name of template function
*/
public function unregister_function($function)
{
$this->unregisterPlugin('function', $function);
}
/**
* Registers object to be used in templates
*
* @param string $object name of template object
* @param object $object_impl the referenced PHP object to register
* @param array $allowed list of allowed methods (empty = all)
* @param boolean $smarty_args smarty argument format, else traditional
* @param array $block_methods list of methods that are block format
*
* @throws SmartyException
* @internal param array $block_functs list of methods that are block format
*/
public function register_object(
$object,
$object_impl,
$allowed = array(),
$smarty_args = true,
$block_methods = array()
) {
settype($allowed, 'array');
settype($smarty_args, 'boolean');
$this->registerObject($object, $object_impl, $allowed, $smarty_args, $block_methods);
}
/**
* Unregister object
*
* @param string $object name of template object
*/
public function unregister_object($object)
{
$this->unregisterObject($object);
}
/**
* Registers block function to be used in templates
*
* @param string $block name of template block
* @param string $block_impl PHP function to register
* @param bool $cacheable
* @param mixed $cache_attrs
*
* @throws \SmartyException
*/
public function register_block($block, $block_impl, $cacheable = true, $cache_attrs = null)
{
$this->registerPlugin('block', $block, $block_impl, $cacheable, $cache_attrs);
}
/**
* Unregister block function
*
* @param string $block name of template function
*/
public function unregister_block($block)
{
$this->unregisterPlugin('block', $block);
}
/**
* Registers compiler function
*
* @param string $function name of template function
* @param string $function_impl name of PHP function to register
* @param bool $cacheable
*
* @throws \SmartyException
*/
public function register_compiler_function($function, $function_impl, $cacheable = true)
{
$this->registerPlugin('compiler', $function, $function_impl, $cacheable);
}
/**
* Unregister compiler function
*
* @param string $function name of template function
*/
public function unregister_compiler_function($function)
{
$this->unregisterPlugin('compiler', $function);
}
/**
* Registers modifier to be used in templates
*
* @param string $modifier name of template modifier
* @param string $modifier_impl name of PHP function to register
*
* @throws \SmartyException
*/
public function register_modifier($modifier, $modifier_impl)
{
$this->registerPlugin('modifier', $modifier, $modifier_impl);
}
/**
* Unregister modifier
*
* @param string $modifier name of template modifier
*/
public function unregister_modifier($modifier)
{
$this->unregisterPlugin('modifier', $modifier);
}
/**
* Registers a resource to fetch a template
*
* @param string $type name of resource
* @param array $functions array of functions to handle resource
*/
public function register_resource($type, $functions)
{
$this->registerResource($type, $functions);
}
/**
* Unregister a resource
*
* @param string $type name of resource
*/
public function unregister_resource($type)
{
$this->unregisterResource($type);
}
/**
* Registers a prefilter function to apply
* to a template before compiling
*
* @param callable $function
*
* @throws \SmartyException
*/
public function register_prefilter($function)
{
$this->registerFilter('pre', $function);
}
/**
* Unregister a prefilter function
*
* @param callable $function
*/
public function unregister_prefilter($function)
{
$this->unregisterFilter('pre', $function);
}
/**
* Registers a postfilter function to apply
* to a compiled template after compilation
*
* @param callable $function
*
* @throws \SmartyException
*/
public function register_postfilter($function)
{
$this->registerFilter('post', $function);
}
/**
* Unregister a postfilter function
*
* @param callable $function
*/
public function unregister_postfilter($function)
{
$this->unregisterFilter('post', $function);
}
/**
* Registers an output filter function to apply
* to a template output
*
* @param callable $function
*
* @throws \SmartyException
*/
public function register_outputfilter($function)
{
$this->registerFilter('output', $function);
}
/**
* Unregister an outputfilter function
*
* @param callable $function
*/
public function unregister_outputfilter($function)
{
$this->unregisterFilter('output', $function);
}
/**
* load a filter of specified type and name
*
* @param string $type filter type
* @param string $name filter name
*
* @throws \SmartyException
*/
public function load_filter($type, $name)
{
$this->loadFilter($type, $name);
}
/**
* clear cached content for the given template and cache id
*
* @param string $tpl_file name of template file
* @param string $cache_id name of cache_id
* @param string $compile_id name of compile_id
* @param string $exp_time expiration time
*
* @return boolean
*/
public function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)
{
return $this->clearCache($tpl_file, $cache_id, $compile_id, $exp_time);
}
/**
* clear the entire contents of cache (all templates)
*
* @param string $exp_time expire time
*
* @return boolean
*/
public function clear_all_cache($exp_time = null)
{
return $this->clearCache(null, null, null, $exp_time);
}
/**
* test to see if valid cache exists for this template
*
* @param string $tpl_file name of template file
* @param string $cache_id
* @param string $compile_id
*
* @return bool
* @throws \Exception
* @throws \SmartyException
*/
public function is_cached($tpl_file, $cache_id = null, $compile_id = null)
{
return $this->isCached($tpl_file, $cache_id, $compile_id);
}
/**
* clear all the assigned template variables.
*/
public function clear_all_assign()
{
$this->clearAllAssign();
}
/**
* clears compiled version of specified template resource,
* or all compiled template files if one is not specified.
* This function is for advanced use only, not normally needed.
*
* @param string $tpl_file
* @param string $compile_id
* @param string $exp_time
*
* @return boolean results of {@link smarty_core_rm_auto()}
*/
public function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)
{
return $this->clearCompiledTemplate($tpl_file, $compile_id, $exp_time);
}
/**
* Checks whether requested template exists.
*
* @param string $tpl_file
*
* @return bool
* @throws \SmartyException
*/
public function template_exists($tpl_file)
{
return $this->templateExists($tpl_file);
}
/**
* Returns an array containing template variables
*
* @param string $name
*
* @return array
*/
public function get_template_vars($name = null)
{
return $this->getTemplateVars($name);
}
/**
* Returns an array containing config variables
*
* @param string $name
*
* @return array
*/
public function get_config_vars($name = null)
{
return $this->getConfigVars($name);
}
/**
* load configuration values
*
* @param string $file
* @param string $section
* @param string $scope
*/
public function config_load($file, $section = null, $scope = 'global')
{
$this->ConfigLoad($file, $section, $scope);
}
/**
* return a reference to a registered object
*
* @param string $name
*
* @return object
*/
public function get_registered_object($name)
{
return $this->getRegisteredObject($name);
}
/**
* clear configuration values
*
* @param string $var
*/
public function clear_config($var = null)
{
$this->clearConfig($var);
}
/**
* trigger Smarty error
*
* @param string $error_msg
* @param integer $error_type
*/
public function trigger_error($error_msg, $error_type = E_USER_WARNING)
{
trigger_error("Smarty error: $error_msg", $error_type);
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,157 +1,160 @@
{* Smarty *}
{* debug.tpl, last updated version 2.1.0 *}
{assign_debug_info}
{capture assign=debug_output}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Smarty Debug Console</title>
{literal}
<style type="text/css">
/* <![CDATA[ */
body, h1, h2, td, th, p {
font-family: sans-serif;
font-weight: normal;
font-size: 0.9em;
margin: 1px;
padding: 0;
}
{capture name='_smarty_debug' assign=debug_output}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Smarty Debug Console</title>
<style type="text/css">
{literal}
body, h1, h2, h3, td, th, p {
font-family: sans-serif;
font-weight: normal;
font-size: 0.9em;
margin: 1px;
padding: 0;
}
h1 {
margin: 0;
text-align: left;
padding: 2px;
background-color: #f0c040;
color: black;
font-weight: bold;
font-size: 1.2em;
}
h1 {
margin: 0;
text-align: left;
padding: 2px;
background-color: #f0c040;
color: black;
font-weight: bold;
font-size: 1.2em;
}
h2 {
background-color: #9B410E;
color: white;
text-align: left;
font-weight: bold;
padding: 2px;
border-top: 1px solid black;
}
h2 {
background-color: #9B410E;
color: white;
text-align: left;
font-weight: bold;
padding: 2px;
border-top: 1px solid black;
}
h3 {
text-align: left;
font-weight: bold;
color: black;
font-size: 0.7em;
padding: 2px;
}
body {
background: black;
}
body {
background: black;
}
p, table, div {
background: #f0ead8;
}
p, table, div {
background: #f0ead8;
}
p {
margin: 0;
font-style: italic;
text-align: center;
}
p {
margin: 0;
font-style: italic;
text-align: center;
}
table {
width: 100%;
}
table {
width: 100%;
}
th, td {
font-family: monospace;
vertical-align: top;
text-align: left;
width: 50%;
}
th, td {
font-family: monospace;
vertical-align: top;
text-align: left;
}
td {
color: green;
}
td {
color: green;
}
.odd {
background-color: #eeeeee;
}
.odd {
background-color: #eeeeee;
}
.even {
background-color: #fafafa;
}
.even {
background-color: #fafafa;
}
.exectime {
font-size: 0.8em;
font-style: italic;
}
.exectime {
font-size: 0.8em;
font-style: italic;
}
#table_assigned_vars th {
color: blue;
}
#bold div {
color: black;
font-weight: bold;
}
#blue h3 {
color: blue;
}
#normal div {
color: black;
font-weight: normal;
}
#table_assigned_vars th {
color: blue;
font-weight: bold;
}
#table_config_vars th {
color: maroon;
}
/* ]]> */
</style>
{/literal}
</head>
<body>
#table_config_vars th {
color: maroon;
}
<h1>Smarty Debug Console</h1>
{/literal}
</style>
</head>
<body>
<h2>included templates &amp; config files (load time in seconds)</h2>
<h1>Smarty {Smarty::SMARTY_VERSION} Debug Console
- {if isset($template_name)}{$template_name|debug_print_var nofilter} {/if}{if !empty($template_data)}Total Time {$execution_time|string_format:"%.5f"}{/if}</h1>
<div>
{section name=templates loop=$_debug_tpls}
{section name=indent loop=$_debug_tpls[templates].depth}&nbsp;&nbsp;&nbsp;{/section}
<font color={if $_debug_tpls[templates].type eq "template"}brown{elseif $_debug_tpls[templates].type eq "insert"}black{else}green{/if}>
{$_debug_tpls[templates].filename|escape:html}</font>
{if isset($_debug_tpls[templates].exec_time)}
<span class="exectime">
({$_debug_tpls[templates].exec_time|string_format:"%.5f"})
{if %templates.index% eq 0}(total){/if}
</span>
{if !empty($template_data)}
<h2>included templates &amp; config files (load time in seconds)</h2>
<div>
{foreach $template_data as $template}
<font color=brown>{$template.name}</font>
<br />&nbsp;&nbsp;<span class="exectime">
(compile {$template['compile_time']|string_format:"%.5f"}) (render {$template['render_time']|string_format:"%.5f"}) (cache {$template['cache_time']|string_format:"%.5f"})
</span>
<br />
{/foreach}
</div>
{/if}
<br />
{sectionelse}
<p>no templates included</p>
{/section}
</div>
<h2>assigned template variables</h2>
<h2>assigned template variables</h2>
<table id="table_assigned_vars">
{section name=vars loop=$_debug_keys}
<tr class="{cycle values="odd,even"}">
<th>{ldelim}${$_debug_keys[vars]|escape:'html'}{rdelim}</th>
<td>{$_debug_vals[vars]|@debug_print_var}</td></tr>
{sectionelse}
<tr><td><p>no template variables assigned</p></td></tr>
{/section}
</table>
<table id="table_assigned_vars">
{foreach $assigned_vars as $vars}
<tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">
<td><h3><font color=blue>${$vars@key}</font></h3>
{if isset($vars['nocache'])}<b>Nocache</b><br />{/if}
{if isset($vars['scope'])}<b>Origin:</b> {$vars['scope']|debug_print_var nofilter}{/if}
</td>
<td><h3>Value</h3>{$vars['value']|debug_print_var:10:80 nofilter}</td>
<td>{if isset($vars['attributes'])}<h3>Attributes</h3>{$vars['attributes']|debug_print_var nofilter} {/if}</td>
{/foreach}
</table>
<h2>assigned config file variables (outer template scope)</h2>
<h2>assigned config file variables</h2>
<table id="table_config_vars">
{section name=config_vars loop=$_debug_config_keys}
<tr class="{cycle values="odd,even"}">
<th>{ldelim}#{$_debug_config_keys[config_vars]|escape:'html'}#{rdelim}</th>
<td>{$_debug_config_vals[config_vars]|@debug_print_var}</td></tr>
{sectionelse}
<tr><td><p>no config vars assigned</p></td></tr>
{/section}
</table>
</body>
</html>
<table id="table_config_vars">
{foreach $config_vars as $vars}
<tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">
<td><h3><font color=blue>#{$vars@key}#</font></h3>
{if isset($vars['scope'])}<b>Origin:</b> {$vars['scope']|debug_print_var nofilter}{/if}
</td>
<td>{$vars['value']|debug_print_var:10:80 nofilter}</td>
</tr>
{/foreach}
</table>
</body>
</html>
{/capture}
{if isset($_smarty_debug_output) and $_smarty_debug_output eq "html"}
{$debug_output}
{else}
<script type="text/javascript">
// <![CDATA[
if ( self.name == '' ) {ldelim}
var title = 'Console';
{rdelim}
else {ldelim}
var title = 'Console_' + self.name;
{rdelim}
_smarty_console = window.open("",title.value,"width=680,height=600,resizable,scrollbars=yes");
_smarty_console.document.write('{$debug_output|escape:'javascript'}');
{$id = '__Smarty__'}
{if $display_mode}{$id = "$offset$template_name"|md5}{/if}
_smarty_console = window.open("", "console{$id}", "width=1024,height=600,left={$offset},top={$offset},resizable,scrollbars=yes");
_smarty_console.document.write("{$debug_output|escape:'javascript' nofilter}");
_smarty_console.document.close();
// ]]>
</script>
{/if}

View file

@ -1,67 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* assemble filepath of requested plugin
*
* @param string $type
* @param string $name
* @return string|false
*/
function smarty_core_assemble_plugin_filepath($params, &$smarty)
{
static $_filepaths_cache = array();
$_plugin_filename = $params['type'] . '.' . $params['name'] . '.php';
if (isset($_filepaths_cache[$_plugin_filename])) {
return $_filepaths_cache[$_plugin_filename];
}
$_return = false;
foreach ((array)$smarty->plugins_dir as $_plugin_dir) {
$_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename;
// see if path is relative
if (!preg_match("/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/", $_plugin_dir)) {
$_relative_paths[] = $_plugin_dir;
// relative path, see if it is in the SMARTY_DIR
if (@is_readable(SMARTY_DIR . $_plugin_filepath)) {
$_return = SMARTY_DIR . $_plugin_filepath;
break;
}
}
// try relative to cwd (or absolute)
if (@is_readable($_plugin_filepath)) {
$_return = $_plugin_filepath;
break;
}
}
if($_return === false) {
// still not found, try PHP include_path
if(isset($_relative_paths)) {
foreach ((array)$_relative_paths as $_plugin_dir) {
$_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename;
$_params = array('file_path' => $_plugin_filepath);
require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
if(smarty_core_get_include_path($_params, $smarty)) {
$_return = $_params['new_file_path'];
break;
}
}
}
}
$_filepaths_cache[$_plugin_filename] = $_return;
return $_return;
}
/* vim: set expandtab: */
?>

View file

@ -1,43 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty assign_smarty_interface core plugin
*
* Type: core<br>
* Name: assign_smarty_interface<br>
* Purpose: assign the $smarty interface variable
* @param array Format: null
* @param Smarty
*/
function smarty_core_assign_smarty_interface($params, &$smarty)
{
if (isset($smarty->_smarty_vars) && isset($smarty->_smarty_vars['request'])) {
return;
}
$_globals_map = array('g' => 'HTTP_GET_VARS',
'p' => 'HTTP_POST_VARS',
'c' => 'HTTP_COOKIE_VARS',
's' => 'HTTP_SERVER_VARS',
'e' => 'HTTP_ENV_VARS');
$_smarty_vars_request = array();
foreach (preg_split('!!', strtolower($smarty->request_vars_order)) as $_c) {
if (isset($_globals_map[$_c])) {
$_smarty_vars_request = array_merge($_smarty_vars_request, $GLOBALS[$_globals_map[$_c]]);
}
}
$_smarty_vars_request = @array_merge($_smarty_vars_request, $GLOBALS['HTTP_SESSION_VARS']);
$smarty->_smarty_vars['request'] = $_smarty_vars_request;
}
/* vim: set expandtab: */
?>

View file

@ -1,79 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* create full directory structure
*
* @param string $dir
*/
// $dir
function smarty_core_create_dir_structure($params, &$smarty)
{
if (!file_exists($params['dir'])) {
$_open_basedir_ini = ini_get('open_basedir');
if (DIRECTORY_SEPARATOR=='/') {
/* unix-style paths */
$_dir = $params['dir'];
$_dir_parts = preg_split('!/+!', $_dir, -1, PREG_SPLIT_NO_EMPTY);
$_new_dir = (substr($_dir, 0, 1)=='/') ? '/' : getcwd().'/';
if($_use_open_basedir = !empty($_open_basedir_ini)) {
$_open_basedirs = explode(':', $_open_basedir_ini);
}
} else {
/* other-style paths */
$_dir = str_replace('\\','/', $params['dir']);
$_dir_parts = preg_split('!/+!', $_dir, -1, PREG_SPLIT_NO_EMPTY);
if (preg_match('!^((//)|([a-zA-Z]:/))!', $_dir, $_root_dir)) {
/* leading "//" for network volume, or "[letter]:/" for full path */
$_new_dir = $_root_dir[1];
/* remove drive-letter from _dir_parts */
if (isset($_root_dir[3])) array_shift($_dir_parts);
} else {
$_new_dir = str_replace('\\', '/', getcwd()).'/';
}
if($_use_open_basedir = !empty($_open_basedir_ini)) {
$_open_basedirs = explode(';', str_replace('\\', '/', $_open_basedir_ini));
}
}
/* all paths use "/" only from here */
foreach ($_dir_parts as $_dir_part) {
$_new_dir .= $_dir_part;
if ($_use_open_basedir) {
// do not attempt to test or make directories outside of open_basedir
$_make_new_dir = false;
foreach ($_open_basedirs as $_open_basedir) {
if (substr($_new_dir, 0, strlen($_open_basedir)) == $_open_basedir) {
$_make_new_dir = true;
break;
}
}
} else {
$_make_new_dir = true;
}
if ($_make_new_dir && !file_exists($_new_dir) && !@mkdir($_new_dir, $smarty->_dir_perms) && !is_dir($_new_dir)) {
$smarty->trigger_error("problem creating directory '" . $_new_dir . "'");
return false;
}
$_new_dir .= '/';
}
}
}
/* vim: set expandtab: */
?>

View file

@ -1,61 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty debug_console function plugin
*
* Type: core<br>
* Name: display_debug_console<br>
* Purpose: display the javascript debug console window
* @param array Format: null
* @param Smarty
*/
function smarty_core_display_debug_console($params, &$smarty)
{
// we must force compile the debug template in case the environment
// changed between separate applications.
if(empty($smarty->debug_tpl)) {
// set path to debug template from SMARTY_DIR
$smarty->debug_tpl = SMARTY_DIR . 'debug.tpl';
if($smarty->security && is_file($smarty->debug_tpl)) {
$smarty->secure_dir[] = realpath($smarty->debug_tpl);
}
$smarty->debug_tpl = 'file:' . SMARTY_DIR . 'debug.tpl';
}
$_ldelim_orig = $smarty->left_delimiter;
$_rdelim_orig = $smarty->right_delimiter;
$smarty->left_delimiter = '{';
$smarty->right_delimiter = '}';
$_compile_id_orig = $smarty->_compile_id;
$smarty->_compile_id = null;
$_compile_path = $smarty->_get_compile_path($smarty->debug_tpl);
if ($smarty->_compile_resource($smarty->debug_tpl, $_compile_path))
{
ob_start();
$smarty->_include($_compile_path);
$_results = ob_get_contents();
ob_end_clean();
} else {
$_results = '';
}
$smarty->_compile_id = $_compile_id_orig;
$smarty->left_delimiter = $_ldelim_orig;
$smarty->right_delimiter = $_rdelim_orig;
return $_results;
}
/* vim: set expandtab: */
?>

View file

@ -1,44 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Get path to file from include_path
*
* @param string $file_path
* @param string $new_file_path
* @return boolean
* @staticvar array|null
*/
// $file_path, &$new_file_path
function smarty_core_get_include_path(&$params, &$smarty)
{
static $_path_array = null;
if(!isset($_path_array)) {
$_ini_include_path = ini_get('include_path');
if(strstr($_ini_include_path,';')) {
// windows pathnames
$_path_array = explode(';',$_ini_include_path);
} else {
$_path_array = explode(':',$_ini_include_path);
}
}
foreach ($_path_array as $_include_path) {
if (@is_readable($_include_path . DIRECTORY_SEPARATOR . $params['file_path'])) {
$params['new_file_path'] = $_include_path . DIRECTORY_SEPARATOR . $params['file_path'];
return true;
}
}
return false;
}
/* vim: set expandtab: */
?>

View file

@ -1,23 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Get seconds and microseconds
* @return double
*/
function smarty_core_get_microtime($params, &$smarty)
{
$mtime = microtime();
$mtime = explode(" ", $mtime);
$mtime = (double)($mtime[1]) + (double)($mtime[0]);
return ($mtime);
}
/* vim: set expandtab: */
?>

View file

@ -1,80 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Retrieves PHP script resource
*
* sets $php_resource to the returned resource
* @param string $resource
* @param string $resource_type
* @param $php_resource
* @return boolean
*/
function smarty_core_get_php_resource(&$params, &$smarty)
{
$params['resource_base_path'] = $smarty->trusted_dir;
$smarty->_parse_resource_name($params, $smarty);
/*
* Find out if the resource exists.
*/
if ($params['resource_type'] == 'file') {
$_readable = false;
if(file_exists($params['resource_name']) && is_readable($params['resource_name'])) {
$_readable = true;
} else {
// test for file in include_path
$_params = array('file_path' => $params['resource_name']);
require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
if(smarty_core_get_include_path($_params, $smarty)) {
$_include_path = $_params['new_file_path'];
$_readable = true;
}
}
} else if ($params['resource_type'] != 'file') {
$_template_source = null;
$_readable = is_callable($smarty->_plugins['resource'][$params['resource_type']][0][0])
&& call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][0],
array($params['resource_name'], &$_template_source, &$smarty));
}
/*
* Set the error function, depending on which class calls us.
*/
if (method_exists($smarty, '_syntax_error')) {
$_error_funcc = '_syntax_error';
} else {
$_error_funcc = 'trigger_error';
}
if ($_readable) {
if ($smarty->security) {
require_once(SMARTY_CORE_DIR . 'core.is_trusted.php');
if (!smarty_core_is_trusted($params, $smarty)) {
$smarty->$_error_funcc('(secure mode) ' . $params['resource_type'] . ':' . $params['resource_name'] . ' is not trusted');
return false;
}
}
} else {
$smarty->$_error_funcc($params['resource_type'] . ':' . $params['resource_name'] . ' is not readable');
return false;
}
if ($params['resource_type'] == 'file') {
$params['php_resource'] = $params['resource_name'];
} else {
$params['php_resource'] = $_template_source;
}
return true;
}
/* vim: set expandtab: */
?>

View file

@ -1,59 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* determines if a resource is secure or not.
*
* @param string $resource_type
* @param string $resource_name
* @return boolean
*/
// $resource_type, $resource_name
function smarty_core_is_secure($params, &$smarty)
{
if (!$smarty->security || $smarty->security_settings['INCLUDE_ANY']) {
return true;
}
if ($params['resource_type'] == 'file') {
$_rp = realpath($params['resource_name']);
if (isset($params['resource_base_path'])) {
foreach ((array)$params['resource_base_path'] as $curr_dir) {
if ( ($_cd = realpath($curr_dir)) !== false &&
strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) {
return true;
}
}
}
if (!empty($smarty->secure_dir)) {
foreach ((array)$smarty->secure_dir as $curr_dir) {
if ( ($_cd = realpath($curr_dir)) !== false) {
if($_cd == $_rp) {
return true;
} elseif (strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR) {
return true;
}
}
}
}
} else {
// resource is not on local file system
return call_user_func_array(
$smarty->_plugins['resource'][$params['resource_type']][0][2],
array($params['resource_name'], &$smarty));
}
return false;
}
/* vim: set expandtab: */
?>

View file

@ -1,47 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* determines if a resource is trusted or not
*
* @param string $resource_type
* @param string $resource_name
* @return boolean
*/
// $resource_type, $resource_name
function smarty_core_is_trusted($params, &$smarty)
{
$_smarty_trusted = false;
if ($params['resource_type'] == 'file') {
if (!empty($smarty->trusted_dir)) {
$_rp = realpath($params['resource_name']);
foreach ((array)$smarty->trusted_dir as $curr_dir) {
if (!empty($curr_dir) && is_readable ($curr_dir)) {
$_cd = realpath($curr_dir);
if (strncmp($_rp, $_cd, strlen($_cd)) == 0
&& substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) {
$_smarty_trusted = true;
break;
}
}
}
}
} else {
// resource is not on local file system
$_smarty_trusted = call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][3],
array($params['resource_name'], $smarty));
}
return $_smarty_trusted;
}
/* vim: set expandtab: */
?>

View file

@ -1,125 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Load requested plugins
*
* @param array $plugins
*/
// $plugins
function smarty_core_load_plugins($params, &$smarty)
{
foreach ($params['plugins'] as $_plugin_info) {
list($_type, $_name, $_tpl_file, $_tpl_line, $_delayed_loading) = $_plugin_info;
$_plugin = &$smarty->_plugins[$_type][$_name];
/*
* We do not load plugin more than once for each instance of Smarty.
* The following code checks for that. The plugin can also be
* registered dynamically at runtime, in which case template file
* and line number will be unknown, so we fill them in.
*
* The final element of the info array is a flag that indicates
* whether the dynamically registered plugin function has been
* checked for existence yet or not.
*/
if (isset($_plugin)) {
if (empty($_plugin[3])) {
if (!is_callable($_plugin[0])) {
$smarty->_trigger_fatal_error("[plugin] $_type '$_name' is not implemented", $_tpl_file, $_tpl_line, __FILE__, __LINE__);
} else {
$_plugin[1] = $_tpl_file;
$_plugin[2] = $_tpl_line;
$_plugin[3] = true;
if (!isset($_plugin[4])) $_plugin[4] = true; /* cacheable */
}
}
continue;
} else if ($_type == 'insert') {
/*
* For backwards compatibility, we check for insert functions in
* the symbol table before trying to load them as a plugin.
*/
$_plugin_func = 'insert_' . $_name;
if (function_exists($_plugin_func)) {
$_plugin = array($_plugin_func, $_tpl_file, $_tpl_line, true, false);
continue;
}
}
$_plugin_file = $smarty->_get_plugin_filepath($_type, $_name);
if (! $_found = ($_plugin_file != false)) {
$_message = "could not load plugin file '$_type.$_name.php'\n";
}
/*
* If plugin file is found, it -must- provide the properly named
* plugin function. In case it doesn't, simply output the error and
* do not fall back on any other method.
*/
if ($_found) {
include_once $_plugin_file;
$_plugin_func = 'smarty_' . $_type . '_' . $_name;
if (!function_exists($_plugin_func)) {
$smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", $_tpl_file, $_tpl_line, __FILE__, __LINE__);
continue;
}
}
/*
* In case of insert plugins, their code may be loaded later via
* 'script' attribute.
*/
else if ($_type == 'insert' && $_delayed_loading) {
$_plugin_func = 'smarty_' . $_type . '_' . $_name;
$_found = true;
}
/*
* Plugin specific processing and error checking.
*/
if (!$_found) {
if ($_type == 'modifier') {
/*
* In case modifier falls back on using PHP functions
* directly, we only allow those specified in the security
* context.
*/
if ($smarty->security && !in_array($_name, $smarty->security_settings['MODIFIER_FUNCS'])) {
$_message = "(secure mode) modifier '$_name' is not allowed";
} else {
if (!function_exists($_name)) {
$_message = "modifier '$_name' is not implemented";
} else {
$_plugin_func = $_name;
$_found = true;
}
}
} else if ($_type == 'function') {
/*
* This is a catch-all situation.
*/
$_message = "unknown tag - '$_name'";
}
}
if ($_found) {
$smarty->_plugins[$_type][$_name] = array($_plugin_func, $_tpl_file, $_tpl_line, true, true);
} else {
// output error
$smarty->_trigger_fatal_error('[plugin] ' . $_message, $_tpl_file, $_tpl_line, __FILE__, __LINE__);
}
}
}
/* vim: set expandtab: */
?>

View file

@ -1,74 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* load a resource plugin
*
* @param string $type
*/
// $type
function smarty_core_load_resource_plugin($params, &$smarty)
{
/*
* Resource plugins are not quite like the other ones, so they are
* handled differently. The first element of plugin info is the array of
* functions provided by the plugin, the second one indicates whether
* all of them exist or not.
*/
$_plugin = &$smarty->_plugins['resource'][$params['type']];
if (isset($_plugin)) {
if (!$_plugin[1] && count($_plugin[0])) {
$_plugin[1] = true;
foreach ($_plugin[0] as $_plugin_func) {
if (!is_callable($_plugin_func)) {
$_plugin[1] = false;
break;
}
}
}
if (!$_plugin[1]) {
$smarty->_trigger_fatal_error("[plugin] resource '" . $params['type'] . "' is not implemented", null, null, __FILE__, __LINE__);
}
return;
}
$_plugin_file = $smarty->_get_plugin_filepath('resource', $params['type']);
$_found = ($_plugin_file != false);
if ($_found) { /*
* If the plugin file is found, it -must- provide the properly named
* plugin functions.
*/
include_once($_plugin_file);
/*
* Locate functions that we require the plugin to provide.
*/
$_resource_ops = array('source', 'timestamp', 'secure', 'trusted');
$_resource_funcs = array();
foreach ($_resource_ops as $_op) {
$_plugin_func = 'smarty_resource_' . $params['type'] . '_' . $_op;
if (!function_exists($_plugin_func)) {
$smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", null, null, __FILE__, __LINE__);
return;
} else {
$_resource_funcs[] = $_plugin_func;
}
}
$smarty->_plugins['resource'][$params['type']] = array($_resource_funcs, true);
}
}
/* vim: set expandtab: */
?>

View file

@ -1,71 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Replace cached inserts with the actual results
*
* @param string $results
* @return string
*/
function smarty_core_process_cached_inserts($params, &$smarty)
{
preg_match_all('!'.$smarty->_smarty_md5.'{insert_cache (.*)}'.$smarty->_smarty_md5.'!Uis',
$params['results'], $match);
list($cached_inserts, $insert_args) = $match;
for ($i = 0, $for_max = count($cached_inserts); $i < $for_max; $i++) {
if ($smarty->debugging) {
$_params = array();
require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
$debug_start_time = smarty_core_get_microtime($_params, $smarty);
}
$args = unserialize($insert_args[$i]);
$name = $args['name'];
if (isset($args['script'])) {
$_params = array('resource_name' => $smarty->_dequote($args['script']));
require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
if(!smarty_core_get_php_resource($_params, $smarty)) {
return false;
}
$resource_type = $_params['resource_type'];
$php_resource = $_params['php_resource'];
if ($resource_type == 'file') {
$smarty->_include($php_resource, true);
} else {
$smarty->_eval($php_resource);
}
}
$function_name = $smarty->_plugins['insert'][$name][0];
if (empty($args['assign'])) {
$replace = $function_name($args, $smarty);
} else {
$smarty->assign($args['assign'], $function_name($args, $smarty));
$replace = '';
}
$params['results'] = substr_replace($params['results'], $replace, strpos($params['results'], $cached_inserts[$i]), strlen($cached_inserts[$i]));
if ($smarty->debugging) {
$_params = array();
require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
$smarty->_smarty_debug_info[] = array('type' => 'insert',
'filename' => 'insert_'.$name,
'depth' => $smarty->_inclusion_depth,
'exec_time' => smarty_core_get_microtime($_params, $smarty) - $debug_start_time);
}
}
return $params['results'];
}
/* vim: set expandtab: */
?>

View file

@ -1,37 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Replace nocache-tags by results of the corresponding non-cacheable
* functions and return it
*
* @param string $compiled_tpl
* @param string $cached_source
* @return string
*/
function smarty_core_process_compiled_include($params, &$smarty)
{
$_cache_including = $smarty->_cache_including;
$smarty->_cache_including = true;
$_return = $params['results'];
foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) {
$smarty->_include($_include_file_path, true);
}
foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) {
$_return = preg_replace_callback('!(\{nocache\:('.$_cache_serial.')#(\d+)\})!s',
array(&$smarty, '_process_compiled_include_callback'),
$_return);
}
$smarty->_cache_including = $_cache_including;
return $_return;
}
?>

View file

@ -1,101 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* read a cache file, determine if it needs to be
* regenerated or not
*
* @param string $tpl_file
* @param string $cache_id
* @param string $compile_id
* @param string $results
* @return boolean
*/
// $tpl_file, $cache_id, $compile_id, &$results
function smarty_core_read_cache_file(&$params, &$smarty)
{
static $content_cache = array();
if ($smarty->force_compile) {
// force compile enabled, always regenerate
return false;
}
if (isset($content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']])) {
list($params['results'], $smarty->_cache_info) = $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']];
return true;
}
if (!empty($smarty->cache_handler_func)) {
// use cache_handler function
call_user_func_array($smarty->cache_handler_func,
array('read', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], null));
} else {
// use local cache file
$_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
$_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id);
$params['results'] = $smarty->_read_file($_cache_file);
}
if (empty($params['results'])) {
// nothing to parse (error?), regenerate cache
return false;
}
$_contents = $params['results'];
$_info_start = strpos($_contents, "\n") + 1;
$_info_len = (int)substr($_contents, 0, $_info_start - 1);
$_cache_info = unserialize(substr($_contents, $_info_start, $_info_len));
$params['results'] = substr($_contents, $_info_start + $_info_len);
if ($smarty->caching == 2 && isset ($_cache_info['expires'])){
// caching by expiration time
if ($_cache_info['expires'] > -1 && (time() > $_cache_info['expires'])) {
// cache expired, regenerate
return false;
}
} else {
// caching by lifetime
if ($smarty->cache_lifetime > -1 && (time() - $_cache_info['timestamp'] > $smarty->cache_lifetime)) {
// cache expired, regenerate
return false;
}
}
if ($smarty->compile_check) {
$_params = array('get_source' => false, 'quiet'=>true);
foreach (array_keys($_cache_info['template']) as $_template_dep) {
$_params['resource_name'] = $_template_dep;
if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) {
// template file has changed, regenerate cache
return false;
}
}
if (isset($_cache_info['config'])) {
$_params = array('resource_base_path' => $smarty->config_dir, 'get_source' => false, 'quiet'=>true);
foreach (array_keys($_cache_info['config']) as $_config_dep) {
$_params['resource_name'] = $_config_dep;
if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) {
// config file has changed, regenerate cache
return false;
}
}
}
}
$content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']] = array($params['results'], $_cache_info);
$smarty->_cache_info = $_cache_info;
return true;
}
/* vim: set expandtab: */
?>

View file

@ -1,71 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* delete an automagically created file by name and id
*
* @param string $auto_base
* @param string $auto_source
* @param string $auto_id
* @param integer $exp_time
* @return boolean
*/
// $auto_base, $auto_source = null, $auto_id = null, $exp_time = null
function smarty_core_rm_auto($params, &$smarty)
{
if (!@is_dir($params['auto_base']))
return false;
if(!isset($params['auto_id']) && !isset($params['auto_source'])) {
$_params = array(
'dirname' => $params['auto_base'],
'level' => 0,
'exp_time' => $params['exp_time']
);
require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
$_res = smarty_core_rmdir($_params, $smarty);
} else {
$_tname = $smarty->_get_auto_filename($params['auto_base'], $params['auto_source'], $params['auto_id']);
if(isset($params['auto_source'])) {
if (isset($params['extensions'])) {
$_res = false;
foreach ((array)$params['extensions'] as $_extension)
$_res |= $smarty->_unlink($_tname.$_extension, $params['exp_time']);
} else {
$_res = $smarty->_unlink($_tname, $params['exp_time']);
}
} elseif ($smarty->use_sub_dirs) {
$_params = array(
'dirname' => $_tname,
'level' => 1,
'exp_time' => $params['exp_time']
);
require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
$_res = smarty_core_rmdir($_params, $smarty);
} else {
// remove matching file names
$_handle = opendir($params['auto_base']);
$_res = true;
while (false !== ($_filename = readdir($_handle))) {
if($_filename == '.' || $_filename == '..') {
continue;
} elseif (substr($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, 0, strlen($_tname)) == $_tname) {
$_res &= (bool)$smarty->_unlink($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, $params['exp_time']);
}
}
}
}
return $_res;
}
/* vim: set expandtab: */
?>

View file

@ -1,54 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* delete a dir recursively (level=0 -> keep root)
* WARNING: no tests, it will try to remove what you tell it!
*
* @param string $dirname
* @param integer $level
* @param integer $exp_time
* @return boolean
*/
// $dirname, $level = 1, $exp_time = null
function smarty_core_rmdir($params, &$smarty)
{
if(!isset($params['level'])) { $params['level'] = 1; }
if(!isset($params['exp_time'])) { $params['exp_time'] = null; }
if($_handle = @opendir($params['dirname'])) {
while (false !== ($_entry = readdir($_handle))) {
if ($_entry != '.' && $_entry != '..') {
if (@is_dir($params['dirname'] . DIRECTORY_SEPARATOR . $_entry)) {
$_params = array(
'dirname' => $params['dirname'] . DIRECTORY_SEPARATOR . $_entry,
'level' => $params['level'] + 1,
'exp_time' => $params['exp_time']
);
smarty_core_rmdir($_params, $smarty);
}
else {
$smarty->_unlink($params['dirname'] . DIRECTORY_SEPARATOR . $_entry, $params['exp_time']);
}
}
}
closedir($_handle);
}
if ($params['level']) {
return @rmdir($params['dirname']);
}
return (bool)$_handle;
}
/* vim: set expandtab: */
?>

View file

@ -1,71 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Handle insert tags
*
* @param array $args
* @return string
*/
function smarty_core_run_insert_handler($params, &$smarty)
{
require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
if ($smarty->debugging) {
$_params = array();
$_debug_start_time = smarty_core_get_microtime($_params, $smarty);
}
if ($smarty->caching) {
$_arg_string = serialize($params['args']);
$_name = $params['args']['name'];
if (!isset($smarty->_cache_info['insert_tags'][$_name])) {
$smarty->_cache_info['insert_tags'][$_name] = array('insert',
$_name,
$smarty->_plugins['insert'][$_name][1],
$smarty->_plugins['insert'][$_name][2],
!empty($params['args']['script']) ? true : false);
}
return $smarty->_smarty_md5."{insert_cache $_arg_string}".$smarty->_smarty_md5;
} else {
if (isset($params['args']['script'])) {
$_params = array('resource_name' => $smarty->_dequote($params['args']['script']));
require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
if(!smarty_core_get_php_resource($_params, $smarty)) {
return false;
}
if ($_params['resource_type'] == 'file') {
$smarty->_include($_params['php_resource'], true);
} else {
$smarty->_eval($_params['php_resource']);
}
unset($params['args']['script']);
}
$_funcname = $smarty->_plugins['insert'][$params['args']['name']][0];
$_content = $_funcname($params['args'], $smarty);
if ($smarty->debugging) {
$_params = array();
require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
$smarty->_smarty_debug_info[] = array('type' => 'insert',
'filename' => 'insert_'.$params['args']['name'],
'depth' => $smarty->_inclusion_depth,
'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time);
}
if (!empty($params['args']["assign"])) {
$smarty->assign($params['args']["assign"], $_content);
} else {
return $_content;
}
}
}
/* vim: set expandtab: */
?>

View file

@ -1,50 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* called for included php files within templates
*
* @param string $smarty_file
* @param string $smarty_assign variable to assign the included template's
* output into
* @param boolean $smarty_once uses include_once if this is true
* @param array $smarty_include_vars associative array of vars from
* {include file="blah" var=$var}
*/
// $file, $assign, $once, $_smarty_include_vars
function smarty_core_smarty_include_php($params, &$smarty)
{
$_params = array('resource_name' => $params['smarty_file']);
require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
smarty_core_get_php_resource($_params, $smarty);
$_smarty_resource_type = $_params['resource_type'];
$_smarty_php_resource = $_params['php_resource'];
if (!empty($params['smarty_assign'])) {
ob_start();
if ($_smarty_resource_type == 'file') {
$smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']);
} else {
$smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']);
}
$smarty->assign($params['smarty_assign'], ob_get_contents());
ob_end_clean();
} else {
if ($_smarty_resource_type == 'file') {
$smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']);
} else {
$smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']);
}
}
}
/* vim: set expandtab: */
?>

View file

@ -1,96 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Prepend the cache information to the cache file
* and write it
*
* @param string $tpl_file
* @param string $cache_id
* @param string $compile_id
* @param string $results
* @return true|null
*/
// $tpl_file, $cache_id, $compile_id, $results
function smarty_core_write_cache_file($params, &$smarty)
{
// put timestamp in cache header
$smarty->_cache_info['timestamp'] = time();
if ($smarty->cache_lifetime > -1){
// expiration set
$smarty->_cache_info['expires'] = $smarty->_cache_info['timestamp'] + $smarty->cache_lifetime;
} else {
// cache will never expire
$smarty->_cache_info['expires'] = -1;
}
// collapse nocache.../nocache-tags
if (preg_match_all('!\{(/?)nocache\:[0-9a-f]{32}#\d+\}!', $params['results'], $match, PREG_PATTERN_ORDER)) {
// remove everything between every pair of outermost noache.../nocache-tags
// and replace it by a single nocache-tag
// this new nocache-tag will be replaced by dynamic contents in
// smarty_core_process_compiled_includes() on a cache-read
$match_count = count($match[0]);
$results = preg_split('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!', $params['results'], -1, PREG_SPLIT_DELIM_CAPTURE);
$level = 0;
$j = 0;
for ($i=0, $results_count = count($results); $i < $results_count && $j < $match_count; $i++) {
if ($results[$i] == $match[0][$j]) {
// nocache tag
if ($match[1][$j]) { // closing tag
$level--;
unset($results[$i]);
} else { // opening tag
if ($level++ > 0) unset($results[$i]);
}
$j++;
} elseif ($level > 0) {
unset($results[$i]);
}
}
$params['results'] = implode('', $results);
}
$smarty->_cache_info['cache_serials'] = $smarty->_cache_serials;
// prepend the cache header info into cache file
$_cache_info = serialize($smarty->_cache_info);
$params['results'] = strlen($_cache_info) . "\n" . $_cache_info . $params['results'];
if (!empty($smarty->cache_handler_func)) {
// use cache_handler function
call_user_func_array($smarty->cache_handler_func,
array('write', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], $smarty->_cache_info['expires']));
} else {
// use local cache file
if(!@is_writable($smarty->cache_dir)) {
// cache_dir not writable, see if it exists
if(!@is_dir($smarty->cache_dir)) {
$smarty->trigger_error('the $cache_dir \'' . $smarty->cache_dir . '\' does not exist, or is not a directory.', E_USER_ERROR);
return false;
}
$smarty->trigger_error('unable to write to $cache_dir \'' . realpath($smarty->cache_dir) . '\'. Be sure $cache_dir is writable by the web server user.', E_USER_ERROR);
return false;
}
$_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
$_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id);
$_params = array('filename' => $_cache_file, 'contents' => $params['results'], 'create_dirs' => true);
require_once(SMARTY_CORE_DIR . 'core.write_file.php');
smarty_core_write_file($_params, $smarty);
return true;
}
}
/* vim: set expandtab: */
?>

View file

@ -1,91 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Extract non-cacheable parts out of compiled template and write it
*
* @param string $compile_path
* @param string $template_compiled
* @return boolean
*/
function smarty_core_write_compiled_include($params, &$smarty)
{
$_tag_start = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{nocache\:('.$params['cache_serial'].')#(\d+)\}\'; endif;';
$_tag_end = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{/nocache\:(\\2)#(\\3)\}\'; endif;';
preg_match_all('!('.$_tag_start.'(.*)'.$_tag_end.')!Us',
$params['compiled_content'], $_match_source, PREG_SET_ORDER);
// no nocache-parts found: done
if (count($_match_source)==0) return;
// convert the matched php-code to functions
$_include_compiled = "<?php /* Smarty version ".$smarty->_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n";
$_include_compiled .= " compiled from " . strtr(urlencode($params['resource_name']), array('%2F'=>'/', '%3A'=>':')) . " */\n\n";
$_compile_path = $params['include_file_path'];
$smarty->_cache_serials[$_compile_path] = $params['cache_serial'];
$_include_compiled .= "\$this->_cache_serials['".$_compile_path."'] = '".$params['cache_serial']."';\n\n?>";
$_include_compiled .= $params['plugins_code'];
$_include_compiled .= "<?php";
$this_varname = ((double)phpversion() >= 5.0) ? '_smarty' : 'this';
for ($_i = 0, $_for_max = count($_match_source); $_i < $_for_max; $_i++) {
$_match =& $_match_source[$_i];
$source = $_match[4];
if ($this_varname == '_smarty') {
/* rename $this to $_smarty in the sourcecode */
$tokens = token_get_all('<?php ' . $_match[4]);
/* remove trailing <?php */
$open_tag = '';
while ($tokens) {
$token = array_shift($tokens);
if (is_array($token)) {
$open_tag .= $token[1];
} else {
$open_tag .= $token;
}
if ($open_tag == '<?php ') break;
}
for ($i=0, $count = count($tokens); $i < $count; $i++) {
if (is_array($tokens[$i])) {
if ($tokens[$i][0] == T_VARIABLE && $tokens[$i][1] == '$this') {
$tokens[$i] = '$' . $this_varname;
} else {
$tokens[$i] = $tokens[$i][1];
}
}
}
$source = implode('', $tokens);
}
/* add function to compiled include */
$_include_compiled .= "
function _smarty_tplfunc_$_match[2]_$_match[3](&\$$this_varname)
{
$source
}
";
}
$_include_compiled .= "\n\n?>\n";
$_params = array('filename' => $_compile_path,
'contents' => $_include_compiled, 'create_dirs' => true);
require_once(SMARTY_CORE_DIR . 'core.write_file.php');
smarty_core_write_file($_params, $smarty);
return true;
}
?>

View file

@ -1,35 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* write the compiled resource
*
* @param string $compile_path
* @param string $compiled_content
* @return true
*/
function smarty_core_write_compiled_resource($params, &$smarty)
{
if(!@is_writable($smarty->compile_dir)) {
// compile_dir not writable, see if it exists
if(!@is_dir($smarty->compile_dir)) {
$smarty->trigger_error('the $compile_dir \'' . $smarty->compile_dir . '\' does not exist, or is not a directory.', E_USER_ERROR);
return false;
}
$smarty->trigger_error('unable to write to $compile_dir \'' . realpath($smarty->compile_dir) . '\'. Be sure $compile_dir is writable by the web server user.', E_USER_ERROR);
return false;
}
$_params = array('filename' => $params['compile_path'], 'contents' => $params['compiled_content'], 'create_dirs' => true);
require_once(SMARTY_CORE_DIR . 'core.write_file.php');
smarty_core_write_file($_params, $smarty);
return true;
}
/* vim: set expandtab: */
?>

View file

@ -1,54 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* write out a file to disk
*
* @param string $filename
* @param string $contents
* @param boolean $create_dirs
* @return boolean
*/
function smarty_core_write_file($params, &$smarty)
{
$_dirname = dirname($params['filename']);
if ($params['create_dirs']) {
$_params = array('dir' => $_dirname);
require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php');
smarty_core_create_dir_structure($_params, $smarty);
}
// write to tmp file, then rename it to avoid file locking race condition
$_tmp_file = tempnam($_dirname, 'wrt');
if (!($fd = @fopen($_tmp_file, 'wb'))) {
$_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt');
if (!($fd = @fopen($_tmp_file, 'wb'))) {
$smarty->trigger_error("problem writing temporary file '$_tmp_file'");
return false;
}
}
fwrite($fd, $params['contents']);
fclose($fd);
if (DIRECTORY_SEPARATOR == '\\' || !@rename($_tmp_file, $params['filename'])) {
// On platforms and filesystems that cannot overwrite with rename()
// delete the file before renaming it -- because windows always suffers
// this, it is short-circuited to avoid the initial rename() attempt
@unlink($params['filename']);
@rename($_tmp_file, $params['filename']);
}
@chmod($params['filename'], $smarty->_file_perms);
return true;
}
/* vim: set expandtab: */
?>

View file

@ -1,39 +1,52 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
* Smarty plugin to format text blocks
*
* @package Smarty
* @subpackage PluginsBlock
*/
/**
* Smarty {textformat}{/textformat} block plugin
*
* Type: block function<br>
* Name: textformat<br>
* Type: block function
* Name: textformat
* Purpose: format text a certain way with preset styles
* or custom wrap/indent settings<br>
* @link http://smarty.php.net/manual/en/language.function.textformat.php {textformat}
* (Smarty online manual)
* @param array
* <pre>
* Params: style: string (email)
* indent: integer (0)
* wrap: integer (80)
* wrap_char string ("\n")
* indent_char: string (" ")
* wrap_boundary: boolean (true)
* </pre>
* or custom wrap/indent settings
* Params:
*
* - style - string (email)
* - indent - integer (0)
* - wrap - integer (80)
* - wrap_char - string ("\n")
* - indent_char - string (" ")
* - wrap_boundary - boolean (true)
*
* @link http://www.smarty.net/manual/en/language.function.textformat.php {textformat}
* (Smarty online manual)
*
* @param array $params parameters
* @param string $content contents of the block
* @param Smarty_Internal_Template $template template object
* @param boolean &$repeat repeat flag
*
* @return string content re-formatted
* @author Monte Ohrt <monte at ohrt dot com>
* @param string contents of the block
* @param Smarty clever simulation of a method
* @return string string $content re-formatted
* @throws \SmartyException
*/
function smarty_block_textformat($params, $content, &$smarty)
function smarty_block_textformat($params, $content, Smarty_Internal_Template $template, &$repeat)
{
if (is_null($content)) {
return;
}
if (Smarty::$_MBSTRING) {
$template->_checkPlugins(
array(
array(
'function' => 'smarty_modifier_mb_wordwrap',
'file' => SMARTY_PLUGINS_DIR . 'modifier.mb_wordwrap.php'
)
)
);
}
$style = null;
$indent = 0;
$indent_first = 0;
@ -42,7 +55,6 @@ function smarty_block_textformat($params, $content, &$smarty)
$wrap_char = "\n";
$wrap_cut = false;
$assign = null;
foreach ($params as $_key => $_val) {
switch ($_key) {
case 'style':
@ -51,53 +63,59 @@ function smarty_block_textformat($params, $content, &$smarty)
case 'assign':
$$_key = (string)$_val;
break;
case 'indent':
case 'indent_first':
case 'wrap':
$$_key = (int)$_val;
break;
case 'wrap_cut':
$$_key = (bool)$_val;
break;
default:
$smarty->trigger_error("textformat: unknown attribute '$_key'");
trigger_error("textformat: unknown attribute '{$_key}'");
}
}
if ($style == 'email') {
if ($style === 'email') {
$wrap = 72;
}
// split into paragraphs
$_paragraphs = preg_split('![\r\n][\r\n]!',$content);
$_output = '';
for($_x = 0, $_y = count($_paragraphs); $_x < $_y; $_x++) {
if ($_paragraphs[$_x] == '') {
$_paragraphs = preg_split('![\r\n]{2}!', $content);
foreach ($_paragraphs as &$_paragraph) {
if (!$_paragraph) {
continue;
}
// convert mult. spaces & special chars to single space
$_paragraphs[$_x] = preg_replace(array('!\s+!','!(^\s+)|(\s+$)!'), array(' ',''), $_paragraphs[$_x]);
$_paragraph =
preg_replace(
array(
'!\s+!' . Smarty::$_UTF8_MODIFIER,
'!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER
),
array(
' ',
''
),
$_paragraph
);
// indent first line
if($indent_first > 0) {
$_paragraphs[$_x] = str_repeat($indent_char, $indent_first) . $_paragraphs[$_x];
if ($indent_first > 0) {
$_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph;
}
// wordwrap sentences
$_paragraphs[$_x] = wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut);
if (Smarty::$_MBSTRING) {
$_paragraph = smarty_modifier_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut);
} else {
$_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut);
}
// indent lines
if($indent > 0) {
$_paragraphs[$_x] = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraphs[$_x]);
if ($indent > 0) {
$_paragraph = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraph);
}
}
$_output = implode($wrap_char . $wrap_char, $_paragraphs);
return $assign ? $smarty->assign($assign, $_output) : $_output;
if ($assign) {
$template->assign($assign, $_output);
} else {
return $_output;
}
}
/* vim: set expandtab: */
?>

View file

@ -1,40 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty {assign} compiler function plugin
*
* Type: compiler function<br>
* Name: assign<br>
* Purpose: assign a value to a template variable
* @link http://smarty.php.net/manual/en/language.custom.functions.php#LANGUAGE.FUNCTION.ASSIGN {assign}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com> (initial author)
* @author messju mohr <messju at lammfellpuschen dot de> (conversion to compiler function)
* @param string containing var-attribute and value-attribute
* @param Smarty_Compiler
*/
function smarty_compiler_assign($tag_attrs, &$compiler)
{
$_params = $compiler->_parse_attrs($tag_attrs);
if (!isset($_params['var'])) {
$compiler->_syntax_error("assign: missing 'var' parameter", E_USER_WARNING);
return;
}
if (!isset($_params['value'])) {
$compiler->_syntax_error("assign: missing 'value' parameter", E_USER_WARNING);
return;
}
return "\$this->assign({$_params['var']}, {$_params['value']});";
}
/* vim: set expandtab: */
?>

View file

@ -1,40 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty {assign_debug_info} function plugin
*
* Type: function<br>
* Name: assign_debug_info<br>
* Purpose: assign debug info to the template<br>
* @author Monte Ohrt <monte at ohrt dot com>
* @param array unused in this plugin, this plugin uses {@link Smarty::$_config},
* {@link Smarty::$_tpl_vars} and {@link Smarty::$_smarty_debug_info}
* @param Smarty
*/
function smarty_function_assign_debug_info($params, &$smarty)
{
$assigned_vars = $smarty->_tpl_vars;
ksort($assigned_vars);
if (@is_array($smarty->_config[0])) {
$config_vars = $smarty->_config[0];
ksort($config_vars);
$smarty->assign("_debug_config_keys", array_keys($config_vars));
$smarty->assign("_debug_config_vals", array_values($config_vars));
}
$included_templates = $smarty->_smarty_debug_info;
$smarty->assign("_debug_keys", array_keys($assigned_vars));
$smarty->assign("_debug_vals", array_values($assigned_vars));
$smarty->assign("_debug_tpls", $included_templates);
}
/* vim: set expandtab: */
?>

View file

@ -1,142 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty {config_load} function plugin
*
* Type: function<br>
* Name: config_load<br>
* Purpose: load config file vars
* @link http://smarty.php.net/manual/en/language.function.config.load.php {config_load}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @author messju mohr <messju at lammfellpuschen dot de> (added use of resources)
* @param array Format:
* <pre>
* array('file' => required config file name,
* 'section' => optional config file section to load
* 'scope' => local/parent/global
* 'global' => overrides scope, setting to parent if true)
* </pre>
* @param Smarty
*/
function smarty_function_config_load($params, &$smarty)
{
if ($smarty->debugging) {
$_params = array();
require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
$_debug_start_time = smarty_core_get_microtime($_params, $smarty);
}
$_file = isset($params['file']) ? $smarty->_dequote($params['file']) : null;
$_section = isset($params['section']) ? $smarty->_dequote($params['section']) : null;
$_scope = isset($params['scope']) ? $smarty->_dequote($params['scope']) : 'global';
$_global = isset($params['global']) ? $smarty->_dequote($params['global']) : false;
if (!isset($_file) || strlen($_file) == 0) {
$smarty->trigger_error("missing 'file' attribute in config_load tag", E_USER_ERROR, __FILE__, __LINE__);
}
if (isset($_scope)) {
if ($_scope != 'local' &&
$_scope != 'parent' &&
$_scope != 'global') {
$smarty->trigger_error("invalid 'scope' attribute value", E_USER_ERROR, __FILE__, __LINE__);
}
} else {
if ($_global) {
$_scope = 'parent';
} else {
$_scope = 'local';
}
}
$_params = array('resource_name' => $_file,
'resource_base_path' => $smarty->config_dir,
'get_source' => false);
$smarty->_parse_resource_name($_params);
$_file_path = $_params['resource_type'] . ':' . $_params['resource_name'];
if (isset($_section))
$_compile_file = $smarty->_get_compile_path($_file_path.'|'.$_section);
else
$_compile_file = $smarty->_get_compile_path($_file_path);
if($smarty->force_compile || !file_exists($_compile_file)) {
$_compile = true;
} elseif ($smarty->compile_check) {
$_params = array('resource_name' => $_file,
'resource_base_path' => $smarty->config_dir,
'get_source' => false);
$_compile = $smarty->_fetch_resource_info($_params) &&
$_params['resource_timestamp'] > filemtime($_compile_file);
} else {
$_compile = false;
}
if($_compile) {
// compile config file
if(!is_object($smarty->_conf_obj)) {
require_once SMARTY_DIR . $smarty->config_class . '.class.php';
$smarty->_conf_obj = new $smarty->config_class();
$smarty->_conf_obj->overwrite = $smarty->config_overwrite;
$smarty->_conf_obj->booleanize = $smarty->config_booleanize;
$smarty->_conf_obj->read_hidden = $smarty->config_read_hidden;
$smarty->_conf_obj->fix_newlines = $smarty->config_fix_newlines;
}
$_params = array('resource_name' => $_file,
'resource_base_path' => $smarty->config_dir,
$_params['get_source'] = true);
if (!$smarty->_fetch_resource_info($_params)) {
return;
}
$smarty->_conf_obj->set_file_contents($_file, $_params['source_content']);
$_config_vars = array_merge($smarty->_conf_obj->get($_file),
$smarty->_conf_obj->get($_file, $_section));
if(function_exists('var_export')) {
$_output = '<?php $_config_vars = ' . var_export($_config_vars, true) . '; ?>';
} else {
$_output = '<?php $_config_vars = unserialize(\'' . strtr(serialize($_config_vars),array('\''=>'\\\'', '\\'=>'\\\\')) . '\'); ?>';
}
$_params = (array('compile_path' => $_compile_file, 'compiled_content' => $_output, 'resource_timestamp' => $_params['resource_timestamp']));
require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php');
smarty_core_write_compiled_resource($_params, $smarty);
} else {
include($_compile_file);
}
if ($smarty->caching) {
$smarty->_cache_info['config'][$_file] = true;
}
$smarty->_config[0]['vars'] = @array_merge($smarty->_config[0]['vars'], $_config_vars);
$smarty->_config[0]['files'][$_file] = true;
if ($_scope == 'parent') {
$smarty->_config[1]['vars'] = @array_merge($smarty->_config[1]['vars'], $_config_vars);
$smarty->_config[1]['files'][$_file] = true;
} else if ($_scope == 'global') {
for ($i = 1, $for_max = count($smarty->_config); $i < $for_max; $i++) {
$smarty->_config[$i]['vars'] = @array_merge($smarty->_config[$i]['vars'], $_config_vars);
$smarty->_config[$i]['files'][$_file] = true;
}
}
if ($smarty->debugging) {
$_params = array();
require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
$smarty->_smarty_debug_info[] = array('type' => 'config',
'filename' => $_file.' ['.$_section.'] '.$_scope,
'depth' => $smarty->_inclusion_depth,
'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time);
}
}
/* vim: set expandtab: */
?>

View file

@ -1,80 +1,62 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsFunction
*/
/**
* Smarty {counter} function plugin
*
* Type: function<br>
* Name: counter<br>
* Type: function
* Name: counter
* Purpose: print out a counter value
*
* @author Monte Ohrt <monte at ohrt dot com>
* @link http://smarty.php.net/manual/en/language.function.counter.php {counter}
* (Smarty online manual)
* @param array parameters
* @param Smarty
* @link http://www.smarty.net/manual/en/language.function.counter.php {counter}
* (Smarty online manual)
*
* @param array $params parameters
* @param Smarty_Internal_Template $template template object
*
* @return string|null
*/
function smarty_function_counter($params, &$smarty)
function smarty_function_counter($params, $template)
{
static $counters = array();
$name = (isset($params['name'])) ? $params['name'] : 'default';
if (!isset($counters[$name])) {
$counters[$name] = array(
'start'=>1,
'skip'=>1,
'direction'=>'up',
'count'=>1
);
$name = (isset($params[ 'name' ])) ? $params[ 'name' ] : 'default';
if (!isset($counters[ $name ])) {
$counters[ $name ] = array('start' => 1, 'skip' => 1, 'direction' => 'up', 'count' => 1);
}
$counter =& $counters[$name];
if (isset($params['start'])) {
$counter['start'] = $counter['count'] = (int)$params['start'];
$counter =& $counters[ $name ];
if (isset($params[ 'start' ])) {
$counter[ 'start' ] = $counter[ 'count' ] = (int)$params[ 'start' ];
}
if (!empty($params['assign'])) {
$counter['assign'] = $params['assign'];
if (!empty($params[ 'assign' ])) {
$counter[ 'assign' ] = $params[ 'assign' ];
}
if (isset($counter['assign'])) {
$smarty->assign($counter['assign'], $counter['count']);
if (isset($counter[ 'assign' ])) {
$template->assign($counter[ 'assign' ], $counter[ 'count' ]);
}
if (isset($params['print'])) {
$print = (bool)$params['print'];
if (isset($params[ 'print' ])) {
$print = (bool)$params[ 'print' ];
} else {
$print = empty($counter['assign']);
$print = empty($counter[ 'assign' ]);
}
if ($print) {
$retval = $counter['count'];
$retval = $counter[ 'count' ];
} else {
$retval = null;
}
if (isset($params['skip'])) {
$counter['skip'] = $params['skip'];
if (isset($params[ 'skip' ])) {
$counter[ 'skip' ] = $params[ 'skip' ];
}
if (isset($params['direction'])) {
$counter['direction'] = $params['direction'];
if (isset($params[ 'direction' ])) {
$counter[ 'direction' ] = $params[ 'direction' ];
}
if ($counter[ 'direction' ] === 'down') {
$counter[ 'count' ] -= $counter[ 'skip' ];
} else {
$counter[ 'count' ] += $counter[ 'skip' ];
}
if ($counter['direction'] == "down")
$counter['count'] -= $counter['skip'];
else
$counter['count'] += $counter['skip'];
return $retval;
}
/* vim: set expandtab: */
?>

View file

@ -1,106 +1,92 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsFunction
*/
/**
* Smarty {cycle} function plugin
* Type: function
* Name: cycle
* Date: May 3, 2002
* Purpose: cycle through given values
* Params:
*
* Type: function<br>
* Name: cycle<br>
* Date: May 3, 2002<br>
* Purpose: cycle through given values<br>
* Input:
* - name = name of cycle (optional)
* - values = comma separated list of values to cycle,
* or an array of values to cycle
* (this can be left out for subsequent calls)
* - reset = boolean - resets given var to true
* - print = boolean - print var or not. default is true
* - advance = boolean - whether or not to advance the cycle
* - delimiter = the value delimiter, default is ","
* - assign = boolean, assigns to template var instead of
* printed.
* - name - name of cycle (optional)
* - values - comma separated list of values to cycle, or an array of values to cycle
* (this can be left out for subsequent calls)
* - reset - boolean - resets given var to true
* - print - boolean - print var or not. default is true
* - advance - boolean - whether or not to advance the cycle
* - delimiter - the value delimiter, default is ","
* - assign - boolean, assigns to template var instead of printed.
*
* Examples:
*
* Examples:<br>
* <pre>
* {cycle values="#eeeeee,#d0d0d0d"}
* {cycle name=row values="one,two,three" reset=true}
* {cycle name=row}
* </pre>
* @link http://smarty.php.net/manual/en/language.function.cycle.php {cycle}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @author credit to Mark Priatel <mpriatel@rogers.com>
* @author credit to Gerard <gerard@interfold.com>
* @author credit to Jason Sweat <jsweat_php@yahoo.com>
* @version 1.3
* @param array
* @param Smarty
*
* @link http://www.smarty.net/manual/en/language.function.cycle.php {cycle}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @author credit to Mark Priatel <mpriatel@rogers.com>
* @author credit to Gerard <gerard@interfold.com>
* @author credit to Jason Sweat <jsweat_php@yahoo.com>
* @version 1.3
*
* @param array $params parameters
* @param Smarty_Internal_Template $template template object
*
* @return string|null
*/
function smarty_function_cycle($params, &$smarty)
function smarty_function_cycle($params, $template)
{
static $cycle_vars;
$name = (empty($params['name'])) ? 'default' : $params['name'];
$print = (isset($params['print'])) ? (bool)$params['print'] : true;
$advance = (isset($params['advance'])) ? (bool)$params['advance'] : true;
$reset = (isset($params['reset'])) ? (bool)$params['reset'] : false;
if (!in_array('values', array_keys($params))) {
if(!isset($cycle_vars[$name]['values'])) {
$smarty->trigger_error("cycle: missing 'values' parameter");
$name = (empty($params[ 'name' ])) ? 'default' : $params[ 'name' ];
$print = (isset($params[ 'print' ])) ? (bool)$params[ 'print' ] : true;
$advance = (isset($params[ 'advance' ])) ? (bool)$params[ 'advance' ] : true;
$reset = (isset($params[ 'reset' ])) ? (bool)$params[ 'reset' ] : false;
if (!isset($params[ 'values' ])) {
if (!isset($cycle_vars[ $name ][ 'values' ])) {
trigger_error('cycle: missing \'values\' parameter');
return;
}
} else {
if(isset($cycle_vars[$name]['values'])
&& $cycle_vars[$name]['values'] != $params['values'] ) {
$cycle_vars[$name]['index'] = 0;
if (isset($cycle_vars[ $name ][ 'values' ]) && $cycle_vars[ $name ][ 'values' ] !== $params[ 'values' ]) {
$cycle_vars[ $name ][ 'index' ] = 0;
}
$cycle_vars[$name]['values'] = $params['values'];
$cycle_vars[ $name ][ 'values' ] = $params[ 'values' ];
}
if (isset($params['delimiter'])) {
$cycle_vars[$name]['delimiter'] = $params['delimiter'];
} elseif (!isset($cycle_vars[$name]['delimiter'])) {
$cycle_vars[$name]['delimiter'] = ',';
if (isset($params[ 'delimiter' ])) {
$cycle_vars[ $name ][ 'delimiter' ] = $params[ 'delimiter' ];
} elseif (!isset($cycle_vars[ $name ][ 'delimiter' ])) {
$cycle_vars[ $name ][ 'delimiter' ] = ',';
}
if(is_array($cycle_vars[$name]['values'])) {
$cycle_array = $cycle_vars[$name]['values'];
if (is_array($cycle_vars[ $name ][ 'values' ])) {
$cycle_array = $cycle_vars[ $name ][ 'values' ];
} else {
$cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']);
$cycle_array = explode($cycle_vars[ $name ][ 'delimiter' ], $cycle_vars[ $name ][ 'values' ]);
}
if(!isset($cycle_vars[$name]['index']) || $reset ) {
$cycle_vars[$name]['index'] = 0;
if (!isset($cycle_vars[ $name ][ 'index' ]) || $reset) {
$cycle_vars[ $name ][ 'index' ] = 0;
}
if (isset($params['assign'])) {
if (isset($params[ 'assign' ])) {
$print = false;
$smarty->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]);
$template->assign($params[ 'assign' ], $cycle_array[ $cycle_vars[ $name ][ 'index' ] ]);
}
if($print) {
$retval = $cycle_array[$cycle_vars[$name]['index']];
if ($print) {
$retval = $cycle_array[ $cycle_vars[ $name ][ 'index' ] ];
} else {
$retval = null;
}
if($advance) {
if ( $cycle_vars[$name]['index'] >= count($cycle_array) -1 ) {
$cycle_vars[$name]['index'] = 0;
if ($advance) {
if ($cycle_vars[ $name ][ 'index' ] >= count($cycle_array) - 1) {
$cycle_vars[ $name ][ 'index' ] = 0;
} else {
$cycle_vars[$name]['index']++;
$cycle_vars[ $name ][ 'index' ]++;
}
}
return $retval;
}
/* vim: set expandtab: */
?>

View file

@ -1,35 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty {debug} function plugin
*
* Type: function<br>
* Name: debug<br>
* Date: July 1, 2002<br>
* Purpose: popup debug window
* @link http://smarty.php.net/manual/en/language.function.debug.php {debug}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @version 1.0
* @param array
* @param Smarty
* @return string output from {@link Smarty::_generate_debug_output()}
*/
function smarty_function_debug($params, &$smarty)
{
if (isset($params['output'])) {
$smarty->assign('_smarty_debug_output', $params['output']);
}
require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
return smarty_core_display_debug_console(null, $smarty);
}
/* vim: set expandtab: */
?>

View file

@ -1,49 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty {eval} function plugin
*
* Type: function<br>
* Name: eval<br>
* Purpose: evaluate a template variable as a template<br>
* @link http://smarty.php.net/manual/en/language.function.eval.php {eval}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param array
* @param Smarty
*/
function smarty_function_eval($params, &$smarty)
{
if (!isset($params['var'])) {
$smarty->trigger_error("eval: missing 'var' parameter");
return;
}
if($params['var'] == '') {
return;
}
$smarty->_compile_source('evaluated template', $params['var'], $_var_compiled);
ob_start();
$smarty->_eval('?>' . $_var_compiled);
$_contents = ob_get_contents();
ob_end_clean();
if (!empty($params['assign'])) {
$smarty->assign($params['assign'], $_contents);
} else {
return $_contents;
}
}
/* vim: set expandtab: */
?>

View file

@ -1,221 +1,204 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsFunction
*/
/**
* Smarty {fetch} plugin
*
* Type: function<br>
* Name: fetch<br>
* Type: function
* Name: fetch
* Purpose: fetch file, web or ftp data and display results
* @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch}
* (Smarty online manual)
*
* @link http://www.smarty.net/manual/en/language.function.fetch.php {fetch}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param array
* @param Smarty
* @return string|null if the assign parameter is passed, Smarty assigns the
* result to a template variable
*
* @param array $params parameters
* @param Smarty_Internal_Template $template template object
*
* @throws SmartyException
* @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable
*/
function smarty_function_fetch($params, &$smarty)
function smarty_function_fetch($params, $template)
{
if (empty($params['file'])) {
$smarty->_trigger_fatal_error("[plugin] parameter 'file' cannot be empty");
if (empty($params[ 'file' ])) {
trigger_error('[plugin] fetch parameter \'file\' cannot be empty', E_USER_NOTICE);
return;
}
$content = '';
if ($smarty->security && !preg_match('!^(http|ftp)://!i', $params['file'])) {
$_params = array('resource_type' => 'file', 'resource_name' => $params['file']);
require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
if(!smarty_core_is_secure($_params, $smarty)) {
$smarty->_trigger_fatal_error('[plugin] (secure mode) fetch \'' . $params['file'] . '\' is not allowed');
return;
}
// fetch the file
if($fp = @fopen($params['file'],'r')) {
while(!feof($fp)) {
$content .= fgets ($fp,4096);
// strip file protocol
if (stripos($params[ 'file' ], 'file://') === 0) {
$params[ 'file' ] = substr($params[ 'file' ], 7);
}
$protocol = strpos($params[ 'file' ], '://');
if ($protocol !== false) {
$protocol = strtolower(substr($params[ 'file' ], 0, $protocol));
}
if (isset($template->smarty->security_policy)) {
if ($protocol) {
// remote resource (or php stream, …)
if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) {
return;
}
fclose($fp);
} else {
$smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\'');
// local file
if (!$template->smarty->security_policy->isTrustedResourceDir($params[ 'file' ])) {
return;
}
}
}
$content = '';
if ($protocol === 'http') {
// http fetch
if ($uri_parts = parse_url($params[ 'file' ])) {
// set defaults
$host = $server_name = $uri_parts[ 'host' ];
$timeout = 30;
$accept = 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*';
$agent = 'Smarty Template Engine ' . Smarty::SMARTY_VERSION;
$referer = '';
$uri = !empty($uri_parts[ 'path' ]) ? $uri_parts[ 'path' ] : '/';
$uri .= !empty($uri_parts[ 'query' ]) ? '?' . $uri_parts[ 'query' ] : '';
$_is_proxy = false;
if (empty($uri_parts[ 'port' ])) {
$port = 80;
} else {
$port = $uri_parts[ 'port' ];
}
if (!empty($uri_parts[ 'user' ])) {
$user = $uri_parts[ 'user' ];
}
if (!empty($uri_parts[ 'pass' ])) {
$pass = $uri_parts[ 'pass' ];
}
// loop through parameters, setup headers
foreach ($params as $param_key => $param_value) {
switch ($param_key) {
case 'file':
case 'assign':
case 'assign_headers':
break;
case 'user':
if (!empty($param_value)) {
$user = $param_value;
}
break;
case 'pass':
if (!empty($param_value)) {
$pass = $param_value;
}
break;
case 'accept':
if (!empty($param_value)) {
$accept = $param_value;
}
break;
case 'header':
if (!empty($param_value)) {
if (!preg_match('![\w\d-]+: .+!', $param_value)) {
trigger_error("[plugin] invalid header format '{$param_value}'", E_USER_NOTICE);
return;
} else {
$extra_headers[] = $param_value;
}
}
break;
case 'proxy_host':
if (!empty($param_value)) {
$proxy_host = $param_value;
}
break;
case 'proxy_port':
if (!preg_match('!\D!', $param_value)) {
$proxy_port = (int)$param_value;
} else {
trigger_error("[plugin] invalid value for attribute '{$param_key }'", E_USER_NOTICE);
return;
}
break;
case 'agent':
if (!empty($param_value)) {
$agent = $param_value;
}
break;
case 'referer':
if (!empty($param_value)) {
$referer = $param_value;
}
break;
case 'timeout':
if (!preg_match('!\D!', $param_value)) {
$timeout = (int)$param_value;
} else {
trigger_error("[plugin] invalid value for attribute '{$param_key}'", E_USER_NOTICE);
return;
}
break;
default:
trigger_error("[plugin] unrecognized attribute '{$param_key}'", E_USER_NOTICE);
return;
}
}
if (!empty($proxy_host) && !empty($proxy_port)) {
$_is_proxy = true;
$fp = fsockopen($proxy_host, $proxy_port, $errno, $errstr, $timeout);
} else {
$fp = fsockopen($server_name, $port, $errno, $errstr, $timeout);
}
if (!$fp) {
trigger_error("[plugin] unable to fetch: $errstr ($errno)", E_USER_NOTICE);
return;
} else {
if ($_is_proxy) {
fputs($fp, 'GET ' . $params[ 'file' ] . " HTTP/1.0\r\n");
} else {
fputs($fp, "GET $uri HTTP/1.0\r\n");
}
if (!empty($host)) {
fputs($fp, "Host: $host\r\n");
}
if (!empty($accept)) {
fputs($fp, "Accept: $accept\r\n");
}
if (!empty($agent)) {
fputs($fp, "User-Agent: $agent\r\n");
}
if (!empty($referer)) {
fputs($fp, "Referer: $referer\r\n");
}
if (isset($extra_headers) && is_array($extra_headers)) {
foreach ($extra_headers as $curr_header) {
fputs($fp, $curr_header . "\r\n");
}
}
if (!empty($user) && !empty($pass)) {
fputs($fp, 'Authorization: BASIC ' . base64_encode("$user:$pass") . "\r\n");
}
fputs($fp, "\r\n");
while (!feof($fp)) {
$content .= fgets($fp, 4096);
}
fclose($fp);
$csplit = preg_split("!\r\n\r\n!", $content, 2);
$content = $csplit[ 1 ];
if (!empty($params[ 'assign_headers' ])) {
$template->assign($params[ 'assign_headers' ], preg_split("!\r\n!", $csplit[ 0 ]));
}
}
} else {
trigger_error("[plugin fetch] unable to parse URL, check syntax", E_USER_NOTICE);
return;
}
} else {
// not a local file
if(preg_match('!^http://!i',$params['file'])) {
// http fetch
if($uri_parts = parse_url($params['file'])) {
// set defaults
$host = $server_name = $uri_parts['host'];
$timeout = 30;
$accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
$agent = "Smarty Template Engine ".$smarty->_version;
$referer = "";
$uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/';
$uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : '';
$_is_proxy = false;
if(empty($uri_parts['port'])) {
$port = 80;
} else {
$port = $uri_parts['port'];
}
if(!empty($uri_parts['user'])) {
$user = $uri_parts['user'];
}
if(!empty($uri_parts['pass'])) {
$pass = $uri_parts['pass'];
}
// loop through parameters, setup headers
foreach($params as $param_key => $param_value) {
switch($param_key) {
case "file":
case "assign":
case "assign_headers":
break;
case "user":
if(!empty($param_value)) {
$user = $param_value;
}
break;
case "pass":
if(!empty($param_value)) {
$pass = $param_value;
}
break;
case "accept":
if(!empty($param_value)) {
$accept = $param_value;
}
break;
case "header":
if(!empty($param_value)) {
if(!preg_match('![\w\d-]+: .+!',$param_value)) {
$smarty->_trigger_fatal_error("[plugin] invalid header format '".$param_value."'");
return;
} else {
$extra_headers[] = $param_value;
}
}
break;
case "proxy_host":
if(!empty($param_value)) {
$proxy_host = $param_value;
}
break;
case "proxy_port":
if(!preg_match('!\D!', $param_value)) {
$proxy_port = (int) $param_value;
} else {
$smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
return;
}
break;
case "agent":
if(!empty($param_value)) {
$agent = $param_value;
}
break;
case "referer":
if(!empty($param_value)) {
$referer = $param_value;
}
break;
case "timeout":
if(!preg_match('!\D!', $param_value)) {
$timeout = (int) $param_value;
} else {
$smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
return;
}
break;
default:
$smarty->_trigger_fatal_error("[plugin] unrecognized attribute '".$param_key."'");
return;
}
}
if(!empty($proxy_host) && !empty($proxy_port)) {
$_is_proxy = true;
$fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout);
} else {
$fp = fsockopen($server_name,$port,$errno,$errstr,$timeout);
}
if(!$fp) {
$smarty->_trigger_fatal_error("[plugin] unable to fetch: $errstr ($errno)");
return;
} else {
if($_is_proxy) {
fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n");
} else {
fputs($fp, "GET $uri HTTP/1.0\r\n");
}
if(!empty($host)) {
fputs($fp, "Host: $host\r\n");
}
if(!empty($accept)) {
fputs($fp, "Accept: $accept\r\n");
}
if(!empty($agent)) {
fputs($fp, "User-Agent: $agent\r\n");
}
if(!empty($referer)) {
fputs($fp, "Referer: $referer\r\n");
}
if(isset($extra_headers) && is_array($extra_headers)) {
foreach($extra_headers as $curr_header) {
fputs($fp, $curr_header."\r\n");
}
}
if(!empty($user) && !empty($pass)) {
fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n");
}
fputs($fp, "\r\n");
while(!feof($fp)) {
$content .= fgets($fp,4096);
}
fclose($fp);
$csplit = preg_split("!\r\n\r\n!",$content,2);
$content = $csplit[1];
if(!empty($params['assign_headers'])) {
$smarty->assign($params['assign_headers'],preg_split("!\r\n!",$csplit[0]));
}
}
} else {
$smarty->_trigger_fatal_error("[plugin] unable to parse URL, check syntax");
return;
}
} else {
// ftp fetch
if($fp = @fopen($params['file'],'r')) {
while(!feof($fp)) {
$content .= fgets ($fp,4096);
}
fclose($fp);
} else {
$smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] .'\'');
return;
}
$content = @file_get_contents($params[ 'file' ]);
if ($content === false) {
throw new SmartyException("{fetch} cannot read resource '" . $params[ 'file' ] . "'");
}
}
if (!empty($params['assign'])) {
$smarty->assign($params['assign'],$content);
if (!empty($params[ 'assign' ])) {
$template->assign($params[ 'assign' ], $content);
} else {
return $content;
}
}
/* vim: set expandtab: */
?>

View file

@ -1,143 +1,286 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsFunction
*/
/**
* Smarty {html_checkboxes} function plugin
*
* File: function.html_checkboxes.php<br>
* Type: function<br>
* Name: html_checkboxes<br>
* Date: 24.Feb.2003<br>
* Purpose: Prints out a list of checkbox input types<br>
* Input:<br>
* - name (optional) - string default "checkbox"
* - values (required) - array
* - options (optional) - associative array
* - checked (optional) - array default not set
* - separator (optional) - ie <br> or &nbsp;
* - output (optional) - the output next to each checkbox
* - assign (optional) - assign the output as an array to this variable
* File: function.html_checkboxes.php
* Type: function
* Name: html_checkboxes
* Date: 24.Feb.2003
* Purpose: Prints out a list of checkbox input types
* Examples:
* <pre>
*
* {html_checkboxes values=$ids output=$names}
* {html_checkboxes values=$ids name='box' separator='<br>' output=$names}
* {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names}
* </pre>
* @link http://smarty.php.net/manual/en/language.function.html.checkboxes.php {html_checkboxes}
* (Smarty online manual)
* @author Christopher Kvarme <christopher.kvarme@flashjab.com>
* @author credits to Monte Ohrt <monte at ohrt dot com>
* @version 1.0
* @param array
* @param Smarty
*
* Params:
*
* - name (optional) - string default "checkbox"
* - values (required) - array
* - options (optional) - associative array
* - checked (optional) - array default not set
* - separator (optional) - ie <br> or &nbsp;
* - output (optional) - the output next to each checkbox
* - assign (optional) - assign the output as an array to this variable
* - escape (optional) - escape the content (not value), defaults to true
*
* @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes}
* (Smarty online manual)
* @author Christopher Kvarme <christopher.kvarme@flashjab.com>
* @author credits to Monte Ohrt <monte at ohrt dot com>
* @version 1.0
*
* @param array $params parameters
* @param Smarty_Internal_Template $template template object
*
* @return string
* @uses smarty_function_escape_special_chars()
* @uses smarty_function_escape_special_chars()
* @throws \SmartyException
*/
function smarty_function_html_checkboxes($params, &$smarty)
function smarty_function_html_checkboxes($params, Smarty_Internal_Template $template)
{
require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
$template->_checkPlugins(
array(
array(
'function' => 'smarty_function_escape_special_chars',
'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
)
)
);
$name = 'checkbox';
$values = null;
$options = null;
$selected = null;
$selected = array();
$separator = '';
$escape = true;
$labels = true;
$label_ids = false;
$output = null;
$extra = '';
foreach($params as $_key => $_val) {
switch($_key) {
foreach ($params as $_key => $_val) {
switch ($_key) {
case 'name':
case 'separator':
$$_key = $_val;
$$_key = (string)$_val;
break;
case 'escape':
case 'labels':
case 'label_ids':
$$_key = (bool)$_val;
break;
case 'options':
$$_key = (array)$_val;
break;
case 'values':
case 'output':
$$_key = array_values((array)$_val);
break;
case 'checked':
case 'selected':
$selected = array_map('strval', array_values((array)$_val));
if (is_array($_val)) {
$selected = array();
foreach ($_val as $_sel) {
if (is_object($_sel)) {
if (method_exists($_sel, '__toString')) {
$_sel = smarty_function_escape_special_chars((string)$_sel->__toString());
} else {
trigger_error(
'html_checkboxes: selected attribute contains an object of class \'' .
get_class($_sel) . '\' without __toString() method',
E_USER_NOTICE
);
continue;
}
} else {
$_sel = smarty_function_escape_special_chars((string)$_sel);
}
$selected[ $_sel ] = true;
}
} elseif (is_object($_val)) {
if (method_exists($_val, '__toString')) {
$selected = smarty_function_escape_special_chars((string)$_val->__toString());
} else {
trigger_error(
'html_checkboxes: selected attribute is an object of class \'' . get_class($_val) .
'\' without __toString() method',
E_USER_NOTICE
);
}
} else {
$selected = smarty_function_escape_special_chars((string)$_val);
}
break;
case 'checkboxes':
$smarty->trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING);
trigger_error(
'html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead',
E_USER_WARNING
);
$options = (array)$_val;
break;
case 'assign':
break;
case 'strict':
break;
case 'disabled':
case 'readonly':
if (!empty($params[ 'strict' ])) {
if (!is_scalar($_val)) {
trigger_error(
"html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute",
E_USER_NOTICE
);
}
if ($_val === true || $_val === $_key) {
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
}
break;
}
// omit break; to fall through!
// no break
default:
if(!is_array($_val)) {
$extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
if (!is_array($_val)) {
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
} else {
$smarty->trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
trigger_error("html_checkboxes: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
}
break;
}
}
if (!isset($options) && !isset($values))
return ''; /* raise error here? */
settype($selected, 'array');
if (!isset($options) && !isset($values)) {
return '';
} /* raise error here? */
$_html_result = array();
if (isset($options)) {
foreach ($options as $_key=>$_val)
$_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels);
} else {
foreach ($values as $_i=>$_key) {
$_val = isset($output[$_i]) ? $output[$_i] : '';
$_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels);
foreach ($options as $_key => $_val) {
$_html_result[] =
smarty_function_html_checkboxes_output(
$name,
$_key,
$_val,
$selected,
$extra,
$separator,
$labels,
$label_ids,
$escape
);
}
}
if(!empty($params['assign'])) {
$smarty->assign($params['assign'], $_html_result);
} else {
return implode("\n",$_html_result);
foreach ($values as $_i => $_key) {
$_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
$_html_result[] =
smarty_function_html_checkboxes_output(
$name,
$_key,
$_val,
$selected,
$extra,
$separator,
$labels,
$label_ids,
$escape
);
}
}
if (!empty($params[ 'assign' ])) {
$template->assign($params[ 'assign' ], $_html_result);
} else {
return implode("\n", $_html_result);
}
}
function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels) {
/**
* @param $name
* @param $value
* @param $output
* @param $selected
* @param $extra
* @param $separator
* @param $labels
* @param $label_ids
* @param bool $escape
*
* @return string
*/
function smarty_function_html_checkboxes_output(
$name,
$value,
$output,
$selected,
$extra,
$separator,
$labels,
$label_ids,
$escape = true
) {
$_output = '';
if ($labels) $_output .= '<label>';
$_output .= '<input type="checkbox" name="'
. smarty_function_escape_special_chars($name) . '[]" value="'
. smarty_function_escape_special_chars($value) . '"';
if (in_array((string)$value, $selected)) {
if (is_object($value)) {
if (method_exists($value, '__toString')) {
$value = (string)$value->__toString();
} else {
trigger_error(
'html_options: value is an object of class \'' . get_class($value) .
'\' without __toString() method',
E_USER_NOTICE
);
return '';
}
} else {
$value = (string)$value;
}
if (is_object($output)) {
if (method_exists($output, '__toString')) {
$output = (string)$output->__toString();
} else {
trigger_error(
'html_options: output is an object of class \'' . get_class($output) .
'\' without __toString() method',
E_USER_NOTICE
);
return '';
}
} else {
$output = (string)$output;
}
if ($labels) {
if ($label_ids) {
$_id = smarty_function_escape_special_chars(
preg_replace(
'![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER,
'_',
$name . '_' . $value
)
);
$_output .= '<label for="' . $_id . '">';
} else {
$_output .= '<label>';
}
}
$name = smarty_function_escape_special_chars($name);
$value = smarty_function_escape_special_chars($value);
if ($escape) {
$output = smarty_function_escape_special_chars($output);
}
$_output .= '<input type="checkbox" name="' . $name . '[]" value="' . $value . '"';
if ($labels && $label_ids) {
$_output .= ' id="' . $_id . '"';
}
if (is_array($selected)) {
if (isset($selected[ $value ])) {
$_output .= ' checked="checked"';
}
} elseif ($value === $selected) {
$_output .= ' checked="checked"';
}
$_output .= $extra . ' />' . $output;
if ($labels) $_output .= '</label>';
$_output .= $separator;
if ($labels) {
$_output .= '</label>';
}
$_output .= $separator;
return $_output;
}
?>

View file

@ -1,43 +1,49 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsFunction
*/
/**
* Smarty {html_image} function plugin
*
* Type: function<br>
* Name: html_image<br>
* Date: Feb 24, 2003<br>
* Purpose: format HTML tags for the image<br>
* Input:<br>
* - file = file (and path) of image (required)
* - height = image height (optional, default actual height)
* - width = image width (optional, default actual width)
* - basedir = base directory for absolute paths, default
* is environment variable DOCUMENT_ROOT
* - path_prefix = prefix for path output (optional, default empty)
*
* Type: function
* Name: html_image
* Date: Feb 24, 2003
* Purpose: format HTML tags for the image
* Examples: {html_image file="/images/masthead.gif"}
* Output: <img src="/images/masthead.gif" width=400 height=23>
* @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @author credits to Duda <duda@big.hu> - wrote first image function
* in repository, helped with lots of functionality
* @version 1.0
* @param array
* @param Smarty
* Params:
*
* - file - (required) - file (and path) of image
* - height - (optional) - image height (default actual height)
* - width - (optional) - image width (default actual width)
* - basedir - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT
* - path_prefix - prefix for path output (optional, default empty)
*
* @link http://www.smarty.net/manual/en/language.function.html.image.php {html_image}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @author credits to Duda <duda@big.hu>
* @version 1.0
*
* @param array $params parameters
* @param Smarty_Internal_Template $template template object
*
* @throws SmartyException
* @return string
* @uses smarty_function_escape_special_chars()
* @uses smarty_function_escape_special_chars()
*/
function smarty_function_html_image($params, &$smarty)
function smarty_function_html_image($params, Smarty_Internal_Template $template)
{
require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
$template->_checkPlugins(
array(
array(
'function' => 'smarty_function_escape_special_chars',
'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
)
)
);
$alt = '';
$file = '';
$height = '';
@ -46,10 +52,9 @@ function smarty_function_html_image($params, &$smarty)
$prefix = '';
$suffix = '';
$path_prefix = '';
$server_vars = ($smarty->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
$basedir = isset($server_vars['DOCUMENT_ROOT']) ? $server_vars['DOCUMENT_ROOT'] : '';
foreach($params as $_key => $_val) {
switch($_key) {
$basedir = isset($_SERVER[ 'DOCUMENT_ROOT' ]) ? $_SERVER[ 'DOCUMENT_ROOT' ] : '';
foreach ($params as $_key => $_val) {
switch ($_key) {
case 'file':
case 'height':
case 'width':
@ -58,85 +63,96 @@ function smarty_function_html_image($params, &$smarty)
case 'basedir':
$$_key = $_val;
break;
case 'alt':
if(!is_array($_val)) {
if (!is_array($_val)) {
$$_key = smarty_function_escape_special_chars($_val);
} else {
$smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
throw new SmartyException(
"html_image: extra attribute '{$_key}' cannot be an array",
E_USER_NOTICE
);
}
break;
case 'link':
case 'href':
$prefix = '<a href="' . $_val . '">';
$suffix = '</a>';
break;
default:
if(!is_array($_val)) {
$extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
if (!is_array($_val)) {
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
} else {
$smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
throw new SmartyException(
"html_image: extra attribute '{$_key}' cannot be an array",
E_USER_NOTICE
);
}
break;
}
}
if (empty($file)) {
$smarty->trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE);
trigger_error('html_image: missing \'file\' parameter', E_USER_NOTICE);
return;
}
if (substr($file,0,1) == '/') {
if ($file[ 0 ] === '/') {
$_image_path = $basedir . $file;
} else {
$_image_path = $file;
}
if(!isset($params['width']) || !isset($params['height'])) {
if(!$_image_data = @getimagesize($_image_path)) {
if(!file_exists($_image_path)) {
$smarty->trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE);
// strip file protocol
if (stripos($params[ 'file' ], 'file://') === 0) {
$params[ 'file' ] = substr($params[ 'file' ], 7);
}
$protocol = strpos($params[ 'file' ], '://');
if ($protocol !== false) {
$protocol = strtolower(substr($params[ 'file' ], 0, $protocol));
}
if (isset($template->smarty->security_policy)) {
if ($protocol) {
// remote resource (or php stream, …)
if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) {
return;
} else if(!is_readable($_image_path)) {
$smarty->trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE);
return;
} else {
$smarty->trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE);
}
} else {
// local file
if (!$template->smarty->security_policy->isTrustedResourceDir($_image_path)) {
return;
}
}
if ($smarty->security &&
($_params = array('resource_type' => 'file', 'resource_name' => $_image_path)) &&
(require_once(SMARTY_CORE_DIR . 'core.is_secure.php')) &&
(!smarty_core_is_secure($_params, $smarty)) ) {
$smarty->trigger_error("html_image: (secure) '$_image_path' not in secure directory", E_USER_NOTICE);
}
if(!isset($params['width'])) {
$width = $_image_data[0];
}
if(!isset($params['height'])) {
$height = $_image_data[1];
}
}
if(isset($params['dpi'])) {
if(strstr($server_vars['HTTP_USER_AGENT'], 'Mac')) {
if (!isset($params[ 'width' ]) || !isset($params[ 'height' ])) {
// FIXME: (rodneyrehm) getimagesize() loads the complete file off a remote resource, use custom [jpg,png,gif]header reader!
if (!$_image_data = @getimagesize($_image_path)) {
if (!file_exists($_image_path)) {
trigger_error("html_image: unable to find '{$_image_path}'", E_USER_NOTICE);
return;
} elseif (!is_readable($_image_path)) {
trigger_error("html_image: unable to read '{$_image_path}'", E_USER_NOTICE);
return;
} else {
trigger_error("html_image: '{$_image_path}' is not a valid image file", E_USER_NOTICE);
return;
}
}
if (!isset($params[ 'width' ])) {
$width = $_image_data[ 0 ];
}
if (!isset($params[ 'height' ])) {
$height = $_image_data[ 1 ];
}
}
if (isset($params[ 'dpi' ])) {
if (strstr($_SERVER[ 'HTTP_USER_AGENT' ], 'Mac')) {
// FIXME: (rodneyrehm) wrong dpi assumption
// don't know who thought this up… even if it was true in 1998, it's definitely wrong in 2011.
$dpi_default = 72;
} else {
$dpi_default = 96;
}
$_resize = $dpi_default/$params['dpi'];
$_resize = $dpi_default / $params[ 'dpi' ];
$width = round($width * $_resize);
$height = round($height * $_resize);
}
return $prefix . '<img src="'.$path_prefix.$file.'" alt="'.$alt.'" width="'.$width.'" height="'.$height.'"'.$extra.' />' . $suffix;
return $prefix . '<img src="' . $path_prefix . $file . '" alt="' . $alt . '" width="' . $width . '" height="' .
$height . '"' . $extra . ' />' . $suffix;
}
/* vim: set expandtab: */
?>

View file

@ -1,122 +1,230 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsFunction
*/
/**
* Smarty {html_options} function plugin
*
* Type: function<br>
* Name: html_options<br>
* Input:<br>
* - name (optional) - string default "select"
* - values (required if no options supplied) - array
* - options (required if no values supplied) - associative array
* - selected (optional) - string default not set
* - output (required if not options supplied) - array
* Type: function
* Name: html_options
* Purpose: Prints the list of <option> tags generated from
* the passed parameters
* @link http://smarty.php.net/manual/en/language.function.html.options.php {html_image}
* (Smarty online manual)
* Params:
*
* - name (optional) - string default "select"
* - values (required) - if no options supplied) - array
* - options (required) - if no values supplied) - associative array
* - selected (optional) - string default not set
* - output (required) - if not options supplied) - array
* - id (optional) - string default not set
* - class (optional) - string default not set
*
* @link http://www.smarty.net/manual/en/language.function.html.options.php {html_image}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param array
* @param Smarty
* @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de>
*
* @param array $params parameters
*
* @param \Smarty_Internal_Template $template
*
* @return string
* @uses smarty_function_escape_special_chars()
* @uses smarty_function_escape_special_chars()
* @throws \SmartyException
*/
function smarty_function_html_options($params, &$smarty)
function smarty_function_html_options($params, Smarty_Internal_Template $template)
{
require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
$template->_checkPlugins(
array(
array(
'function' => 'smarty_function_escape_special_chars',
'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
)
)
);
$name = null;
$values = null;
$options = null;
$selected = array();
$selected = null;
$output = null;
$id = null;
$class = null;
$extra = '';
foreach($params as $_key => $_val) {
switch($_key) {
foreach ($params as $_key => $_val) {
switch ($_key) {
case 'name':
case 'class':
case 'id':
$$_key = (string)$_val;
break;
case 'options':
$$_key = (array)$_val;
$options = (array)$_val;
break;
case 'values':
case 'output':
$$_key = array_values((array)$_val);
break;
case 'selected':
$$_key = array_map('strval', array_values((array)$_val));
break;
default:
if(!is_array($_val)) {
$extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
if (is_array($_val)) {
$selected = array();
foreach ($_val as $_sel) {
if (is_object($_sel)) {
if (method_exists($_sel, '__toString')) {
$_sel = smarty_function_escape_special_chars((string)$_sel->__toString());
} else {
trigger_error(
'html_options: selected attribute contains an object of class \'' .
get_class($_sel) . '\' without __toString() method',
E_USER_NOTICE
);
continue;
}
} else {
$_sel = smarty_function_escape_special_chars((string)$_sel);
}
$selected[ $_sel ] = true;
}
} elseif (is_object($_val)) {
if (method_exists($_val, '__toString')) {
$selected = smarty_function_escape_special_chars((string)$_val->__toString());
} else {
trigger_error(
'html_options: selected attribute is an object of class \'' . get_class($_val) .
'\' without __toString() method',
E_USER_NOTICE
);
}
} else {
$smarty->trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
$selected = smarty_function_escape_special_chars((string)$_val);
}
break;
case 'strict':
break;
case 'disabled':
case 'readonly':
if (!empty($params[ 'strict' ])) {
if (!is_scalar($_val)) {
trigger_error(
"html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute",
E_USER_NOTICE
);
}
if ($_val === true || $_val === $_key) {
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
}
break;
}
// omit break; to fall through!
// no break
default:
if (!is_array($_val)) {
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
} else {
trigger_error("html_options: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
}
break;
}
}
if (!isset($options) && !isset($values))
return ''; /* raise error here? */
if (!isset($options) && !isset($values)) {
/* raise error here? */
return '';
}
$_html_result = '';
$_idx = 0;
if (isset($options)) {
foreach ($options as $_key=>$_val)
$_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected);
} else {
foreach ($values as $_i=>$_key) {
$_val = isset($output[$_i]) ? $output[$_i] : '';
$_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected);
foreach ($options as $_key => $_val) {
$_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx);
}
}
if(!empty($name)) {
$_html_result = '<select name="' . $name . '"' . $extra . '>' . "\n" . $_html_result . '</select>' . "\n";
}
return $_html_result;
}
function smarty_function_html_options_optoutput($key, $value, $selected) {
if(!is_array($value)) {
$_html_result = '<option label="' . smarty_function_escape_special_chars($value) . '" value="' .
smarty_function_escape_special_chars($key) . '"';
if (in_array((string)$key, $selected))
$_html_result .= ' selected="selected"';
$_html_result .= '>' . smarty_function_escape_special_chars($value) . '</option>' . "\n";
} else {
$_html_result = smarty_function_html_options_optgroup($key, $value, $selected);
foreach ($values as $_i => $_key) {
$_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
$_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx);
}
}
if (!empty($name)) {
$_html_class = !empty($class) ? ' class="' . $class . '"' : '';
$_html_id = !empty($id) ? ' id="' . $id . '"' : '';
$_html_result =
'<select name="' . $name . '"' . $_html_class . $_html_id . $extra . '>' . "\n" . $_html_result .
'</select>' . "\n";
}
return $_html_result;
}
function smarty_function_html_options_optgroup($key, $values, $selected) {
/**
* @param $key
* @param $value
* @param $selected
* @param $id
* @param $class
* @param $idx
*
* @return string
*/
function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx)
{
if (!is_array($value)) {
$_key = smarty_function_escape_special_chars($key);
$_html_result = '<option value="' . $_key . '"';
if (is_array($selected)) {
if (isset($selected[ $_key ])) {
$_html_result .= ' selected="selected"';
}
} elseif ($_key === $selected) {
$_html_result .= ' selected="selected"';
}
$_html_class = !empty($class) ? ' class="' . $class . ' option"' : '';
$_html_id = !empty($id) ? ' id="' . $id . '-' . $idx . '"' : '';
if (is_object($value)) {
if (method_exists($value, '__toString')) {
$value = smarty_function_escape_special_chars((string)$value->__toString());
} else {
trigger_error(
'html_options: value is an object of class \'' . get_class($value) .
'\' without __toString() method',
E_USER_NOTICE
);
return '';
}
} else {
$value = smarty_function_escape_special_chars((string)$value);
}
$_html_result .= $_html_class . $_html_id . '>' . $value . '</option>' . "\n";
$idx++;
} else {
$_idx = 0;
$_html_result =
smarty_function_html_options_optgroup(
$key,
$value,
$selected,
!empty($id) ? ($id . '-' . $idx) : null,
$class,
$_idx
);
$idx++;
}
return $_html_result;
}
/**
* @param $key
* @param $values
* @param $selected
* @param $id
* @param $class
* @param $idx
*
* @return string
*/
function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, &$idx)
{
$optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n";
foreach ($values as $key => $value) {
$optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected);
$optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $idx);
}
$optgroup_html .= "</optgroup>\n";
return $optgroup_html;
}
/* vim: set expandtab: */
?>

View file

@ -1,156 +1,266 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsFunction
*/
/**
* Smarty {html_radios} function plugin
* File: function.html_radios.php
* Type: function
* Name: html_radios
* Date: 24.Feb.2003
* Purpose: Prints out a list of radio input types
* Params:
*
* - name (optional) - string default "radio"
* - values (required) - array
* - options (required) - associative array
* - checked (optional) - array default not set
* - separator (optional) - ie <br> or &nbsp;
* - output (optional) - the output next to each radio button
* - assign (optional) - assign the output as an array to this variable
* - escape (optional) - escape the content (not value), defaults to true
*
* File: function.html_radios.php<br>
* Type: function<br>
* Name: html_radios<br>
* Date: 24.Feb.2003<br>
* Purpose: Prints out a list of radio input types<br>
* Input:<br>
* - name (optional) - string default "radio"
* - values (required) - array
* - options (optional) - associative array
* - checked (optional) - array default not set
* - separator (optional) - ie <br> or &nbsp;
* - output (optional) - the output next to each radio button
* - assign (optional) - assign the output as an array to this variable
* Examples:
* <pre>
*
* {html_radios values=$ids output=$names}
* {html_radios values=$ids name='box' separator='<br>' output=$names}
* {html_radios values=$ids checked=$checked separator='<br>' output=$names}
* </pre>
* @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios}
* (Smarty online manual)
* @author Christopher Kvarme <christopher.kvarme@flashjab.com>
* @author credits to Monte Ohrt <monte at ohrt dot com>
* @version 1.0
* @param array
* @param Smarty
*
* @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios}
* (Smarty online manual)
* @author Christopher Kvarme <christopher.kvarme@flashjab.com>
* @author credits to Monte Ohrt <monte at ohrt dot com>
* @version 1.0
*
* @param array $params parameters
* @param Smarty_Internal_Template $template template object
*
* @return string
* @uses smarty_function_escape_special_chars()
* @uses smarty_function_escape_special_chars()
* @throws \SmartyException
*/
function smarty_function_html_radios($params, &$smarty)
function smarty_function_html_radios($params, Smarty_Internal_Template $template)
{
require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
$template->_checkPlugins(
array(
array(
'function' => 'smarty_function_escape_special_chars',
'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
)
)
);
$name = 'radio';
$values = null;
$options = null;
$selected = null;
$separator = '';
$escape = true;
$labels = true;
$label_ids = false;
$output = null;
$extra = '';
foreach($params as $_key => $_val) {
switch($_key) {
foreach ($params as $_key => $_val) {
switch ($_key) {
case 'name':
case 'separator':
$$_key = (string)$_val;
break;
case 'checked':
case 'selected':
if(is_array($_val)) {
$smarty->trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING);
if (is_array($_val)) {
trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING);
} elseif (is_object($_val)) {
if (method_exists($_val, '__toString')) {
$selected = smarty_function_escape_special_chars((string)$_val->__toString());
} else {
trigger_error(
'html_radios: selected attribute is an object of class \'' . get_class($_val) .
'\' without __toString() method',
E_USER_NOTICE
);
}
} else {
$selected = (string)$_val;
}
break;
case 'escape':
case 'labels':
case 'label_ids':
$$_key = (bool)$_val;
break;
case 'options':
$$_key = (array)$_val;
break;
case 'values':
case 'output':
$$_key = array_values((array)$_val);
break;
case 'radios':
$smarty->trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead', E_USER_WARNING);
trigger_error(
'html_radios: the use of the "radios" attribute is deprecated, use "options" instead',
E_USER_WARNING
);
$options = (array)$_val;
break;
case 'assign':
break;
case 'strict':
break;
case 'disabled':
case 'readonly':
if (!empty($params[ 'strict' ])) {
if (!is_scalar($_val)) {
trigger_error(
"html_options: {$_key} attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute",
E_USER_NOTICE
);
}
if ($_val === true || $_val === $_key) {
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
}
break;
}
// omit break; to fall through!
// no break
default:
if(!is_array($_val)) {
$extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
if (!is_array($_val)) {
$extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
} else {
$smarty->trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
trigger_error("html_radios: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
}
break;
}
}
if (!isset($options) && !isset($values))
return ''; /* raise error here? */
if (!isset($options) && !isset($values)) {
/* raise error here? */
return '';
}
$_html_result = array();
if (isset($options)) {
foreach ($options as $_key=>$_val)
$_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids);
} else {
foreach ($values as $_i=>$_key) {
$_val = isset($output[$_i]) ? $output[$_i] : '';
$_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids);
foreach ($options as $_key => $_val) {
$_html_result[] =
smarty_function_html_radios_output(
$name,
$_key,
$_val,
$selected,
$extra,
$separator,
$labels,
$label_ids,
$escape
);
}
}
if(!empty($params['assign'])) {
$smarty->assign($params['assign'], $_html_result);
} else {
return implode("\n",$_html_result);
foreach ($values as $_i => $_key) {
$_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
$_html_result[] =
smarty_function_html_radios_output(
$name,
$_key,
$_val,
$selected,
$extra,
$separator,
$labels,
$label_ids,
$escape
);
}
}
if (!empty($params[ 'assign' ])) {
$template->assign($params[ 'assign' ], $_html_result);
} else {
return implode("\n", $_html_result);
}
}
function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids) {
/**
* @param $name
* @param $value
* @param $output
* @param $selected
* @param $extra
* @param $separator
* @param $labels
* @param $label_ids
* @param $escape
*
* @return string
*/
function smarty_function_html_radios_output(
$name,
$value,
$output,
$selected,
$extra,
$separator,
$labels,
$label_ids,
$escape
) {
$_output = '';
if (is_object($value)) {
if (method_exists($value, '__toString')) {
$value = (string)$value->__toString();
} else {
trigger_error(
'html_options: value is an object of class \'' . get_class($value) .
'\' without __toString() method',
E_USER_NOTICE
);
return '';
}
} else {
$value = (string)$value;
}
if (is_object($output)) {
if (method_exists($output, '__toString')) {
$output = (string)$output->__toString();
} else {
trigger_error(
'html_options: output is an object of class \'' . get_class($output) .
'\' without __toString() method',
E_USER_NOTICE
);
return '';
}
} else {
$output = (string)$output;
}
if ($labels) {
if($label_ids) {
$_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!', '_', $name . '_' . $value));
$_output .= '<label for="' . $_id . '">';
} else {
$_output .= '<label>';
}
}
$_output .= '<input type="radio" name="'
. smarty_function_escape_special_chars($name) . '" value="'
. smarty_function_escape_special_chars($value) . '"';
if ($labels && $label_ids) $_output .= ' id="' . $_id . '"';
if ((string)$value==$selected) {
if ($label_ids) {
$_id = smarty_function_escape_special_chars(
preg_replace(
'![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER,
'_',
$name . '_' . $value
)
);
$_output .= '<label for="' . $_id . '">';
} else {
$_output .= '<label>';
}
}
$name = smarty_function_escape_special_chars($name);
$value = smarty_function_escape_special_chars($value);
if ($escape) {
$output = smarty_function_escape_special_chars($output);
}
$_output .= '<input type="radio" name="' . $name . '" value="' . $value . '"';
if ($labels && $label_ids) {
$_output .= ' id="' . $_id . '"';
}
if ($value === $selected) {
$_output .= ' checked="checked"';
}
$_output .= $extra . ' />' . $output;
if ($labels) $_output .= '</label>';
$_output .= $separator;
if ($labels) {
$_output .= '</label>';
}
$_output .= $separator;
return $_output;
}
?>

View file

@ -1,99 +1,145 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsFunction
*/
/**
* Smarty {html_select_date} plugin
*
* Type: function<br>
* Name: html_select_date<br>
* Type: function
* Name: html_select_date
* Purpose: Prints the dropdowns for date selection.
* ChangeLog:
*
* - 1.0 initial release
* - 1.1 added support for +/- N syntax for begin
* and end year values. (Monte)
* - 1.2 added support for yyyy-mm-dd syntax for
* time value. (Jan Rosier)
* - 1.3 added support for choosing format for
* month values (Gary Loescher)
* - 1.3.1 added support for choosing format for
* day values (Marcus Bointon)
* - 1.3.2 support negative timestamps, force year
* dropdown to include given date unless explicitly set (Monte)
* - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that
* of 0000-00-00 dates (cybot, boots)
* - 2.0 complete rewrite for performance,
* added attributes month_names, *_id
*
* @link http://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date}
* (Smarty online manual)
* @version 2.0
* @author Andrei Zmievski
* @author Monte Ohrt <monte at ohrt dot com>
* @author Rodney Rehm
*
* @param array $params parameters
*
* @param \Smarty_Internal_Template $template
*
* ChangeLog:<br>
* - 1.0 initial release
* - 1.1 added support for +/- N syntax for begin
* and end year values. (Monte)
* - 1.2 added support for yyyy-mm-dd syntax for
* time value. (Jan Rosier)
* - 1.3 added support for choosing format for
* month values (Gary Loescher)
* - 1.3.1 added support for choosing format for
* day values (Marcus Bointon)
* - 1.3.2 support negative timestamps, force year
* dropdown to include given date unless explicitly set (Monte)
* - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that
* of 0000-00-00 dates (cybot, boots)
* @link http://smarty.php.net/manual/en/language.function.html.select.date.php {html_select_date}
* (Smarty online manual)
* @version 1.3.4
* @author Andrei Zmievski
* @author Monte Ohrt <monte at ohrt dot com>
* @param array
* @param Smarty
* @return string
* @throws \SmartyException
*/
function smarty_function_html_select_date($params, &$smarty)
function smarty_function_html_select_date($params, Smarty_Internal_Template $template)
{
require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
require_once $smarty->_get_plugin_filepath('shared','make_timestamp');
require_once $smarty->_get_plugin_filepath('function','html_options');
$template->_checkPlugins(
array(
array(
'function' => 'smarty_function_escape_special_chars',
'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
)
)
);
// generate timestamps used for month names only
static $_month_timestamps = null;
static $_current_year = null;
if ($_month_timestamps === null) {
$_current_year = date('Y');
$_month_timestamps = array();
for ($i = 1; $i <= 12; $i++) {
$_month_timestamps[ $i ] = mktime(0, 0, 0, $i, 1, 2000);
}
}
/* Default values. */
$prefix = "Date_";
$start_year = strftime("%Y");
$end_year = $start_year;
$display_days = true;
$display_months = true;
$display_years = true;
$month_format = "%B";
$prefix = 'Date_';
$start_year = null;
$end_year = null;
$display_days = true;
$display_months = true;
$display_years = true;
$month_format = '%B';
/* Write months as numbers by default GL */
$month_value_format = "%m";
$day_format = "%02d";
$month_value_format = '%m';
$day_format = '%02d';
/* Write day values using this format MB */
$day_value_format = "%d";
$year_as_text = false;
$day_value_format = '%d';
$year_as_text = false;
/* Display years in reverse order? Ie. 2000,1999,.... */
$reverse_years = false;
$reverse_years = false;
/* Should the select boxes be part of an array when returned from PHP?
e.g. setting it to "birthday", would create "birthday[Day]",
"birthday[Month]" & "birthday[Year]". Can be combined with prefix */
$field_array = null;
$field_array = null;
/* <select size>'s of the different <select> tags.
If not set, uses default dropdown. */
$day_size = null;
$month_size = null;
$year_size = null;
$day_size = null;
$month_size = null;
$year_size = null;
/* Unparsed attributes common to *ALL* the <select>/<input> tags.
An example might be in the template: all_extra ='class ="foo"'. */
$all_extra = null;
$all_extra = null;
/* Separate attributes for the tags. */
$day_extra = null;
$month_extra = null;
$year_extra = null;
$day_extra = null;
$month_extra = null;
$year_extra = null;
/* Order in which to display the fields.
"D" -> day, "M" -> month, "Y" -> year. */
$field_order = 'MDY';
$field_order = 'MDY';
/* String printed between the different fields. */
$field_separator = "\n";
$time = time();
$all_empty = null;
$day_empty = null;
$month_empty = null;
$year_empty = null;
$extra_attrs = '';
foreach ($params as $_key=>$_value) {
$option_separator = "\n";
$time = null;
// $all_empty = null;
// $day_empty = null;
// $month_empty = null;
// $year_empty = null;
$extra_attrs = '';
$all_id = null;
$day_id = null;
$month_id = null;
$year_id = null;
foreach ($params as $_key => $_value) {
switch ($_key) {
case 'prefix':
case 'time':
if (!is_array($_value) && $_value !== null) {
$template->_checkPlugins(
array(
array(
'function' => 'smarty_make_timestamp',
'file' => SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'
)
)
);
$time = smarty_make_timestamp($_value);
}
break;
case 'month_names':
if (is_array($_value) && count($_value) === 12) {
$$_key = $_value;
} else {
trigger_error('html_select_date: month_names must be an array of 12 strings', E_USER_NOTICE);
}
break;
case 'prefix':
case 'field_array':
case 'start_year':
case 'end_year':
case 'month_format':
case 'day_format':
case 'day_value_format':
case 'field_array':
case 'month_format':
case 'month_value_format':
case 'day_size':
case 'month_size':
case 'year_size':
@ -103,18 +149,17 @@ function smarty_function_html_select_date($params, &$smarty)
case 'year_extra':
case 'field_order':
case 'field_separator':
case 'month_value_format':
case 'option_separator':
case 'all_empty':
case 'month_empty':
case 'day_empty':
case 'year_empty':
case 'all_id':
case 'month_id':
case 'day_id':
case 'year_id':
$$_key = (string)$_value;
break;
case 'all_empty':
$$_key = (string)$_value;
$day_empty = $month_empty = $year_empty = $all_empty;
break;
case 'display_days':
case 'display_months':
case 'display_years':
@ -122,210 +167,222 @@ function smarty_function_html_select_date($params, &$smarty)
case 'reverse_years':
$$_key = (bool)$_value;
break;
default:
if(!is_array($_value)) {
$extra_attrs .= ' '.$_key.'="'.smarty_function_escape_special_chars($_value).'"';
if (!is_array($_value)) {
$extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"';
} else {
$smarty->trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
trigger_error("html_select_date: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
}
break;
}
}
if (preg_match('!^-\d+$!', $time)) {
// negative timestamp, use date()
$time = date('Y-m-d', $time);
}
// If $time is not in format yyyy-mm-dd
if (preg_match('/^(\d{0,4}-\d{0,2}-\d{0,2})/', $time, $found)) {
$time = $found[1];
// Note: date() is faster than strftime()
// Note: explode(date()) is faster than date() date() date()
if (isset($params[ 'time' ]) && is_array($params[ 'time' ])) {
if (isset($params[ 'time' ][ $prefix . 'Year' ])) {
// $_REQUEST[$field_array] given
foreach (array(
'Y' => 'Year',
'm' => 'Month',
'd' => 'Day'
) as $_elementKey => $_elementName) {
$_variableName = '_' . strtolower($_elementName);
$$_variableName =
isset($params[ 'time' ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $prefix . $_elementName ] :
date($_elementKey);
}
} elseif (isset($params[ 'time' ][ $field_array ][ $prefix . 'Year' ])) {
// $_REQUEST given
foreach (array(
'Y' => 'Year',
'm' => 'Month',
'd' => 'Day'
) as $_elementKey => $_elementName) {
$_variableName = '_' . strtolower($_elementName);
$$_variableName = isset($params[ 'time' ][ $field_array ][ $prefix . $_elementName ]) ?
$params[ 'time' ][ $field_array ][ $prefix . $_elementName ] : date($_elementKey);
}
} else {
// no date found, use NOW
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
}
} elseif ($time === null) {
if (array_key_exists('time', $params)) {
$_year = $_month = $_day = $time = null;
} else {
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
}
} else {
// use smarty_make_timestamp to get an unix timestamp and
// strftime to make yyyy-mm-dd
$time = strftime('%Y-%m-%d', smarty_make_timestamp($time));
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d', $time));
}
// Now split this in pieces, which later can be used to set the select
$time = explode("-", $time);
// make syntax "+N" or "-N" work with start_year and end_year
if (preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match)) {
if ($match[1] == '+') {
$end_year = strftime('%Y') + $match[2];
// make syntax "+N" or "-N" work with $start_year and $end_year
// Note preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match) is slower than trim+substr
foreach (array(
'start',
'end'
) as $key) {
$key .= '_year';
$t = $$key;
if ($t === null) {
$$key = (int)$_current_year;
} elseif ($t[ 0 ] === '+') {
$$key = (int)($_current_year + (int)trim(substr($t, 1)));
} elseif ($t[ 0 ] === '-') {
$$key = (int)($_current_year - (int)trim(substr($t, 1)));
} else {
$end_year = strftime('%Y') - $match[2];
$$key = (int)$$key;
}
}
if (preg_match('!^(\+|\-)\s*(\d+)$!', $start_year, $match)) {
if ($match[1] == '+') {
$start_year = strftime('%Y') + $match[2];
} else {
$start_year = strftime('%Y') - $match[2];
}
// flip for ascending or descending
if (($start_year > $end_year && !$reverse_years) || ($start_year < $end_year && $reverse_years)) {
$t = $end_year;
$end_year = $start_year;
$start_year = $t;
}
if (strlen($time[0]) > 0) {
if ($start_year > $time[0] && !isset($params['start_year'])) {
// force start year to include given date if not explicitly set
$start_year = $time[0];
}
if($end_year < $time[0] && !isset($params['end_year'])) {
// force end year to include given date if not explicitly set
$end_year = $time[0];
}
}
$field_order = strtoupper($field_order);
$html_result = $month_result = $day_result = $year_result = "";
$field_separator_count = -1;
if ($display_months) {
$field_separator_count++;
$month_names = array();
$month_values = array();
if(isset($month_empty)) {
$month_names[''] = $month_empty;
$month_values[''] = '';
}
for ($i = 1; $i <= 12; $i++) {
$month_names[$i] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000));
$month_values[$i] = strftime($month_value_format, mktime(0, 0, 0, $i, 1, 2000));
}
$month_result .= '<select name=';
if (null !== $field_array){
$month_result .= '"' . $field_array . '[' . $prefix . 'Month]"';
} else {
$month_result .= '"' . $prefix . 'Month"';
}
if (null !== $month_size){
$month_result .= ' size="' . $month_size . '"';
}
if (null !== $month_extra){
$month_result .= ' ' . $month_extra;
}
if (null !== $all_extra){
$month_result .= ' ' . $all_extra;
}
$month_result .= $extra_attrs . '>'."\n";
$month_result .= smarty_function_html_options(array('output' => $month_names,
'values' => $month_values,
'selected' => (int)$time[1] ? strftime($month_value_format, mktime(0, 0, 0, (int)$time[1], 1, 2000)) : '',
'print_result' => false),
$smarty);
$month_result .= '</select>';
}
if ($display_days) {
$field_separator_count++;
$days = array();
if (isset($day_empty)) {
$days[''] = $day_empty;
$day_values[''] = '';
}
for ($i = 1; $i <= 31; $i++) {
$days[] = sprintf($day_format, $i);
$day_values[] = sprintf($day_value_format, $i);
}
$day_result .= '<select name=';
if (null !== $field_array){
$day_result .= '"' . $field_array . '[' . $prefix . 'Day]"';
} else {
$day_result .= '"' . $prefix . 'Day"';
}
if (null !== $day_size){
$day_result .= ' size="' . $day_size . '"';
}
if (null !== $all_extra){
$day_result .= ' ' . $all_extra;
}
if (null !== $day_extra){
$day_result .= ' ' . $day_extra;
}
$day_result .= $extra_attrs . '>'."\n";
$day_result .= smarty_function_html_options(array('output' => $days,
'values' => $day_values,
'selected' => $time[2],
'print_result' => false),
$smarty);
$day_result .= '</select>';
}
// generate year <select> or <input>
if ($display_years) {
$field_separator_count++;
if (null !== $field_array){
$year_name = $field_array . '[' . $prefix . 'Year]';
} else {
$year_name = $prefix . 'Year';
$_extra = '';
$_name = $field_array ? ($field_array . '[' . $prefix . 'Year]') : ($prefix . 'Year');
if ($all_extra) {
$_extra .= ' ' . $all_extra;
}
if ($year_extra) {
$_extra .= ' ' . $year_extra;
}
if ($year_as_text) {
$year_result .= '<input type="text" name="' . $year_name . '" value="' . $time[0] . '" size="4" maxlength="4"';
if (null !== $all_extra){
$year_result .= ' ' . $all_extra;
}
if (null !== $year_extra){
$year_result .= ' ' . $year_extra;
}
$year_result .= ' />';
$_html_years =
'<input type="text" name="' . $_name . '" value="' . $_year . '" size="4" maxlength="4"' . $_extra .
$extra_attrs . ' />';
} else {
$years = range((int)$start_year, (int)$end_year);
if ($reverse_years) {
rsort($years, SORT_NUMERIC);
} else {
sort($years, SORT_NUMERIC);
$_html_years = '<select name="' . $_name . '"';
if ($year_id !== null || $all_id !== null) {
$_html_years .= ' id="' . smarty_function_escape_special_chars(
$year_id !== null ?
($year_id ? $year_id : $_name) :
($all_id ? ($all_id . $_name) :
$_name)
) . '"';
}
$yearvals = $years;
if(isset($year_empty)) {
array_unshift($years, $year_empty);
array_unshift($yearvals, '');
if ($year_size) {
$_html_years .= ' size="' . $year_size . '"';
}
$year_result .= '<select name="' . $year_name . '"';
if (null !== $year_size){
$year_result .= ' size="' . $year_size . '"';
$_html_years .= $_extra . $extra_attrs . '>' . $option_separator;
if (isset($year_empty) || isset($all_empty)) {
$_html_years .= '<option value="">' . (isset($year_empty) ? $year_empty : $all_empty) . '</option>' .
$option_separator;
}
if (null !== $all_extra){
$year_result .= ' ' . $all_extra;
$op = $start_year > $end_year ? -1 : 1;
for ($i = $start_year; $op > 0 ? $i <= $end_year : $i >= $end_year; $i += $op) {
$_html_years .= '<option value="' . $i . '"' . ($_year == $i ? ' selected="selected"' : '') . '>' . $i .
'</option>' . $option_separator;
}
if (null !== $year_extra){
$year_result .= ' ' . $year_extra;
}
$year_result .= $extra_attrs . '>'."\n";
$year_result .= smarty_function_html_options(array('output' => $years,
'values' => $yearvals,
'selected' => $time[0],
'print_result' => false),
$smarty);
$year_result .= '</select>';
$_html_years .= '</select>';
}
}
// Loop thru the field_order field
for ($i = 0; $i <= 2; $i++){
$c = substr($field_order, $i, 1);
switch ($c){
case 'D':
$html_result .= $day_result;
break;
case 'M':
$html_result .= $month_result;
break;
// generate month <select> or <input>
if ($display_months) {
$_extra = '';
$_name = $field_array ? ($field_array . '[' . $prefix . 'Month]') : ($prefix . 'Month');
if ($all_extra) {
$_extra .= ' ' . $all_extra;
}
if ($month_extra) {
$_extra .= ' ' . $month_extra;
}
$_html_months = '<select name="' . $_name . '"';
if ($month_id !== null || $all_id !== null) {
$_html_months .= ' id="' . smarty_function_escape_special_chars(
$month_id !== null ?
($month_id ? $month_id : $_name) :
($all_id ? ($all_id . $_name) :
$_name)
) . '"';
}
if ($month_size) {
$_html_months .= ' size="' . $month_size . '"';
}
$_html_months .= $_extra . $extra_attrs . '>' . $option_separator;
if (isset($month_empty) || isset($all_empty)) {
$_html_months .= '<option value="">' . (isset($month_empty) ? $month_empty : $all_empty) . '</option>' .
$option_separator;
}
for ($i = 1; $i <= 12; $i++) {
$_val = sprintf('%02d', $i);
$_text = isset($month_names) ? smarty_function_escape_special_chars($month_names[ $i ]) :
($month_format === '%m' ? $_val : strftime($month_format, $_month_timestamps[ $i ]));
$_value = $month_value_format === '%m' ? $_val : strftime($month_value_format, $_month_timestamps[ $i ]);
$_html_months .= '<option value="' . $_value . '"' . ($_val == $_month ? ' selected="selected"' : '') .
'>' . $_text . '</option>' . $option_separator;
}
$_html_months .= '</select>';
}
// generate day <select> or <input>
if ($display_days) {
$_extra = '';
$_name = $field_array ? ($field_array . '[' . $prefix . 'Day]') : ($prefix . 'Day');
if ($all_extra) {
$_extra .= ' ' . $all_extra;
}
if ($day_extra) {
$_extra .= ' ' . $day_extra;
}
$_html_days = '<select name="' . $_name . '"';
if ($day_id !== null || $all_id !== null) {
$_html_days .= ' id="' .
smarty_function_escape_special_chars(
$day_id !== null ? ($day_id ? $day_id : $_name) :
($all_id ? ($all_id . $_name) : $_name)
) . '"';
}
if ($day_size) {
$_html_days .= ' size="' . $day_size . '"';
}
$_html_days .= $_extra . $extra_attrs . '>' . $option_separator;
if (isset($day_empty) || isset($all_empty)) {
$_html_days .= '<option value="">' . (isset($day_empty) ? $day_empty : $all_empty) . '</option>' .
$option_separator;
}
for ($i = 1; $i <= 31; $i++) {
$_val = sprintf('%02d', $i);
$_text = $day_format === '%02d' ? $_val : sprintf($day_format, $i);
$_value = $day_value_format === '%02d' ? $_val : sprintf($day_value_format, $i);
$_html_days .= '<option value="' . $_value . '"' . ($_val == $_day ? ' selected="selected"' : '') . '>' .
$_text . '</option>' . $option_separator;
}
$_html_days .= '</select>';
}
// order the fields for output
$_html = '';
for ($i = 0; $i <= 2; $i++) {
switch ($field_order[ $i ]) {
case 'Y':
$html_result .= $year_result;
case 'y':
if (isset($_html_years)) {
if ($_html) {
$_html .= $field_separator;
}
$_html .= $_html_years;
}
break;
case 'm':
case 'M':
if (isset($_html_months)) {
if ($_html) {
$_html .= $field_separator;
}
$_html .= $_html_months;
}
break;
case 'd':
case 'D':
if (isset($_html_days)) {
if ($_html) {
$_html .= $field_separator;
}
$_html .= $_html_days;
}
break;
}
// Add the field seperator
if($i < $field_separator_count) {
$html_result .= $field_separator;
}
}
return $html_result;
return $_html;
}
/* vim: set expandtab: */
?>

View file

@ -1,64 +1,119 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsFunction
*/
/**
* Smarty {html_select_time} function plugin
*
* Type: function<br>
* Name: html_select_time<br>
* Type: function
* Name: html_select_time
* Purpose: Prints the dropdowns for time selection
* @link http://smarty.php.net/manual/en/language.function.html.select.time.php {html_select_time}
* (Smarty online manual)
*
* @link http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time}
* (Smarty online manual)
* @author Roberto Berto <roberto@berto.net>
* @credits Monte Ohrt <monte AT ohrt DOT com>
* @param array
* @param Smarty
* @author Monte Ohrt <monte AT ohrt DOT com>
*
* @param array $params parameters
*
* @param \Smarty_Internal_Template $template
*
* @return string
* @uses smarty_make_timestamp()
* @uses smarty_make_timestamp()
* @throws \SmartyException
*/
function smarty_function_html_select_time($params, &$smarty)
function smarty_function_html_select_time($params, Smarty_Internal_Template $template)
{
require_once $smarty->_get_plugin_filepath('shared','make_timestamp');
require_once $smarty->_get_plugin_filepath('function','html_options');
/* Default values. */
$prefix = "Time_";
$time = time();
$display_hours = true;
$display_minutes = true;
$display_seconds = true;
$display_meridian = true;
$use_24_hours = true;
$minute_interval = 1;
$second_interval = 1;
/* Should the select boxes be part of an array when returned from PHP?
e.g. setting it to "birthday", would create "birthday[Hour]",
"birthday[Minute]", "birthday[Seconds]" & "birthday[Meridian]".
Can be combined with prefix. */
$field_array = null;
$all_extra = null;
$hour_extra = null;
$minute_extra = null;
$second_extra = null;
$meridian_extra = null;
foreach ($params as $_key=>$_value) {
$template->_checkPlugins(
array(
array(
'function' => 'smarty_function_escape_special_chars',
'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
)
)
);
$prefix = 'Time_';
$field_array = null;
$field_separator = "\n";
$option_separator = "\n";
$time = null;
$display_hours = true;
$display_minutes = true;
$display_seconds = true;
$display_meridian = true;
$hour_format = '%02d';
$hour_value_format = '%02d';
$minute_format = '%02d';
$minute_value_format = '%02d';
$second_format = '%02d';
$second_value_format = '%02d';
$hour_size = null;
$minute_size = null;
$second_size = null;
$meridian_size = null;
$all_empty = null;
$hour_empty = null;
$minute_empty = null;
$second_empty = null;
$meridian_empty = null;
$all_id = null;
$hour_id = null;
$minute_id = null;
$second_id = null;
$meridian_id = null;
$use_24_hours = true;
$minute_interval = 1;
$second_interval = 1;
$extra_attrs = '';
$all_extra = null;
$hour_extra = null;
$minute_extra = null;
$second_extra = null;
$meridian_extra = null;
foreach ($params as $_key => $_value) {
switch ($_key) {
case 'prefix':
case 'time':
if (!is_array($_value) && $_value !== null) {
$template->_checkPlugins(
array(
array(
'function' => 'smarty_make_timestamp',
'file' => SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'
)
)
);
$time = smarty_make_timestamp($_value);
}
break;
case 'prefix':
case 'field_array':
case 'field_separator':
case 'option_separator':
case 'all_extra':
case 'hour_extra':
case 'minute_extra':
case 'second_extra':
case 'meridian_extra':
case 'all_empty':
case 'hour_empty':
case 'minute_empty':
case 'second_empty':
case 'meridian_empty':
case 'all_id':
case 'hour_id':
case 'minute_id':
case 'second_id':
case 'meridian_id':
case 'hour_format':
case 'hour_value_format':
case 'minute_format':
case 'minute_value_format':
case 'second_format':
case 'second_value_format':
$$_key = (string)$_value;
break;
case 'display_hours':
case 'display_minutes':
case 'display_seconds':
@ -66,129 +121,234 @@ function smarty_function_html_select_time($params, &$smarty)
case 'use_24_hours':
$$_key = (bool)$_value;
break;
case 'minute_interval':
case 'second_interval':
case 'hour_size':
case 'minute_size':
case 'second_size':
case 'meridian_size':
$$_key = (int)$_value;
break;
default:
$smarty->trigger_error("[html_select_time] unknown parameter $_key", E_USER_WARNING);
if (!is_array($_value)) {
$extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"';
} else {
trigger_error("html_select_date: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
}
break;
}
}
$time = smarty_make_timestamp($time);
$html_result = '';
if (isset($params[ 'time' ]) && is_array($params[ 'time' ])) {
if (isset($params[ 'time' ][ $prefix . 'Hour' ])) {
// $_REQUEST[$field_array] given
foreach (array(
'H' => 'Hour',
'i' => 'Minute',
's' => 'Second'
) as $_elementKey => $_elementName) {
$_variableName = '_' . strtolower($_elementName);
$$_variableName =
isset($params[ 'time' ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $prefix . $_elementName ] :
date($_elementKey);
}
$_meridian =
isset($params[ 'time' ][ $prefix . 'Meridian' ]) ? (' ' . $params[ 'time' ][ $prefix . 'Meridian' ]) :
'';
$time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian);
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
} elseif (isset($params[ 'time' ][ $field_array ][ $prefix . 'Hour' ])) {
// $_REQUEST given
foreach (array(
'H' => 'Hour',
'i' => 'Minute',
's' => 'Second'
) as $_elementKey => $_elementName) {
$_variableName = '_' . strtolower($_elementName);
$$_variableName = isset($params[ 'time' ][ $field_array ][ $prefix . $_elementName ]) ?
$params[ 'time' ][ $field_array ][ $prefix . $_elementName ] : date($_elementKey);
}
$_meridian = isset($params[ 'time' ][ $field_array ][ $prefix . 'Meridian' ]) ?
(' ' . $params[ 'time' ][ $field_array ][ $prefix . 'Meridian' ]) : '';
$time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian);
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
} else {
// no date found, use NOW
list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
}
} elseif ($time === null) {
if (array_key_exists('time', $params)) {
$_hour = $_minute = $_second = $time = null;
} else {
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s'));
}
} else {
list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
}
// generate hour <select>
if ($display_hours) {
$hours = $use_24_hours ? range(0, 23) : range(1, 12);
$hour_fmt = $use_24_hours ? '%H' : '%I';
for ($i = 0, $for_max = count($hours); $i < $for_max; $i++)
$hours[$i] = sprintf('%02d', $hours[$i]);
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Hour]"';
} else {
$html_result .= '"' . $prefix . 'Hour"';
$_html_hours = '';
$_extra = '';
$_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour');
if ($all_extra) {
$_extra .= ' ' . $all_extra;
}
if (null !== $hour_extra){
$html_result .= ' ' . $hour_extra;
if ($hour_extra) {
$_extra .= ' ' . $hour_extra;
}
if (null !== $all_extra){
$html_result .= ' ' . $all_extra;
$_html_hours = '<select name="' . $_name . '"';
if ($hour_id !== null || $all_id !== null) {
$_html_hours .= ' id="' .
smarty_function_escape_special_chars(
$hour_id !== null ? ($hour_id ? $hour_id : $_name) :
($all_id ? ($all_id . $_name) : $_name)
) . '"';
}
$html_result .= '>'."\n";
$html_result .= smarty_function_html_options(array('output' => $hours,
'values' => $hours,
'selected' => strftime($hour_fmt, $time),
'print_result' => false),
$smarty);
$html_result .= "</select>\n";
if ($hour_size) {
$_html_hours .= ' size="' . $hour_size . '"';
}
$_html_hours .= $_extra . $extra_attrs . '>' . $option_separator;
if (isset($hour_empty) || isset($all_empty)) {
$_html_hours .= '<option value="">' . (isset($hour_empty) ? $hour_empty : $all_empty) . '</option>' .
$option_separator;
}
$start = $use_24_hours ? 0 : 1;
$end = $use_24_hours ? 23 : 12;
for ($i = $start; $i <= $end; $i++) {
$_val = sprintf('%02d', $i);
$_text = $hour_format === '%02d' ? $_val : sprintf($hour_format, $i);
$_value = $hour_value_format === '%02d' ? $_val : sprintf($hour_value_format, $i);
if (!$use_24_hours) {
$_hour12 = $_hour == 0 ? 12 : ($_hour <= 12 ? $_hour : $_hour - 12);
}
$selected = $_hour !== null ? ($use_24_hours ? $_hour == $_val : $_hour12 == $_val) : null;
$_html_hours .= '<option value="' . $_value . '"' . ($selected ? ' selected="selected"' : '') . '>' .
$_text . '</option>' . $option_separator;
}
$_html_hours .= '</select>';
}
// generate minute <select>
if ($display_minutes) {
$all_minutes = range(0, 59);
for ($i = 0, $for_max = count($all_minutes); $i < $for_max; $i+= $minute_interval)
$minutes[] = sprintf('%02d', $all_minutes[$i]);
$selected = intval(floor(strftime('%M', $time) / $minute_interval) * $minute_interval);
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Minute]"';
} else {
$html_result .= '"' . $prefix . 'Minute"';
$_html_minutes = '';
$_extra = '';
$_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute');
if ($all_extra) {
$_extra .= ' ' . $all_extra;
}
if (null !== $minute_extra){
$html_result .= ' ' . $minute_extra;
if ($minute_extra) {
$_extra .= ' ' . $minute_extra;
}
if (null !== $all_extra){
$html_result .= ' ' . $all_extra;
$_html_minutes = '<select name="' . $_name . '"';
if ($minute_id !== null || $all_id !== null) {
$_html_minutes .= ' id="' . smarty_function_escape_special_chars(
$minute_id !== null ?
($minute_id ? $minute_id : $_name) :
($all_id ? ($all_id . $_name) :
$_name)
) . '"';
}
$html_result .= '>'."\n";
$html_result .= smarty_function_html_options(array('output' => $minutes,
'values' => $minutes,
'selected' => $selected,
'print_result' => false),
$smarty);
$html_result .= "</select>\n";
if ($minute_size) {
$_html_minutes .= ' size="' . $minute_size . '"';
}
$_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator;
if (isset($minute_empty) || isset($all_empty)) {
$_html_minutes .= '<option value="">' . (isset($minute_empty) ? $minute_empty : $all_empty) . '</option>' .
$option_separator;
}
$selected = $_minute !== null ? ($_minute - $_minute % $minute_interval) : null;
for ($i = 0; $i <= 59; $i += $minute_interval) {
$_val = sprintf('%02d', $i);
$_text = $minute_format === '%02d' ? $_val : sprintf($minute_format, $i);
$_value = $minute_value_format === '%02d' ? $_val : sprintf($minute_value_format, $i);
$_html_minutes .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') .
'>' . $_text . '</option>' . $option_separator;
}
$_html_minutes .= '</select>';
}
// generate second <select>
if ($display_seconds) {
$all_seconds = range(0, 59);
for ($i = 0, $for_max = count($all_seconds); $i < $for_max; $i+= $second_interval)
$seconds[] = sprintf('%02d', $all_seconds[$i]);
$selected = intval(floor(strftime('%S', $time) / $second_interval) * $second_interval);
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Second]"';
} else {
$html_result .= '"' . $prefix . 'Second"';
$_html_seconds = '';
$_extra = '';
$_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second');
if ($all_extra) {
$_extra .= ' ' . $all_extra;
}
if (null !== $second_extra){
$html_result .= ' ' . $second_extra;
if ($second_extra) {
$_extra .= ' ' . $second_extra;
}
if (null !== $all_extra){
$html_result .= ' ' . $all_extra;
$_html_seconds = '<select name="' . $_name . '"';
if ($second_id !== null || $all_id !== null) {
$_html_seconds .= ' id="' . smarty_function_escape_special_chars(
$second_id !== null ?
($second_id ? $second_id : $_name) :
($all_id ? ($all_id . $_name) :
$_name)
) . '"';
}
$html_result .= '>'."\n";
$html_result .= smarty_function_html_options(array('output' => $seconds,
'values' => $seconds,
'selected' => $selected,
'print_result' => false),
$smarty);
$html_result .= "</select>\n";
if ($second_size) {
$_html_seconds .= ' size="' . $second_size . '"';
}
$_html_seconds .= $_extra . $extra_attrs . '>' . $option_separator;
if (isset($second_empty) || isset($all_empty)) {
$_html_seconds .= '<option value="">' . (isset($second_empty) ? $second_empty : $all_empty) . '</option>' .
$option_separator;
}
$selected = $_second !== null ? ($_second - $_second % $second_interval) : null;
for ($i = 0; $i <= 59; $i += $second_interval) {
$_val = sprintf('%02d', $i);
$_text = $second_format === '%02d' ? $_val : sprintf($second_format, $i);
$_value = $second_value_format === '%02d' ? $_val : sprintf($second_value_format, $i);
$_html_seconds .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') .
'>' . $_text . '</option>' . $option_separator;
}
$_html_seconds .= '</select>';
}
// generate meridian <select>
if ($display_meridian && !$use_24_hours) {
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Meridian]"';
} else {
$html_result .= '"' . $prefix . 'Meridian"';
$_html_meridian = '';
$_extra = '';
$_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian');
if ($all_extra) {
$_extra .= ' ' . $all_extra;
}
if (null !== $meridian_extra){
$html_result .= ' ' . $meridian_extra;
if ($meridian_extra) {
$_extra .= ' ' . $meridian_extra;
}
if (null !== $all_extra){
$html_result .= ' ' . $all_extra;
$_html_meridian = '<select name="' . $_name . '"';
if ($meridian_id !== null || $all_id !== null) {
$_html_meridian .= ' id="' . smarty_function_escape_special_chars(
$meridian_id !== null ?
($meridian_id ? $meridian_id :
$_name) :
($all_id ? ($all_id . $_name) :
$_name)
) . '"';
}
$html_result .= '>'."\n";
$html_result .= smarty_function_html_options(array('output' => array('AM', 'PM'),
'values' => array('am', 'pm'),
'selected' => strtolower(strftime('%p', $time)),
'print_result' => false),
$smarty);
$html_result .= "</select>\n";
if ($meridian_size) {
$_html_meridian .= ' size="' . $meridian_size . '"';
}
$_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator;
if (isset($meridian_empty) || isset($all_empty)) {
$_html_meridian .= '<option value="">' . (isset($meridian_empty) ? $meridian_empty : $all_empty) .
'</option>' . $option_separator;
}
$_html_meridian .= '<option value="am"' . ($_hour > 0 && $_hour < 12 ? ' selected="selected"' : '') .
'>AM</option>' . $option_separator . '<option value="pm"' .
($_hour < 12 ? '' : ' selected="selected"') . '>PM</option>' . $option_separator .
'</select>';
}
return $html_result;
$_html = '';
foreach (array(
'_html_hours',
'_html_minutes',
'_html_seconds',
'_html_meridian'
) as $k) {
if (isset($$k)) {
if ($_html) {
$_html .= $field_separator;
}
$_html .= $$k;
}
}
return $_html;
}
/* vim: set expandtab: */
?>

View file

@ -1,52 +1,51 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsFunction
*/
/**
* Smarty {html_table} function plugin
* Type: function
* Name: html_table
* Date: Feb 17, 2003
* Purpose: make an html table from an array of data
* Params:
*
* Type: function<br>
* Name: html_table<br>
* Date: Feb 17, 2003<br>
* Purpose: make an html table from an array of data<br>
* Input:<br>
* - loop = array to loop through
* - cols = number of columns, comma separated list of column names
* or array of column names
* - rows = number of rows
* - table_attr = table attributes
* - th_attr = table heading attributes (arrays are cycled)
* - tr_attr = table row attributes (arrays are cycled)
* - td_attr = table cell attributes (arrays are cycled)
* - trailpad = value to pad trailing cells with
* - caption = text for caption element
* - vdir = vertical direction (default: "down", means top-to-bottom)
* - hdir = horizontal direction (default: "right", means left-to-right)
* - inner = inner loop (default "cols": print $loop line by line,
* $loop will be printed column by column otherwise)
*
* - loop - array to loop through
* - cols - number of columns, comma separated list of column names
* or array of column names
* - rows - number of rows
* - table_attr - table attributes
* - th_attr - table heading attributes (arrays are cycled)
* - tr_attr - table row attributes (arrays are cycled)
* - td_attr - table cell attributes (arrays are cycled)
* - trailpad - value to pad trailing cells with
* - caption - text for caption element
* - vdir - vertical direction (default: "down", means top-to-bottom)
* - hdir - horizontal direction (default: "right", means left-to-right)
* - inner - inner loop (default "cols": print $loop line by line,
* $loop will be printed column by column otherwise)
*
* Examples:
* <pre>
*
* {table loop=$data}
* {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
* {table loop=$data cols="first,second,third" tr_attr=$colors}
* </pre>
* @author Monte Ohrt <monte at ohrt dot com>
* @author credit to Messju Mohr <messju at lammfellpuschen dot de>
* @author credit to boots <boots dot smarty at yahoo dot com>
* @version 1.1
* @link http://smarty.php.net/manual/en/language.function.html.table.php {html_table}
* (Smarty online manual)
* @param array
* @param Smarty
*
* @author Monte Ohrt <monte at ohrt dot com>
* @author credit to Messju Mohr <messju at lammfellpuschen dot de>
* @author credit to boots <boots dot smarty at yahoo dot com>
* @version 1.1
* @link http://www.smarty.net/manual/en/language.function.html.table.php {html_table}
* (Smarty online manual)
*
* @param array $params parameters
*
* @return string
*/
function smarty_function_html_table($params, &$smarty)
function smarty_function_html_table($params)
{
$table_attr = 'border="1"';
$tr_attr = '';
@ -59,18 +58,16 @@ function smarty_function_html_table($params, &$smarty)
$hdir = 'right';
$inner = 'cols';
$caption = '';
if (!isset($params['loop'])) {
$smarty->trigger_error("html_table: missing 'loop' parameter");
$loop = null;
if (!isset($params[ 'loop' ])) {
trigger_error("html_table: missing 'loop' parameter", E_USER_WARNING);
return;
}
foreach ($params as $_key=>$_value) {
foreach ($params as $_key => $_value) {
switch ($_key) {
case 'loop':
$$_key = (array)$_value;
break;
case 'cols':
if (is_array($_value) && !empty($_value)) {
$cols = $_value;
@ -84,11 +81,9 @@ function smarty_function_html_table($params, &$smarty)
$cols_count = $cols;
}
break;
case 'rows':
$$_key = (int)$_value;
break;
case 'table_attr':
case 'trailpad':
case 'hdir':
@ -97,7 +92,6 @@ function smarty_function_html_table($params, &$smarty)
case 'caption':
$$_key = (string)$_value;
break;
case 'tr_attr':
case 'td_attr':
case 'th_attr':
@ -105,50 +99,42 @@ function smarty_function_html_table($params, &$smarty)
break;
}
}
$loop_count = count($loop);
if (empty($params['rows'])) {
if (empty($params[ 'rows' ])) {
/* no rows specified */
$rows = ceil($loop_count/$cols_count);
} elseif (empty($params['cols'])) {
if (!empty($params['rows'])) {
$rows = ceil($loop_count / $cols_count);
} elseif (empty($params[ 'cols' ])) {
if (!empty($params[ 'rows' ])) {
/* no cols specified, but rows */
$cols_count = ceil($loop_count/$rows);
$cols_count = ceil($loop_count / $rows);
}
}
$output = "<table $table_attr>\n";
if (!empty($caption)) {
$output .= '<caption>' . $caption . "</caption>\n";
}
if (is_array($cols)) {
$cols = ($hdir == 'right') ? $cols : array_reverse($cols);
$cols = ($hdir === 'right') ? $cols : array_reverse($cols);
$output .= "<thead><tr>\n";
for ($r=0; $r<$cols_count; $r++) {
for ($r = 0; $r < $cols_count; $r++) {
$output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>';
$output .= $cols[$r];
$output .= $cols[ $r ];
$output .= "</th>\n";
}
$output .= "</tr></thead>\n";
}
$output .= "<tbody>\n";
for ($r=0; $r<$rows; $r++) {
for ($r = 0; $r < $rows; $r++) {
$output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n";
$rx = ($vdir == 'down') ? $r*$cols_count : ($rows-1-$r)*$cols_count;
for ($c=0; $c<$cols_count; $c++) {
$x = ($hdir == 'right') ? $rx+$c : $rx+$cols_count-1-$c;
if ($inner!='cols') {
$rx = ($vdir === 'down') ? $r * $cols_count : ($rows - 1 - $r) * $cols_count;
for ($c = 0; $c < $cols_count; $c++) {
$x = ($hdir === 'right') ? $rx + $c : $rx + $cols_count - 1 - $c;
if ($inner !== 'cols') {
/* shuffle x to loop over rows*/
$x = floor($x/$cols_count) + ($x%$cols_count)*$rows;
$x = floor($x / $cols_count) + ($x % $cols_count) * $rows;
}
if ($x<$loop_count) {
$output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n";
if ($x < $loop_count) {
$output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[ $x ] . "</td>\n";
} else {
$output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n";
}
@ -157,21 +143,22 @@ function smarty_function_html_table($params, &$smarty)
}
$output .= "</tbody>\n";
$output .= "</table>\n";
return $output;
}
function smarty_function_html_table_cycle($name, $var, $no) {
if(!is_array($var)) {
/**
* @param $name
* @param $var
* @param $no
*
* @return string
*/
function smarty_function_html_table_cycle($name, $var, $no)
{
if (!is_array($var)) {
$ret = $var;
} else {
$ret = $var[$no % count($var)];
$ret = $var[ $no % count($var) ];
}
return ($ret) ? ' '.$ret : '';
return ($ret) ? ' ' . $ret : '';
}
/* vim: set expandtab: */
?>

View file

@ -1,165 +1,137 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsFunction
*/
/**
* Smarty {mailto} function plugin
*
* Type: function<br>
* Name: mailto<br>
* Type: function
* Name: mailto
* Date: May 21, 2002
* Purpose: automate mailto address link creation, and optionally
* encode them.<br>
* Input:<br>
* - address = e-mail address
* - text = (optional) text to display, default is address
* - encode = (optional) can be one of:
* * none : no encoding (default)
* * javascript : encode with javascript
* * javascript_charcode : encode with javascript charcode
* * hex : encode with hexidecimal (no javascript)
* - cc = (optional) address(es) to carbon copy
* - bcc = (optional) address(es) to blind carbon copy
* - subject = (optional) e-mail subject
* - newsgroups = (optional) newsgroup(s) to post to
* - followupto = (optional) address(es) to follow up to
* - extra = (optional) extra tags for the href link
* Purpose: automate mailto address link creation, and optionally encode them.
* Params:
*
* - address - (required) - e-mail address
* - text - (optional) - text to display, default is address
* - encode - (optional) - can be one of:
* * none : no encoding (default)
* * javascript : encode with javascript
* * javascript_charcode : encode with javascript charcode
* * hex : encode with hexadecimal (no javascript)
* - cc - (optional) - address(es) to carbon copy
* - bcc - (optional) - address(es) to blind carbon copy
* - subject - (optional) - e-mail subject
* - newsgroups - (optional) - newsgroup(s) to post to
* - followupto - (optional) - address(es) to follow up to
* - extra - (optional) - extra tags for the href link
*
* Examples:
* <pre>
*
* {mailto address="me@domain.com"}
* {mailto address="me@domain.com" encode="javascript"}
* {mailto address="me@domain.com" encode="hex"}
* {mailto address="me@domain.com" subject="Hello to you!"}
* {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
* {mailto address="me@domain.com" extra='class="mailto"'}
* </pre>
* @link http://smarty.php.net/manual/en/language.function.mailto.php {mailto}
* (Smarty online manual)
* @version 1.2
* @author Monte Ohrt <monte at ohrt dot com>
* @author credits to Jason Sweat (added cc, bcc and subject functionality)
* @param array
* @param Smarty
* @return string
*
* @link http://www.smarty.net/manual/en/language.function.mailto.php {mailto}
* (Smarty online manual)
* @version 1.2
* @author Monte Ohrt <monte at ohrt dot com>
* @author credits to Jason Sweat (added cc, bcc and subject functionality)
*
* @param array $params parameters
*
* @return string
*/
function smarty_function_mailto($params, &$smarty)
function smarty_function_mailto($params)
{
static $_allowed_encoding =
array('javascript' => true, 'javascript_charcode' => true, 'hex' => true, 'none' => true);
$extra = '';
if (empty($params['address'])) {
$smarty->trigger_error("mailto: missing 'address' parameter");
if (empty($params[ 'address' ])) {
trigger_error("mailto: missing 'address' parameter", E_USER_WARNING);
return;
} else {
$address = $params['address'];
$address = $params[ 'address' ];
}
$text = $address;
// netscape and mozilla do not decode %40 (@) in BCC field (bug?)
// so, don't encode it.
$search = array('%40', '%2C');
$replace = array('@', ',');
$replace = array('@', ',');
$mail_parms = array();
foreach ($params as $var=>$value) {
foreach ($params as $var => $value) {
switch ($var) {
case 'cc':
case 'bcc':
case 'followupto':
if (!empty($value))
$mail_parms[] = $var.'='.str_replace($search,$replace,rawurlencode($value));
if (!empty($value)) {
$mail_parms[] = $var . '=' . str_replace($search, $replace, rawurlencode($value));
}
break;
case 'subject':
case 'newsgroups':
$mail_parms[] = $var.'='.rawurlencode($value);
$mail_parms[] = $var . '=' . rawurlencode($value);
break;
case 'extra':
case 'text':
$$var = $value;
// no break
default:
}
}
$mail_parm_vals = '';
for ($i=0; $i<count($mail_parms); $i++) {
$mail_parm_vals .= (0==$i) ? '?' : '&';
$mail_parm_vals .= $mail_parms[$i];
if ($mail_parms) {
$address .= '?' . join('&', $mail_parms);
}
$address .= $mail_parm_vals;
$encode = (empty($params['encode'])) ? 'none' : $params['encode'];
if (!in_array($encode,array('javascript','javascript_charcode','hex','none')) ) {
$smarty->trigger_error("mailto: 'encode' parameter must be none, javascript or hex");
$encode = (empty($params[ 'encode' ])) ? 'none' : $params[ 'encode' ];
if (!isset($_allowed_encoding[ $encode ])) {
trigger_error(
"mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex",
E_USER_WARNING
);
return;
}
if ($encode == 'javascript' ) {
$string = 'document.write(\'<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>\');';
// FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed!
if ($encode === 'javascript') {
$string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');';
$js_encode = '';
for ($x=0; $x < strlen($string); $x++) {
$js_encode .= '%' . bin2hex($string[$x]);
for ($x = 0, $_length = strlen($string); $x < $_length; $x++) {
$js_encode .= '%' . bin2hex($string[ $x ]);
}
return '<script type="text/javascript">eval(unescape(\''.$js_encode.'\'))</script>';
} elseif ($encode == 'javascript_charcode' ) {
$string = '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
for($x = 0, $y = strlen($string); $x < $y; $x++ ) {
$ord[] = ord($string[$x]);
return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>';
} elseif ($encode === 'javascript_charcode') {
$string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
for ($x = 0, $y = strlen($string); $x < $y; $x++) {
$ord[] = ord($string[ $x ]);
}
$_ret = "<script type=\"text/javascript\" language=\"javascript\">\n";
$_ret .= "<!--\n";
$_ret .= "{document.write(String.fromCharCode(";
$_ret .= implode(',',$ord);
$_ret .= "))";
$_ret .= "}\n";
$_ret .= "//-->\n";
$_ret .= "</script>\n";
$_ret = "<script type=\"text/javascript\" language=\"javascript\">\n" . "{document.write(String.fromCharCode(" .
implode(',', $ord) . "))" . "}\n" . "</script>\n";
return $_ret;
} elseif ($encode == 'hex') {
preg_match('!^(.*)(\?.*)$!',$address,$match);
if(!empty($match[2])) {
$smarty->trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.");
} elseif ($encode === 'hex') {
preg_match('!^(.*)(\?.*)$!', $address, $match);
if (!empty($match[ 2 ])) {
trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.", E_USER_WARNING);
return;
}
$address_encode = '';
for ($x=0; $x < strlen($address); $x++) {
if(preg_match('!\w!',$address[$x])) {
$address_encode .= '%' . bin2hex($address[$x]);
for ($x = 0, $_length = strlen($address); $x < $_length; $x++) {
if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[ $x ])) {
$address_encode .= '%' . bin2hex($address[ $x ]);
} else {
$address_encode .= $address[$x];
$address_encode .= $address[ $x ];
}
}
$text_encode = '';
for ($x=0; $x < strlen($text); $x++) {
$text_encode .= '&#x' . bin2hex($text[$x]).';';
for ($x = 0, $_length = strlen($text); $x < $_length; $x++) {
$text_encode .= '&#x' . bin2hex($text[ $x ]) . ';';
}
$mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
return '<a href="'.$mailto.$address_encode.'" '.$extra.'>'.$text_encode.'</a>';
return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>';
} else {
// no encoding
return '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
}
}
/* vim: set expandtab: */
?>

View file

@ -1,85 +1,112 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
* This plugin is only for Smarty2 BC
*
* @package Smarty
* @subpackage PluginsFunction
*/
/**
* Smarty {math} function plugin
* Type: function
* Name: math
* Purpose: handle math computations in template
*
* Type: function<br>
* Name: math<br>
* Purpose: handle math computations in template<br>
* @link http://smarty.php.net/manual/en/language.function.math.php {math}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param array
* @param Smarty
* @return string
* @link http://www.smarty.net/manual/en/language.function.math.php {math}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
*
* @param array $params parameters
* @param Smarty_Internal_Template $template template object
*
* @return string|null
*/
function smarty_function_math($params, &$smarty)
function smarty_function_math($params, $template)
{
static $_allowed_funcs =
array(
'int' => true,
'abs' => true,
'ceil' => true,
'cos' => true,
'exp' => true,
'floor' => true,
'log' => true,
'log10' => true,
'max' => true,
'min' => true,
'pi' => true,
'pow' => true,
'rand' => true,
'round' => true,
'sin' => true,
'sqrt' => true,
'srand' => true,
'tan' => true
);
// be sure equation parameter is present
if (empty($params['equation'])) {
$smarty->trigger_error("math: missing equation parameter");
if (empty($params[ 'equation' ])) {
trigger_error("math: missing equation parameter", E_USER_WARNING);
return;
}
// strip out backticks, not necessary for math
$equation = str_replace('`','',$params['equation']);
$equation = $params[ 'equation' ];
// make sure parenthesis are balanced
if (substr_count($equation,"(") != substr_count($equation,")")) {
$smarty->trigger_error("math: unbalanced parenthesis");
if (substr_count($equation, '(') !== substr_count($equation, ')')) {
trigger_error("math: unbalanced parenthesis", E_USER_WARNING);
return;
}
// match all vars in equation, make sure all are passed
preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]*)!",$equation, $match);
$allowed_funcs = array('int','abs','ceil','cos','exp','floor','log','log10',
'max','min','pi','pow','rand','round','sin','sqrt','srand','tan');
foreach($match[1] as $curr_var) {
if ($curr_var && !in_array($curr_var, array_keys($params)) && !in_array($curr_var, $allowed_funcs)) {
$smarty->trigger_error("math: function call $curr_var not allowed");
return;
}
// disallow backticks
if (strpos($equation, '`') !== false) {
trigger_error("math: backtick character not allowed in equation", E_USER_WARNING);
return;
}
foreach($params as $key => $val) {
if ($key != "equation" && $key != "format" && $key != "assign") {
// also disallow dollar signs
if (strpos($equation, '$') !== false) {
trigger_error("math: dollar signs not allowed in equation", E_USER_WARNING);
return;
}
foreach ($params as $key => $val) {
if ($key !== 'equation' && $key !== 'format' && $key !== 'assign') {
// make sure value is not empty
if (strlen($val)==0) {
$smarty->trigger_error("math: parameter $key is empty");
if (strlen($val) === 0) {
trigger_error("math: parameter '{$key}' is empty", E_USER_WARNING);
return;
}
if (!is_numeric($val)) {
$smarty->trigger_error("math: parameter $key: is not numeric");
trigger_error("math: parameter '{$key}' is not numeric", E_USER_WARNING);
return;
}
}
}
// match all vars in equation, make sure all are passed
preg_match_all('!(?:0x[a-fA-F0-9]+)|([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)!', $equation, $match);
foreach ($match[ 1 ] as $curr_var) {
if ($curr_var && !isset($params[ $curr_var ]) && !isset($_allowed_funcs[ $curr_var ])) {
trigger_error(
"math: function call '{$curr_var}' not allowed, or missing parameter '{$curr_var}'",
E_USER_WARNING
);
return;
}
}
foreach ($params as $key => $val) {
if ($key !== 'equation' && $key !== 'format' && $key !== 'assign') {
$equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation);
}
}
eval("\$smarty_math_result = ".$equation.";");
if (empty($params['format'])) {
if (empty($params['assign'])) {
$smarty_math_result = null;
eval("\$smarty_math_result = " . $equation . ";");
if (empty($params[ 'format' ])) {
if (empty($params[ 'assign' ])) {
return $smarty_math_result;
} else {
$smarty->assign($params['assign'],$smarty_math_result);
$template->assign($params[ 'assign' ], $smarty_math_result);
}
} else {
if (empty($params['assign'])){
printf($params['format'],$smarty_math_result);
if (empty($params[ 'assign' ])) {
printf($params[ 'format' ], $smarty_math_result);
} else {
$smarty->assign($params['assign'],sprintf($params['format'],$smarty_math_result));
$template->assign($params[ 'assign' ], sprintf($params[ 'format' ], $smarty_math_result));
}
}
}
/* vim: set expandtab: */
?>

View file

@ -1,119 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty {popup} function plugin
*
* Type: function<br>
* Name: popup<br>
* Purpose: make text pop up in windows via overlib
* @link http://smarty.php.net/manual/en/language.function.popup.php {popup}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param array
* @param Smarty
* @return string
*/
function smarty_function_popup($params, &$smarty)
{
$append = '';
foreach ($params as $_key=>$_value) {
switch ($_key) {
case 'text':
case 'trigger':
case 'function':
case 'inarray':
$$_key = (string)$_value;
if ($_key == 'function' || $_key == 'inarray')
$append .= ',' . strtoupper($_key) . ",'$_value'";
break;
case 'caption':
case 'closetext':
case 'status':
$append .= ',' . strtoupper($_key) . ",'" . str_replace("'","\'",$_value) . "'";
break;
case 'fgcolor':
case 'bgcolor':
case 'textcolor':
case 'capcolor':
case 'closecolor':
case 'textfont':
case 'captionfont':
case 'closefont':
case 'fgbackground':
case 'bgbackground':
case 'caparray':
case 'capicon':
case 'background':
case 'frame':
$append .= ',' . strtoupper($_key) . ",'$_value'";
break;
case 'textsize':
case 'captionsize':
case 'closesize':
case 'width':
case 'height':
case 'border':
case 'offsetx':
case 'offsety':
case 'snapx':
case 'snapy':
case 'fixx':
case 'fixy':
case 'padx':
case 'pady':
case 'timeout':
case 'delay':
$append .= ',' . strtoupper($_key) . ",$_value";
break;
case 'sticky':
case 'left':
case 'right':
case 'center':
case 'above':
case 'below':
case 'noclose':
case 'autostatus':
case 'autostatuscap':
case 'fullhtml':
case 'hauto':
case 'vauto':
case 'mouseoff':
case 'followmouse':
case 'closeclick':
if ($_value) $append .= ',' . strtoupper($_key);
break;
default:
$smarty->trigger_error("[popup] unknown parameter $_key", E_USER_WARNING);
}
}
if (empty($text) && !isset($inarray) && empty($function)) {
$smarty->trigger_error("overlib: attribute 'text' or 'inarray' or 'function' required");
return false;
}
if (empty($trigger)) { $trigger = "onmouseover"; }
$retval = $trigger . '="return overlib(\''.preg_replace(array("!'!","![\r\n]!"),array("\'",'\r'),$text).'\'';
$retval .= $append . ');"';
if ($trigger == 'onmouseover')
$retval .= ' onmouseout="nd();"';
return $retval;
}
/* vim: set expandtab: */
?>

View file

@ -1,40 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty {popup_init} function plugin
*
* Type: function<br>
* Name: popup_init<br>
* Purpose: initialize overlib
* @link http://smarty.php.net/manual/en/language.function.popup.init.php {popup_init}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param array
* @param Smarty
* @return string
*/
function smarty_function_popup_init($params, &$smarty)
{
$zindex = 1000;
if (!empty($params['zindex'])) {
$zindex = $params['zindex'];
}
if (!empty($params['src'])) {
return '<div id="overDiv" style="position:absolute; visibility:hidden; z-index:'.$zindex.';"></div>' . "\n"
. '<script type="text/javascript" language="JavaScript" src="'.$params['src'].'"></script>' . "\n";
} else {
$smarty->trigger_error("popup_init: missing src parameter");
}
}
/* vim: set expandtab: */
?>

View file

@ -1,60 +0,0 @@
<?php
/*======================================================================*\
Function: smarty_func_um_welcome_message
Purpose: translate system boxes into different languages
\*======================================================================*/
function smarty_function_um_welcome_message($args, &$smarty_obj)
{
extract($args);
$config_vars = $smarty_obj->_config[0]["vars"];
$array_keys = array_keys($args);
if (empty($var)) {
$smarty_obj->_trigger_error_msg("um_welcome_message: missing 'var' parameter");
return;
}
if (!in_array('messages',$array_keys )) {
$smarty_obj->_trigger_error_msg("um_welcome_message: missing 'messages' parameter");
return;
}
if (!in_array('unread', $array_keys)) {
$smarty_obj->_trigger_error_msg("um_welcome_message: missing 'unread' parameter");
return;
}
if (!in_array('var', $array_keys)) {
$smarty_obj->_trigger_error_msg("um_welcome_message: missing 'var' parameter");
return;
}
if (!in_array('boxname', $array_keys)) {
$smarty_obj->_trigger_error_msg("um_welcome_message: missing 'boxname' parameter");
return;
}
$wlcmessage = $config_vars["msg_you_have"]. " <b>$messages</b> ";
if($messages == 1)
$wlcmessage .= $config_vars["msg_message"].", ";
else
$wlcmessage .= $config_vars["msg_messages"].", ";
if($unread == 0)
$wlcmessage .= $config_vars["msg_none_unread"]." ";
elseif($unread == 1)
$wlcmessage .= "<b>$unread</b> ". $config_vars["msg_one_unread"]." ";
else
$wlcmessage .= "<b>$unread</b> ". $config_vars["msg_more_unread"]." ";
$wlcmessage .= $config_vars["msg_in_the_folder"]." <b>$boxname</b>";
$smarty_obj->assign($var, $wlcmessage);
return;
}
?>

View file

@ -1,43 +1,145 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsModifier
*/
/**
* Smarty capitalize modifier plugin
*
* Type: modifier<br>
* Name: capitalize<br>
* Type: modifier
* Name: capitalize
* Purpose: capitalize words in the string
* @link http://smarty.php.net/manual/en/language.modifiers.php#LANGUAGE.MODIFIER.CAPITALIZE
* capitalize (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }}
*
* @param string $string string to capitalize
* @param boolean $uc_digits also capitalize "x123" to "X123"
* @param boolean $lc_rest capitalize first letters, lowercase all following letters "aAa" to "Aaa"
*
* @return string capitalized string
* @author Monte Ohrt <monte at ohrt dot com>
* @author Rodney Rehm
*/
function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false)
{
if (Smarty::$_MBSTRING) {
if ($lc_rest) {
// uppercase (including hyphenated words)
$upper_string = mb_convert_case($string, MB_CASE_TITLE, Smarty::$_CHARSET);
} else {
// uppercase word breaks
$upper_string = preg_replace_callback(
"!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER,
'smarty_mod_cap_mbconvert_cb',
$string
);
}
// check uc_digits case
if (!$uc_digits) {
if (preg_match_all(
"!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER,
$string,
$matches,
PREG_OFFSET_CAPTURE
)
) {
foreach ($matches[ 1 ] as $match) {
$upper_string =
substr_replace(
$upper_string,
mb_strtolower($match[ 0 ], Smarty::$_CHARSET),
$match[ 1 ],
strlen($match[ 0 ])
);
}
}
}
$upper_string =
preg_replace_callback(
"!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER,
'smarty_mod_cap_mbconvert2_cb',
$upper_string
);
return $upper_string;
}
// lowercase first
if ($lc_rest) {
$string = strtolower($string);
}
// uppercase (including hyphenated words)
$upper_string =
preg_replace_callback(
"!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER,
'smarty_mod_cap_ucfirst_cb',
$string
);
// check uc_digits case
if (!$uc_digits) {
if (preg_match_all(
"!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER,
$string,
$matches,
PREG_OFFSET_CAPTURE
)
) {
foreach ($matches[ 1 ] as $match) {
$upper_string =
substr_replace($upper_string, strtolower($match[ 0 ]), $match[ 1 ], strlen($match[ 0 ]));
}
}
}
$upper_string = preg_replace_callback(
"!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER,
'smarty_mod_cap_ucfirst2_cb',
$upper_string
);
return $upper_string;
}
/**
*
* Bug: create_function() use exhausts memory when used in long loops
* Fix: use declared functions for callbacks instead of using create_function()
* Note: This can be fixed using anonymous functions instead, but that requires PHP >= 5.3
*
* @author Kyle Renfrow
*/
/**
* @param $matches
*
* @return string
*/
function smarty_modifier_capitalize($string, $uc_digits = false)
function smarty_mod_cap_mbconvert_cb($matches)
{
smarty_modifier_capitalize_ucfirst(null, $uc_digits);
return preg_replace_callback('!\'?\b\w(\w|\')*\b!', 'smarty_modifier_capitalize_ucfirst', $string);
return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 2 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
}
function smarty_modifier_capitalize_ucfirst($string, $uc_digits = null)
/**
* @param $matches
*
* @return string
*/
function smarty_mod_cap_mbconvert2_cb($matches)
{
static $_uc_digits = false;
if(isset($uc_digits)) {
$_uc_digits = $uc_digits;
return;
}
if(substr($string[0],0,1) != "'" && !preg_match("!\d!",$string[0]) || $_uc_digits)
return ucfirst($string[0]);
else
return $string[0];
return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 3 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
}
/**
* @param $matches
*
* @return string
*/
function smarty_mod_cap_ucfirst_cb($matches)
{
return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 2 ]));
}
?>
/**
* @param $matches
*
* @return string
*/
function smarty_mod_cap_ucfirst2_cb($matches)
{
return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 3 ]));
}

View file

@ -1,33 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty cat modifier plugin
*
* Type: modifier<br>
* Name: cat<br>
* Date: Feb 24, 2003
* Purpose: catenate a value to a variable
* Input: string to catenate
* Example: {$var|cat:"foo"}
* @link http://smarty.php.net/manual/en/language.modifier.cat.php cat
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @version 1.0
* @param string
* @param string
* @return string
*/
function smarty_modifier_cat($string, $cat)
{
return $string . $cat;
}
/* vim: set expandtab: */
?>

View file

@ -1,32 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty count_characters modifier plugin
*
* Type: modifier<br>
* Name: count_characteres<br>
* Purpose: count the number of characters in a text
* @link http://smarty.php.net/manual/en/language.modifier.count.characters.php
* count_characters (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @param boolean include whitespace in the character count
* @return integer
*/
function smarty_modifier_count_characters($string, $include_spaces = false)
{
if ($include_spaces)
return(strlen($string));
return preg_match_all("/[^\s]/",$string, $match);
}
/* vim: set expandtab: */
?>

View file

@ -1,29 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty count_paragraphs modifier plugin
*
* Type: modifier<br>
* Name: count_paragraphs<br>
* Purpose: count the number of paragraphs in a text
* @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
* count_paragraphs (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @return integer
*/
function smarty_modifier_count_paragraphs($string)
{
// count \r or \n characters
return count(preg_split('/[\r\n]+/', $string));
}
/* vim: set expandtab: */
?>

View file

@ -1,29 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty count_sentences modifier plugin
*
* Type: modifier<br>
* Name: count_sentences
* Purpose: count the number of sentences in a text
* @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
* count_sentences (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @return integer
*/
function smarty_modifier_count_sentences($string)
{
// find periods with a word before but not after.
return preg_match_all('/[^\s]\.(?!\w)/', $string, $match);
}
/* vim: set expandtab: */
?>

View file

@ -1,33 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty count_words modifier plugin
*
* Type: modifier<br>
* Name: count_words<br>
* Purpose: count the number of words in a text
* @link http://smarty.php.net/manual/en/language.modifier.count.words.php
* count_words (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @return integer
*/
function smarty_modifier_count_words($string)
{
// split text by ' ',\r,\n,\f,\t
$split_array = preg_split('/\s+/',$string);
// count matches that contain alphanumerics
$word_count = preg_grep('/[a-zA-Z0-9\\x80-\\xff]/', $split_array);
return count($word_count);
}
/* vim: set expandtab: */
?>

View file

@ -1,58 +1,85 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsModifier
*/
/**
* Include the {@link shared.make_timestamp.php} plugin
*/
require_once $smarty->_get_plugin_filepath('shared', 'make_timestamp');
/**
* Smarty date_format modifier plugin
* Type: modifier
* Name: date_format
* Purpose: format datestamps via strftime
* Input:
* - string: input date string
* - format: strftime format for output
* - default_date: default date if $string is empty
*
* Type: modifier<br>
* Name: date_format<br>
* Purpose: format datestamps via strftime<br>
* Input:<br>
* - string: input date string
* - format: strftime format for output
* - default_date: default date if $string is empty
* @link http://smarty.php.net/manual/en/language.modifier.date.format.php
* date_format (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @param string
* @param string
* @return string|void
* @uses smarty_make_timestamp()
* @link http://www.smarty.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
*
* @param string $string input date string
* @param string $format strftime format for output
* @param string $default_date default date if $string is empty
* @param string $formatter either 'strftime' or 'auto'
*
* @return string |void
* @uses smarty_make_timestamp()
*/
function smarty_modifier_date_format($string, $format = '%b %e, %Y', $default_date = '')
function smarty_modifier_date_format($string, $format = null, $default_date = '', $formatter = 'auto')
{
if ($string != '') {
if ($format === null) {
$format = Smarty::$_DATE_FORMAT;
}
/**
* require_once the {@link shared.make_timestamp.php} plugin
*/
static $is_loaded = false;
if (!$is_loaded) {
if (!is_callable('smarty_make_timestamp')) {
include_once SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php';
}
$is_loaded = true;
}
if ($string !== '' && $string !== '0000-00-00' && $string !== '0000-00-00 00:00:00') {
$timestamp = smarty_make_timestamp($string);
} elseif ($default_date != '') {
} elseif ($default_date !== '') {
$timestamp = smarty_make_timestamp($default_date);
} else {
return;
}
if (DIRECTORY_SEPARATOR == '\\') {
$_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T');
$_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S');
if (strpos($format, '%e') !== false) {
$_win_from[] = '%e';
$_win_to[] = sprintf('%\' 2d', date('j', $timestamp));
if ($formatter === 'strftime' || ($formatter === 'auto' && strpos($format, '%') !== false)) {
if (Smarty::$_IS_WINDOWS) {
$_win_from = array(
'%D',
'%h',
'%n',
'%r',
'%R',
'%t',
'%T'
);
$_win_to = array(
'%m/%d/%y',
'%b',
"\n",
'%I:%M:%S %p',
'%H:%M',
"\t",
'%H:%M:%S'
);
if (strpos($format, '%e') !== false) {
$_win_from[] = '%e';
$_win_to[] = sprintf('%\' 2d', date('j', $timestamp));
}
if (strpos($format, '%l') !== false) {
$_win_from[] = '%l';
$_win_to[] = sprintf('%\' 2d', date('h', $timestamp));
}
$format = str_replace($_win_from, $_win_to, $format);
}
if (strpos($format, '%l') !== false) {
$_win_from[] = '%l';
$_win_to[] = sprintf('%\' 2d', date('h', $timestamp));
}
$format = str_replace($_win_from, $_win_to, $format);
return strftime($format, $timestamp);
} else {
return date($format, $timestamp);
}
return strftime($format, $timestamp);
}
/* vim: set expandtab: */
?>

View file

@ -1,56 +1,62 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage Debug
*/
/**
* Smarty debug_print_var modifier plugin
*
* Type: modifier<br>
* Name: debug_print_var<br>
* Type: modifier
* Name: debug_print_var
* Purpose: formats variable contents for display in the console
* @link http://smarty.php.net/manual/en/language.modifier.debug.print.var.php
* debug_print_var (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param array|object
* @param integer
* @param integer
*
* @author Monte Ohrt <monte at ohrt dot com>
*
* @param array|object $var variable to be formatted
* @param int $max maximum recursion depth if $var is an array or object
* @param int $length maximum string length if $var is a string
* @param int $depth actual recursion depth
* @param array $objects processed objects in actual depth to prevent recursive object processing
*
* @return string
*/
function smarty_modifier_debug_print_var($var, $depth = 0, $length = 40)
function smarty_modifier_debug_print_var($var, $max = 10, $length = 40, $depth = 0, $objects = array())
{
$_replace = array(
"\n" => '<i>\n</i>',
"\r" => '<i>\r</i>',
"\t" => '<i>\t</i>'
);
$_replace = array("\n" => '\n', "\r" => '\r', "\t" => '\t');
switch (gettype($var)) {
case 'array' :
case 'array':
$results = '<b>Array (' . count($var) . ')</b>';
if ($depth === $max) {
break;
}
foreach ($var as $curr_key => $curr_val) {
$results .= '<br>' . str_repeat('&nbsp;', $depth * 2)
. '<b>' . strtr($curr_key, $_replace) . '</b> =&gt; '
. smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
$depth--;
$results .= '<br>' . str_repeat('&nbsp;', $depth * 2) . '<b>' . strtr($curr_key, $_replace) .
'</b> =&gt; ' .
smarty_modifier_debug_print_var($curr_val, $max, $length, ++$depth, $objects);
$depth--;
}
break;
case 'object' :
case 'object':
$object_vars = get_object_vars($var);
$results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>';
if (in_array($var, $objects)) {
$results .= ' called recursive';
break;
}
if ($depth === $max) {
break;
}
$objects[] = $var;
foreach ($object_vars as $curr_key => $curr_val) {
$results .= '<br>' . str_repeat('&nbsp;', $depth * 2)
. '<b> -&gt;' . strtr($curr_key, $_replace) . '</b> = '
. smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
$depth--;
$results .= '<br>' . str_repeat('&nbsp;', $depth * 2) . '<b> -&gt;' . strtr($curr_key, $_replace) .
'</b> = ' . smarty_modifier_debug_print_var($curr_val, $max, $length, ++$depth, $objects);
$depth--;
}
break;
case 'boolean' :
case 'NULL' :
case 'resource' :
case 'boolean':
case 'NULL':
case 'resource':
if (true === $var) {
$results = 'true';
} elseif (false === $var) {
@ -58,33 +64,40 @@ function smarty_modifier_debug_print_var($var, $depth = 0, $length = 40)
} elseif (null === $var) {
$results = 'null';
} else {
$results = htmlspecialchars((string) $var);
$results = htmlspecialchars((string)$var);
}
$results = '<i>' . $results . '</i>';
break;
case 'integer' :
case 'float' :
$results = htmlspecialchars((string) $var);
case 'integer':
case 'float':
$results = htmlspecialchars((string)$var);
break;
case 'string' :
case 'string':
$results = strtr($var, $_replace);
if (strlen($var) > $length ) {
$results = substr($var, 0, $length - 3) . '...';
if (Smarty::$_MBSTRING) {
if (mb_strlen($var, Smarty::$_CHARSET) > $length) {
$results = mb_substr($var, 0, $length - 3, Smarty::$_CHARSET) . '...';
}
} else {
if (isset($var[ $length ])) {
$results = substr($var, 0, $length - 3) . '...';
}
}
$results = htmlspecialchars('"' . $results . '"');
$results = htmlspecialchars('"' . $results . '"', ENT_QUOTES, Smarty::$_CHARSET);
break;
case 'unknown type' :
default :
$results = strtr((string) $var, $_replace);
if (strlen($results) > $length ) {
$results = substr($results, 0, $length - 3) . '...';
case 'unknown type':
default:
$results = strtr((string)$var, $_replace);
if (Smarty::$_MBSTRING) {
if (mb_strlen($results, Smarty::$_CHARSET) > $length) {
$results = mb_substr($results, 0, $length - 3, Smarty::$_CHARSET) . '...';
}
} else {
if (strlen($results) > $length) {
$results = substr($results, 0, $length - 3) . '...';
}
}
$results = htmlspecialchars($results);
$results = htmlspecialchars($results, ENT_QUOTES, Smarty::$_CHARSET);
}
return $results;
}
/* vim: set expandtab: */
?>

View file

@ -1,32 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty default modifier plugin
*
* Type: modifier<br>
* Name: default<br>
* Purpose: designate default value for empty variables
* @link http://smarty.php.net/manual/en/language.modifier.default.php
* default (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @param string
* @return string
*/
function smarty_modifier_default($string, $default = '')
{
if (!isset($string) || $string === '')
return $default;
else
return $string;
}
/* vim: set expandtab: */
?>

View file

@ -1,93 +1,255 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsModifier
*/
/**
* Smarty escape modifier plugin
* Type: modifier
* Name: escape
* Purpose: escape string for output
*
* Type: modifier<br>
* Name: escape<br>
* Purpose: Escape the string according to escapement type
* @link http://smarty.php.net/manual/en/language.modifier.escape.php
* escape (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @param html|htmlall|url|quotes|hex|hexentity|javascript
* @return string
* @link http://www.smarty.net/docs/en/language.modifier.escape
* @author Monte Ohrt <monte at ohrt dot com>
*
* @param string $string input string
* @param string $esc_type escape type
* @param string $char_set character set, used for htmlspecialchars() or htmlentities()
* @param boolean $double_encode encode already encoded entitites again, used for htmlspecialchars() or htmlentities()
*
* @return string escaped input string
*/
function smarty_modifier_escape($string, $esc_type = 'html', $char_set = 'ISO-8859-1')
function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true)
{
static $_double_encode = null;
static $is_loaded_1 = false;
static $is_loaded_2 = false;
if ($_double_encode === null) {
$_double_encode = version_compare(PHP_VERSION, '5.2.3', '>=');
}
if (!$char_set) {
$char_set = Smarty::$_CHARSET;
}
switch ($esc_type) {
case 'html':
return htmlspecialchars($string, ENT_QUOTES, $char_set);
if ($_double_encode) {
// php >=5.3.2 - go native
return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
} else {
if ($double_encode) {
// php <5.2.3 - only handle double encoding
return htmlspecialchars($string, ENT_QUOTES, $char_set);
} else {
// php <5.2.3 - prevent double encoding
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
$string = htmlspecialchars($string, ENT_QUOTES, $char_set);
$string = str_replace(
array(
'%%%SMARTY_START%%%',
'%%%SMARTY_END%%%'
),
array(
'&',
';'
),
$string
);
return $string;
}
}
// no break
case 'htmlall':
return htmlentities($string, ENT_QUOTES, $char_set);
if (Smarty::$_MBSTRING) {
// mb_convert_encoding ignores htmlspecialchars()
if ($_double_encode) {
// php >=5.3.2 - go native
$string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
} else {
if ($double_encode) {
// php <5.2.3 - only handle double encoding
$string = htmlspecialchars($string, ENT_QUOTES, $char_set);
} else {
// php <5.2.3 - prevent double encoding
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
$string = htmlspecialchars($string, ENT_QUOTES, $char_set);
$string =
str_replace(
array(
'%%%SMARTY_START%%%',
'%%%SMARTY_END%%%'
),
array(
'&',
';'
),
$string
);
return $string;
}
}
// htmlentities() won't convert everything, so use mb_convert_encoding
return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set);
}
// no MBString fallback
if ($_double_encode) {
return htmlentities($string, ENT_QUOTES, $char_set, $double_encode);
} else {
if ($double_encode) {
return htmlentities($string, ENT_QUOTES, $char_set);
} else {
$string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
$string = htmlentities($string, ENT_QUOTES, $char_set);
$string = str_replace(
array(
'%%%SMARTY_START%%%',
'%%%SMARTY_END%%%'
),
array(
'&',
';'
),
$string
);
return $string;
}
}
// no break
case 'url':
return rawurlencode($string);
case 'urlpathinfo':
return str_replace('%2F','/',rawurlencode($string));
return str_replace('%2F', '/', rawurlencode($string));
case 'quotes':
// escape unescaped single quotes
return preg_replace("%(?<!\\\\)'%", "\\'", $string);
case 'hex':
// escape every character into hex
// escape every byte into hex
// Note that the UTF-8 encoded character ä will be represented as %c3%a4
$return = '';
for ($x=0; $x < strlen($string); $x++) {
$return .= '%' . bin2hex($string[$x]);
$_length = strlen($string);
for ($x = 0; $x < $_length; $x++) {
$return .= '%' . bin2hex($string[ $x ]);
}
return $return;
case 'hexentity':
$return = '';
for ($x=0; $x < strlen($string); $x++) {
$return .= '&#x' . bin2hex($string[$x]) . ';';
if (Smarty::$_MBSTRING) {
if (!$is_loaded_1) {
if (!is_callable('smarty_mb_to_unicode')) {
include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php';
}
$is_loaded_1 = true;
}
$return = '';
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
$return .= '&#x' . strtoupper(dechex($unicode)) . ';';
}
return $return;
}
// no MBString fallback
$_length = strlen($string);
for ($x = 0; $x < $_length; $x++) {
$return .= '&#x' . bin2hex($string[ $x ]) . ';';
}
return $return;
case 'decentity':
$return = '';
for ($x=0; $x < strlen($string); $x++) {
$return .= '&#' . ord($string[$x]) . ';';
if (Smarty::$_MBSTRING) {
if (!$is_loaded_1) {
if (!is_callable('smarty_mb_to_unicode')) {
include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php';
}
$is_loaded_1 = true;
}
$return = '';
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
$return .= '&#' . $unicode . ';';
}
return $return;
}
// no MBString fallback
$_length = strlen($string);
for ($x = 0; $x < $_length; $x++) {
$return .= '&#' . ord($string[ $x ]) . ';';
}
return $return;
case 'javascript':
// escape quotes and backslashes, newlines, etc.
return strtr($string, array('\\'=>'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n','</'=>'<\/'));
return strtr(
$string,
array(
'\\' => '\\\\',
"'" => "\\'",
'"' => '\\"',
"\r" => '\\r',
"\n" => '\\n',
'</' => '<\/'
)
);
case 'mail':
// safe way to display e-mail address on a web page
return str_replace(array('@', '.'),array(' [AT] ', ' [DOT] '), $string);
if (Smarty::$_MBSTRING) {
if (!$is_loaded_2) {
if (!is_callable('smarty_mb_str_replace')) {
include_once SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php';
}
$is_loaded_2 = true;
}
return smarty_mb_str_replace(
array(
'@',
'.'
),
array(
' [AT] ',
' [DOT] '
),
$string
);
}
// no MBString fallback
return str_replace(
array(
'@',
'.'
),
array(
' [AT] ',
' [DOT] '
),
$string
);
case 'nonstd':
// escape non-standard chars, such as ms document quotes
$_res = '';
for($_i = 0, $_len = strlen($string); $_i < $_len; $_i++) {
$_ord = ord(substr($string, $_i, 1));
// non-standard char, escape it
if($_ord >= 126){
$_res .= '&#' . $_ord . ';';
}
else {
$_res .= substr($string, $_i, 1);
}
}
return $_res;
// escape non-standard chars, such as ms document quotes
$return = '';
if (Smarty::$_MBSTRING) {
if (!$is_loaded_1) {
if (!is_callable('smarty_mb_to_unicode')) {
include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php';
}
$is_loaded_1 = true;
}
foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
if ($unicode >= 126) {
$return .= '&#' . $unicode . ';';
} else {
$return .= chr($unicode);
}
}
return $return;
}
$_length = strlen($string);
for ($_i = 0; $_i < $_length; $_i++) {
$_ord = ord(substr($string, $_i, 1));
// non-standard char, escape it
if ($_ord >= 126) {
$return .= '&#' . $_ord . ';';
} else {
$return .= substr($string, $_i, 1);
}
}
return $return;
default:
return $string;
}
}
/* vim: set expandtab: */
?>

View file

@ -1,28 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty indent modifier plugin
*
* Type: modifier<br>
* Name: indent<br>
* Purpose: indent lines of text
* @link http://smarty.php.net/manual/en/language.modifier.indent.php
* indent (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @param integer
* @param string
* @return string
*/
function smarty_modifier_indent($string,$chars=4,$char=" ")
{
return preg_replace('!^!m',str_repeat($char,$chars),$string);
}
?>

View file

@ -1,26 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty lower modifier plugin
*
* Type: modifier<br>
* Name: lower<br>
* Purpose: convert string to lowercase
* @link http://smarty.php.net/manual/en/language.modifier.lower.php
* lower (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @return string
*/
function smarty_modifier_lower($string)
{
return strtolower($string);
}
?>

View file

@ -0,0 +1,71 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifier
*/
/**
* Smarty wordwrap modifier plugin
* Type: modifier
* Name: mb_wordwrap
* Purpose: Wrap a string to a given number of characters
*
* @link http://php.net/manual/en/function.wordwrap.php for similarity
*
* @param string $str the string to wrap
* @param int $width the width of the output
* @param string $break the character used to break the line
* @param boolean $cut ignored parameter, just for the sake of
*
* @return string wrapped string
* @author Rodney Rehm
*/
function smarty_modifier_mb_wordwrap($str, $width = 75, $break = "\n", $cut = false)
{
// break words into tokens using white space as a delimiter
$tokens = preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE);
$length = 0;
$t = '';
$_previous = false;
$_space = false;
foreach ($tokens as $_token) {
$token_length = mb_strlen($_token, Smarty::$_CHARSET);
$_tokens = array($_token);
if ($token_length > $width) {
if ($cut) {
$_tokens = preg_split(
'!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER,
$_token,
-1,
PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE
);
}
}
foreach ($_tokens as $token) {
$_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token);
$token_length = mb_strlen($token, Smarty::$_CHARSET);
$length += $token_length;
if ($length > $width) {
// remove space before inserted break
if ($_previous) {
$t = mb_substr($t, 0, -1, Smarty::$_CHARSET);
}
if (!$_space) {
// add the break before the token
if (!empty($t)) {
$t .= $break;
}
$length = $token_length;
}
} elseif ($token === "\n") {
// hard break must reset counters
$length = 0;
}
$_previous = $_space;
// add the token
$t .= $token;
}
}
return $t;
}

View file

@ -1,35 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty plugin
*
* Type: modifier<br>
* Name: nl2br<br>
* Date: Feb 26, 2003
* Purpose: convert \r\n, \r or \n to <<br>>
* Input:<br>
* - contents = contents to replace
* - preceed_test = if true, includes preceeding break tags
* in replacement
* Example: {$text|nl2br}
* @link http://smarty.php.net/manual/en/language.modifier.nl2br.php
* nl2br (Smarty online manual)
* @version 1.0
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @return string
*/
function smarty_modifier_nl2br($string)
{
return nl2br($string);
}
/* vim: set expandtab: */
?>

View file

@ -1,48 +1,55 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsModifier
*/
/**
* Smarty regex_replace modifier plugin
*
* Type: modifier<br>
* Name: regex_replace<br>
* Type: modifier
* Name: regex_replace
* Purpose: regular expression search/replace
* @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php
*
* @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php
* regex_replace (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @param string|array
* @param string|array
* @author Monte Ohrt <monte at ohrt dot com>
*
* @param string $string input string
* @param string|array $search regular expression(s) to search for
* @param string|array $replace string(s) that should be replaced
* @param int $limit the maximum number of replacements
*
* @return string
*/
function smarty_modifier_regex_replace($string, $search, $replace)
function smarty_modifier_regex_replace($string, $search, $replace, $limit = -1)
{
if(is_array($search)) {
foreach($search as $idx => $s)
$search[$idx] = _smarty_regex_replace_check($s);
if (is_array($search)) {
foreach ($search as $idx => $s) {
$search[ $idx ] = _smarty_regex_replace_check($s);
}
} else {
$search = _smarty_regex_replace_check($search);
}
return preg_replace($search, $replace, $string);
$search = _smarty_regex_replace_check($search);
}
return preg_replace($search, $replace, $string, $limit);
}
/**
* @param string $search string(s) that should be replaced
*
* @return string
* @ignore
*/
function _smarty_regex_replace_check($search)
{
if (($pos = strpos($search,"\0")) !== false)
$search = substr($search,0,$pos);
if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[1], 'e') !== false)) {
/* remove eval-modifier from $search */
$search = substr($search, 0, -strlen($match[1])) . preg_replace('![e\s]+!', '', $match[1]);
// null-byte injection detection
// anything behind the first null-byte is ignored
if (($pos = strpos($search, "\0")) !== false) {
$search = substr($search, 0, $pos);
}
// remove eval-modifier from $search
if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[ 1 ], 'e') !== false)) {
$search = substr($search, 0, -strlen($match[ 1 ])) . preg_replace('![e\s]+!', '', $match[ 1 ]);
}
return $search;
}
/* vim: set expandtab: */
?>

View file

@ -1,30 +1,37 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsModifier
*/
/**
* Smarty replace modifier plugin
*
* Type: modifier<br>
* Name: replace<br>
* Type: modifier
* Name: replace
* Purpose: simple search/replace
* @link http://smarty.php.net/manual/en/language.modifier.replace.php
* replace (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @param string
* @param string
*
* @link http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @author Uwe Tews
*
* @param string $string input string
* @param string $search text to search for
* @param string $replace replacement text
*
* @return string
*/
function smarty_modifier_replace($string, $search, $replace)
{
static $is_loaded = false;
if (Smarty::$_MBSTRING) {
if (!$is_loaded) {
if (!is_callable('smarty_mb_str_replace')) {
include_once SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php';
}
$is_loaded = true;
}
return smarty_mb_str_replace($search, $replace, $string);
}
return str_replace($search, $replace, $string);
}
/* vim: set expandtab: */
?>

View file

@ -1,30 +1,26 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsModifier
*/
/**
* Smarty spacify modifier plugin
*
* Type: modifier<br>
* Name: spacify<br>
* Type: modifier
* Name: spacify
* Purpose: add spaces between characters in a string
* @link http://smarty.php.net/manual/en/language.modifier.spacify.php
* spacify (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @param string
*
* @link http://smarty.php.net/manual/en/language.modifier.spacify.php spacify (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
*
* @param string $string input string
* @param string $spacify_char string to insert between characters.
*
* @return string
*/
function smarty_modifier_spacify($string, $spacify_char = ' ')
{
return implode($spacify_char,
preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY));
// well… what about charsets besides latin and UTF-8?
return implode($spacify_char, preg_split('//' . Smarty::$_UTF8_MODIFIER, $string, -1, PREG_SPLIT_NO_EMPTY));
}
/* vim: set expandtab: */
?>

View file

@ -1,29 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty string_format modifier plugin
*
* Type: modifier<br>
* Name: string_format<br>
* Purpose: format strings via sprintf
* @link http://smarty.php.net/manual/en/language.modifier.string.format.php
* string_format (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @param string
* @return string
*/
function smarty_modifier_string_format($string, $format)
{
return sprintf($format, $string);
}
/* vim: set expandtab: */
?>

View file

@ -1,33 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty strip modifier plugin
*
* Type: modifier<br>
* Name: strip<br>
* Purpose: Replace all repeated spaces, newlines, tabs
* with a single space or supplied replacement string.<br>
* Example: {$var|strip} {$var|strip:"&nbsp;"}
* Date: September 25th, 2002
* @link http://smarty.php.net/manual/en/language.modifier.strip.php
* strip (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @version 1.0
* @param string
* @param string
* @return string
*/
function smarty_modifier_strip($text, $replace = ' ')
{
return preg_replace('!\s+!', $replace, $text);
}
/* vim: set expandtab: */
?>

View file

@ -1,32 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty strip_tags modifier plugin
*
* Type: modifier<br>
* Name: strip_tags<br>
* Purpose: strip html tags from text
* @link http://smarty.php.net/manual/en/language.modifier.strip.tags.php
* strip_tags (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @param boolean
* @return string
*/
function smarty_modifier_strip_tags($string, $replace_with_space = true)
{
if ($replace_with_space)
return preg_replace('!<[^>]*?>!', ' ', $string);
else
return strip_tags($string);
}
/* vim: set expandtab: */
?>

View file

@ -1,50 +1,62 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* @package Smarty
* @subpackage PluginsModifier
*/
/**
* Smarty truncate modifier plugin
*
* Type: modifier<br>
* Name: truncate<br>
* Type: modifier
* Name: truncate
* Purpose: Truncate a string to a certain length if necessary,
* optionally splitting in the middle of a word, and
* appending the $etc string or inserting $etc into the middle.
* @link http://smarty.php.net/manual/en/language.modifier.truncate.php
* truncate (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @param integer
* @param string
* @param boolean
* @param boolean
* @return string
* optionally splitting in the middle of a word, and
* appending the $etc string or inserting $etc into the middle.
*
* @link http://smarty.php.net/manual/en/language.modifier.truncate.php truncate (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
*
* @param string $string input string
* @param integer $length length of truncated text
* @param string $etc end string
* @param boolean $break_words truncate at word boundary
* @param boolean $middle truncate in the middle of text
*
* @return string truncated string
*/
function smarty_modifier_truncate($string, $length = 80, $etc = '...',
$break_words = false, $middle = false)
function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false)
{
if ($length == 0)
if ($length === 0) {
return '';
if (strlen($string) > $length) {
$length -= min($length, strlen($etc));
if (!$break_words && !$middle) {
$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
}
if (Smarty::$_MBSTRING) {
if (mb_strlen($string, Smarty::$_CHARSET) > $length) {
$length -= min($length, mb_strlen($etc, Smarty::$_CHARSET));
if (!$break_words && !$middle) {
$string = preg_replace(
'/\s+?(\S+)?$/' . Smarty::$_UTF8_MODIFIER,
'',
mb_substr($string, 0, $length + 1, Smarty::$_CHARSET)
);
}
if (!$middle) {
return mb_substr($string, 0, $length, Smarty::$_CHARSET) . $etc;
}
return mb_substr($string, 0, $length / 2, Smarty::$_CHARSET) . $etc .
mb_substr($string, -$length / 2, $length, Smarty::$_CHARSET);
}
if(!$middle) {
return substr($string, 0, $length) . $etc;
} else {
return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
}
} else {
return $string;
}
// no MBString fallback
if (isset($string[ $length ])) {
$length -= min($length, strlen($etc));
if (!$break_words && !$middle) {
$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1));
}
if (!$middle) {
return substr($string, 0, $length) . $etc;
}
return substr($string, 0, $length / 2) . $etc . substr($string, -$length / 2);
}
return $string;
}
/* vim: set expandtab: */
?>

View file

@ -1,26 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty upper modifier plugin
*
* Type: modifier<br>
* Name: upper<br>
* Purpose: convert string to uppercase
* @link http://smarty.php.net/manual/en/language.modifier.upper.php
* upper (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @return string
*/
function smarty_modifier_upper($string)
{
return strtoupper($string);
}
?>

View file

@ -1,29 +0,0 @@
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty wordwrap modifier plugin
*
* Type: modifier<br>
* Name: wordwrap<br>
* Purpose: wrap a string of text at a given length
* @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php
* wordwrap (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @param string
* @param integer
* @param string
* @param boolean
* @return string
*/
function smarty_modifier_wordwrap($string,$length=80,$break="\n",$cut=false)
{
return wordwrap($string,$length,$break,$cut);
}
?>

View file

@ -0,0 +1,28 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty cat modifier plugin
* Type: modifier
* Name: cat
* Date: Feb 24, 2003
* Purpose: catenate a value to a variable
* Input: string to catenate
* Example: {$var|cat:"foo"}
*
* @link http://smarty.php.net/manual/en/language.modifier.cat.php cat
* (Smarty online manual)
* @author Uwe Tews
*
* @param array $params parameters
*
* @return string with compiled code
*/
function smarty_modifiercompiler_cat($params)
{
return '(' . implode(').(', $params) . ')';
}

View file

@ -0,0 +1,32 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty count_characters modifier plugin
* Type: modifier
* Name: count_characters
* Purpose: count the number of characters in a text
*
* @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online
* manual)
* @author Uwe Tews
*
* @param array $params parameters
*
* @return string with compiled code
*/
function smarty_modifiercompiler_count_characters($params)
{
if (!isset($params[ 1 ]) || $params[ 1 ] !== 'true') {
return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[ 0 ] . ', $tmp)';
}
if (Smarty::$_MBSTRING) {
return 'mb_strlen(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
}
// no MBString fallback
return 'strlen(' . $params[ 0 ] . ')';
}

View file

@ -0,0 +1,26 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty count_paragraphs modifier plugin
* Type: modifier
* Name: count_paragraphs
* Purpose: count the number of paragraphs in a text
*
* @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php
* count_paragraphs (Smarty online manual)
* @author Uwe Tews
*
* @param array $params parameters
*
* @return string with compiled code
*/
function smarty_modifiercompiler_count_paragraphs($params)
{
// count \r or \n characters
return '(preg_match_all(\'#[\r\n]+#\', ' . $params[ 0 ] . ', $tmp)+1)';
}

View file

@ -0,0 +1,26 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty count_sentences modifier plugin
* Type: modifier
* Name: count_sentences
* Purpose: count the number of sentences in a text
*
* @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php
* count_sentences (Smarty online manual)
* @author Uwe Tews
*
* @param array $params parameters
*
* @return string with compiled code
*/
function smarty_modifiercompiler_count_sentences($params)
{
// find periods, question marks, exclamation marks with a word before but not after.
return 'preg_match_all("#\w[\.\?\!](\W|$)#S' . Smarty::$_UTF8_MODIFIER . '", ' . $params[ 0 ] . ', $tmp)';
}

View file

@ -0,0 +1,31 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty count_words modifier plugin
* Type: modifier
* Name: count_words
* Purpose: count the number of words in a text
*
* @link http://www.smarty.net/manual/en/language.modifier.count.words.php count_words (Smarty online manual)
* @author Uwe Tews
*
* @param array $params parameters
*
* @return string with compiled code
*/
function smarty_modifiercompiler_count_words($params)
{
if (Smarty::$_MBSTRING) {
// return 'preg_match_all(\'#[\w\pL]+#' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)';
// expression taken from http://de.php.net/manual/en/function.str-word-count.php#85592
return 'preg_match_all(\'/\p{L}[\p{L}\p{Mn}\p{Pd}\\\'\x{2019}]*/' . Smarty::$_UTF8_MODIFIER . '\', ' .
$params[ 0 ] . ', $tmp)';
}
// no MBString fallback
return 'str_word_count(' . $params[ 0 ] . ')';
}

View file

@ -0,0 +1,32 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty default modifier plugin
* Type: modifier
* Name: default
* Purpose: designate default value for empty variables
*
* @link http://www.smarty.net/manual/en/language.modifier.default.php default (Smarty online manual)
* @author Uwe Tews
*
* @param array $params parameters
*
* @return string with compiled code
*/
function smarty_modifiercompiler_default($params)
{
$output = $params[ 0 ];
if (!isset($params[ 1 ])) {
$params[ 1 ] = "''";
}
array_shift($params);
foreach ($params as $param) {
$output = '(($tmp = @' . $output . ')===null||$tmp===\'\' ? ' . $param . ' : $tmp)';
}
return $output;
}

View file

@ -0,0 +1,112 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty escape modifier plugin
* Type: modifier
* Name: escape
* Purpose: escape string for output
*
* @link http://www.smarty.net/docsv2/en/language.modifier.escape count_characters (Smarty online manual)
* @author Rodney Rehm
*
* @param array $params parameters
* @param Smarty_Internal_TemplateCompilerBase $compiler
*
* @return string with compiled code
* @throws \SmartyException
*/
function smarty_modifiercompiler_escape($params, Smarty_Internal_TemplateCompilerBase $compiler)
{
static $_double_encode = null;
static $is_loaded = false;
$compiler->template->_checkPlugins(
array(
array(
'function' => 'smarty_literal_compiler_param',
'file' => SMARTY_PLUGINS_DIR . 'shared.literal_compiler_param.php'
)
)
);
if ($_double_encode === null) {
$_double_encode = version_compare(PHP_VERSION, '5.2.3', '>=');
}
try {
$esc_type = smarty_literal_compiler_param($params, 1, 'html');
$char_set = smarty_literal_compiler_param($params, 2, Smarty::$_CHARSET);
$double_encode = smarty_literal_compiler_param($params, 3, true);
if (!$char_set) {
$char_set = Smarty::$_CHARSET;
}
switch ($esc_type) {
case 'html':
if ($_double_encode) {
return 'htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ', ' .
var_export($double_encode, true) . ')';
} elseif ($double_encode) {
return 'htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ')';
} else {
// fall back to modifier.escape.php
}
// no break
case 'htmlall':
if (Smarty::$_MBSTRING) {
if ($_double_encode) {
// php >=5.2.3 - go native
return 'mb_convert_encoding(htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' .
var_export($char_set, true) . ', ' . var_export($double_encode, true) .
'), "HTML-ENTITIES", ' . var_export($char_set, true) . ')';
} elseif ($double_encode) {
// php <5.2.3 - only handle double encoding
return 'mb_convert_encoding(htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' .
var_export($char_set, true) . '), "HTML-ENTITIES", ' . var_export($char_set, true) . ')';
} else {
// fall back to modifier.escape.php
}
}
// no MBString fallback
if ($_double_encode) {
// php >=5.2.3 - go native
return 'htmlentities(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ', ' .
var_export($double_encode, true) . ')';
} elseif ($double_encode) {
// php <5.2.3 - only handle double encoding
return 'htmlentities(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ')';
} else {
// fall back to modifier.escape.php
}
// no break
case 'url':
return 'rawurlencode(' . $params[ 0 ] . ')';
case 'urlpathinfo':
return 'str_replace("%2F", "/", rawurlencode(' . $params[ 0 ] . '))';
case 'quotes':
// escape unescaped single quotes
return 'preg_replace("%(?<!\\\\\\\\)\'%", "\\\'",' . $params[ 0 ] . ')';
case 'javascript':
// escape quotes and backslashes, newlines, etc.
return 'strtr(' .
$params[ 0 ] .
', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/" ))';
}
} catch (SmartyException $e) {
// pass through to regular plugin fallback
}
// could not optimize |escape call, so fallback to regular plugin
if ($compiler->template->caching && ($compiler->tag_nocache | $compiler->nocache)) {
$compiler->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'file' ] =
SMARTY_PLUGINS_DIR . 'modifier.escape.php';
$compiler->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'function' ] =
'smarty_modifier_escape';
} else {
$compiler->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'file' ] =
SMARTY_PLUGINS_DIR . 'modifier.escape.php';
$compiler->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'function' ] =
'smarty_modifier_escape';
}
return 'smarty_modifier_escape(' . join(', ', $params) . ')';
}

View file

@ -0,0 +1,30 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty from_charset modifier plugin
* Type: modifier
* Name: from_charset
* Purpose: convert character encoding from $charset to internal encoding
*
* @author Rodney Rehm
*
* @param array $params parameters
*
* @return string with compiled code
*/
function smarty_modifiercompiler_from_charset($params)
{
if (!Smarty::$_MBSTRING) {
// FIXME: (rodneyrehm) shouldn't this throw an error?
return $params[ 0 ];
}
if (!isset($params[ 1 ])) {
$params[ 1 ] = '"ISO-8859-1"';
}
return 'mb_convert_encoding(' . $params[ 0 ] . ', "' . addslashes(Smarty::$_CHARSET) . '", ' . $params[ 1 ] . ')';
}

View file

@ -0,0 +1,30 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty indent modifier plugin
* Type: modifier
* Name: indent
* Purpose: indent lines of text
*
* @link http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual)
* @author Uwe Tews
*
* @param array $params parameters
*
* @return string with compiled code
*/
function smarty_modifiercompiler_indent($params)
{
if (!isset($params[ 1 ])) {
$params[ 1 ] = 4;
}
if (!isset($params[ 2 ])) {
$params[ 2 ] = "' '";
}
return 'preg_replace(\'!^!m\',str_repeat(' . $params[ 2 ] . ',' . $params[ 1 ] . '),' . $params[ 0 ] . ')';
}

View file

@ -0,0 +1,29 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty lower modifier plugin
* Type: modifier
* Name: lower
* Purpose: convert string to lowercase
*
* @link http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @author Uwe Tews
*
* @param array $params parameters
*
* @return string with compiled code
*/
function smarty_modifiercompiler_lower($params)
{
if (Smarty::$_MBSTRING) {
return 'mb_strtolower(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
}
// no MBString fallback
return 'strtolower(' . $params[ 0 ] . ')';
}

View file

@ -0,0 +1,20 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty noprint modifier plugin
* Type: modifier
* Name: noprint
* Purpose: return an empty string
*
* @author Uwe Tews
* @return string with compiled code
*/
function smarty_modifiercompiler_noprint()
{
return "''";
}

View file

@ -0,0 +1,24 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty string_format modifier plugin
* Type: modifier
* Name: string_format
* Purpose: format strings via sprintf
*
* @link http://www.smarty.net/manual/en/language.modifier.string.format.php string_format (Smarty online manual)
* @author Uwe Tews
*
* @param array $params parameters
*
* @return string with compiled code
*/
function smarty_modifiercompiler_string_format($params)
{
return 'sprintf(' . $params[ 1 ] . ',' . $params[ 0 ] . ')';
}

View file

@ -0,0 +1,30 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty strip modifier plugin
* Type: modifier
* Name: strip
* Purpose: Replace all repeated spaces, newlines, tabs
* with a single space or supplied replacement string.
* Example: {$var|strip} {$var|strip:"&nbsp;"}
* Date: September 25th, 2002
*
* @link http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual)
* @author Uwe Tews
*
* @param array $params parameters
*
* @return string with compiled code
*/
function smarty_modifiercompiler_strip($params)
{
if (!isset($params[ 1 ])) {
$params[ 1 ] = "' '";
}
return "preg_replace('!\s+!" . Smarty::$_UTF8_MODIFIER . "', {$params[1]},{$params[0]})";
}

View file

@ -0,0 +1,28 @@
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsModifierCompiler
*/
/**
* Smarty strip_tags modifier plugin
* Type: modifier
* Name: strip_tags
* Purpose: strip html tags from text
*
* @link http://www.smarty.net/docs/en/language.modifier.strip.tags.tpl strip_tags (Smarty online manual)
* @author Uwe Tews
*
* @param array $params parameters
*
* @return string with compiled code
*/
function smarty_modifiercompiler_strip_tags($params)
{
if (!isset($params[ 1 ]) || $params[ 1 ] === true || trim($params[ 1 ], '"') === 'true') {
return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})";
} else {
return 'strip_tags(' . $params[ 0 ] . ')';
}
}

Some files were not shown because too many files have changed in this diff Show more