-
Notifications
You must be signed in to change notification settings - Fork 0
/
fftxt.php
131 lines (93 loc) · 2.72 KB
/
fftxt.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?php
/**
* Created by IDEA.
* User: guigouz
* Date: Sep 22, 2010
* Time: 1:06:55 PM
* To change this template use File | Settings | File Templates.
*/
// global vars
$_handlers = array();
// bultin handlers
register_handler('dump', 'handler_dump');
register_handler('csv', 'handler_csv');
// external handlers
include dirname(__FILE__)."/fftxt.xls.php";
/**
* Registers a handler for a certain source type
* @param $type String A string representing the type
* @param $callback String A callback that will receive the query
* @return Boolean TRUE when ok, exception if handler is already registered
*/
function register_handler($type, $callback) {
global $_handlers;
if (isset($_handlers[$type])) {
throw new Exception("Handler already registered for $type");
}
if (!is_callable($callback)) {
throw new Exception("Invalid callback $callback for $type");
}
$_handlers[$type] = $callback;
}
function call_handler($type, $args) {
global $_handlers;
if (!isset($_handlers[$type])) {
throw new Exception("No handler defined for $type");
}
return call_user_func($_handlers[$type], $args);
}
function parse($src) {
$pattern = '/^([^:]+):(.+)$/';
if (preg_match($pattern, $src, $matches)) {
// this currently loads all data into memory and returns it
// it would be better if we had some kind of cursor (handlers may be objects)
return call_handler($matches[1], $matches[2]);
}
else {
throw new Exception("Invalid source format: $src");
}
}
function render($data, $template = null, $map = array()) {
$tr = array('\n' => "\n", '\t' => "\t");
// preprocess data if it's an array
if (is_array($data)) {
foreach ($data as $key => $value) {
$tr["\$$key"] = $value;
if (isset($map[$key])) {
$tr["\${$map[$key]}"] = $value;
}
}
}
else {
$tr['$data'] = $data;
}
// TODO special templates, like 'json', 'dump', etc
if ($template) {
if (is_readable($template)) {
// TODO cache!
$template = file_get_contents($template);
}
return strtr($template, $tr);
//return utf8_encode(strtr($template, $tr));
}
else {
return print_r($data, true);
}
}
function handler_dump($args) {
//cho $args;
return array(split(',', $args));
}
function handler_csv($args) {
if (!is_readable($args)) {
throw new Exception("$args is not readable");
}
$fp = fopen($args, 'r');
$return = array();
// TODO make delimiter and enclosure configurable
while ($row = fgetcsv($fp)) {
$return[] = $row;
}
return $return;
}
?>