forked from moodle/moodle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
filter.php
180 lines (159 loc) · 6.94 KB
/
filter.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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
<?php
///////////////////////////////////////////////////////////////////////////
// //
// This program is part of Moodle - Modular Object-Oriented Dynamic //
// Learning Environment - http://moodle.com //
// //
// $Id$ //
// //
// Copyright (C) 2004 Gaëtan Frenoy <gaetan à frenoy.net> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation; either version 2 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details: //
// //
// http://www.gnu.org/copyleft/gpl.html //
// //
///////////////////////////////////////////////////////////////////////////
// //
// To activate this filter, add a line like this to your //
// list of filters in your Filter configuration: //
// //
// filter/multilang/filter.php //
// //
// See README.txt for more information about this module //
// //
///////////////////////////////////////////////////////////////////////////
/// Given XML multilinguage text, return relevant text according to
/// current language. i.e.=
/// - look for lang sections in the code.
/// - if there exists texts in the currently active language, print them.
/// - else, if there exists texts in the current parent language, print them.
/// - else, if there are English texts, print them
/// - else, print everything.
///
/// $text is raw unmodified user text
function multilang_filter($courseid, $text) {
global $CFG;
/// Make sure XML is enabled in this PHP
if (!function_exists('xml_parser_create')) {
return $text;
}
/// Do a quick check using stripos to avoid unnecessary work
if (stripos($text, '<lang') === false) {
return $text;
}
/// Flag this text as something not to cache
$CFG->currenttextiscacheable = false;
/// Get current language
$currentlanguage = current_language();
/// Strip all spaces between tags
$text = eregi_replace(">"."[[:space:]]+"."<","><", $text);
$text = eregi_replace("&", "&", $text);
/// Parse XML multilingual file
$xml = new XMLParser($text);
$text = $xml->texts['en'];
foreach ($xml->texts as $lang => $lang_text) {
if ($lang == $currentlanguage) $text = $lang_text;
}
return $text;
}
/// XML Parser for Multilingual text
/// Search for "<LANG>" tags and stores inner xml into $this->texts[lang]
///
class XMLParser {
/// Currently parsed language
var $current_lang = NULL;
/// Currently parsed format
var $current_format = NULL;
/// Currently parsed text
var $current_text = NULL;
/// List of parsed texts so far
var $texts = NULL;
/// Constructor
function XMLParser($data) {
/// Init member variables
$this->current_lang = NULL;
$this->current_format = NULL;
$this->current_text = '';
$this->texts = array();
/// Default text for default language is input data
$this->texts['en'] = $data;
/// Create parser
$xml_parser = xml_parser_create();
xml_set_object($xml_parser, &$this);
xml_set_element_handler($xml_parser, 'startElement', 'endElement');
xml_set_character_data_handler($xml_parser, 'characterData');
/// Parse date (embed data around dummy tag so parser will receive
/// a complete XML document
if (!xml_parse($xml_parser, '<moodle_xml_text_20040116>'.$data.'</moodle_xml_text_20040116>', true))
{
/*
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
*/
}
/// Free resource
xml_parser_free($xml_parser);
}
/// Callback on start of an XML element
function startElement($parser, $tag, $attributeList) {
if ($tag == 'LANG' && is_null($this->current_lang))
{
// <LANG> tag found, initialise current member vars
// default language is 'en'
$this->current_lang = array_key_exists("LANG", $attributeList)?strtolower($attributeList['LANG']):'en';
// default format is 'auto'
$this->current_format = array_key_exists('FORMAT', $attributeList)?strtolower($attributeList['FORMAT']):'auto';
// init inner xml
$this->current_text = '';
}
elseif (!is_null($this->current_lang))
{
// If a language has been found already, process tag and attributes
// and add it to inner xml for current language
$this->current_text .= "<{$tag}";
foreach ($attributeList as $key => $val) {
$this->current_text .= " {$key}=\"{$val}\"";
}
$this->current_text .= ">";
}
else {
// This code is outside any <LANG> tag, text is probably not
// a valid multilingual format
}
}
/// Callback on end of an XML element
function endElement($parser, $tag) {
if ($tag == 'LANG' && !is_null($this->current_lang)) {
// <LANG> tag found while <LANG> tag was already open,
// store inner xml and reset context
$this->texts[$this->current_lang] = $this->current_text;
$this->current_text = '';
$this->current_lang = NULL;
$this->current_format = NULL;
}
elseif (!is_null($this->current_lang)) {
// If a language has been found already, process tag
// and add it to inner xml for current language
$this->current_text .= "</{$tag}>";
}
else {
// This code is outside any <LANG> tag, text is probably not
// a valid multilingual format
}
}
/// Callback on character data
function characterData($parser, $data) {
// Process inner text and add it to current inner xml
$this->current_text .= $data;
}
}
?>