summaryrefslogtreecommitdiff
path: root/tools/inc/lib/jsgettext/JSParser.php
diff options
context:
space:
mode:
authorczaks <marcin@6irc.net>2013-07-02 22:48:43 -0400
committerMichael Foster <savetheinternet@tinyboard.org>2013-07-31 15:57:53 -0400
commit12d1636b405e3dd9a700c504956c74b0ef1f6a46 (patch)
tree87f02e01f901603841ae8b090745d9df189cde5a /tools/inc/lib/jsgettext/JSParser.php
parentde53ca0f8fad4074ab20d2bef463e5adf69ecebd (diff)
tools/inc/lib/jsgettext/: bundle jsgettext library from https://code.google.com/p/jsgettext
Diffstat (limited to 'tools/inc/lib/jsgettext/JSParser.php')
-rw-r--r--tools/inc/lib/jsgettext/JSParser.php94
1 files changed, 94 insertions, 0 deletions
diff --git a/tools/inc/lib/jsgettext/JSParser.php b/tools/inc/lib/jsgettext/JSParser.php
new file mode 100644
index 00000000..f3cec7f7
--- /dev/null
+++ b/tools/inc/lib/jsgettext/JSParser.php
@@ -0,0 +1,94 @@
+<?php
+
+class JSParser {
+
+ protected $content;
+ protected $keywords;
+ protected $regs = array();
+ protected $regsCounter = 0;
+ protected $strings = array();
+ protected $stringsCounter = 0;
+
+ protected function _extractRegs($match) {
+ $this->regs[$this->regsCounter] = $match[1];
+ $id = "<<reg{$this->regsCounter}>>";
+ $this->regsCounter++;
+ return $id;
+ }
+ protected function _extractStrings($match) {
+ $this->strings[$this->stringsCounter] = $this->importRegExps($match[0]);
+ $id = "<<s{$this->stringsCounter}>>";
+ $this->stringsCounter++;
+ return $id;
+ }
+ protected function importRegExps($input) {
+ $regs = $this->regs;
+ return preg_replace_callback("#<<reg(\d+)>>#", function ($match) use($regs) {
+ return $regs[$match[1]];
+ }, $input);
+ }
+
+ protected function importStrings($input) {
+ $strings = $this->strings;
+ return preg_replace_callback("#<<s(\d+)>>#", function ($match) use($strings) {
+ return $strings[$match[1]];
+ }, $input);
+ }
+
+ public function __construct($file, $keywords = '_') {
+ $this->content = file_get_contents($file);
+ $this->keywords = (array)$keywords;
+ }
+
+ public function parse() {
+ $output = htmlspecialchars($this->content, ENT_NOQUOTES);
+
+ // extract reg exps
+ $output = preg_replace_callback(
+ '# ( / (?: (?>[^/\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\/ )+ (?<!\\\\)/ ) [a-z]* \b #ix',
+ array($this, '_extractRegs'), $output
+ );
+
+ // extract strings
+ $output = preg_replace_callback(
+ array(
+ '# " ( (?: (?>[^"\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\" )* ) (?<!\\\\)" #ix',
+ "# ' ( (?: (?>[^'\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\' )* ) (?<!\\\\)' #ix"
+ ), array($this, '_extractStrings'), $output
+ );
+
+ // delete line comments
+ $output = preg_replace("#(//.*?)$#m", '', $output);
+
+ // delete multiline comments
+ $output = preg_replace('#/\*(.*?)\*/#is', '', $output);
+
+ $strings = $this->strings;
+ $output = preg_replace_callback("#<<s(\d+)>>#", function($match) use($strings) {
+ return $strings[$match[1]];
+ }, $output);
+
+ $keywords = implode('|', $this->keywords);
+
+ $strings = array();
+
+ // extract func calls
+ preg_match_all(
+ '# (?:'.$keywords.') \(\\ *" ( (?: (?>[^"\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\" )* ) (?<!\\\\)"\\ *\) #ix',
+ $output, $matches, PREG_SET_ORDER
+ );
+
+ foreach ($matches as $m) $strings[] = stripslashes($m[1]);
+
+ $matches = array();
+ preg_match_all(
+ "# (?:$keywords) \(\\ *' ( (?: (?>[^'\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\' )* ) (?<!\\\\)'\\ *\) #ix",
+ $output, $matches, PREG_SET_ORDER
+ );
+
+ foreach ($matches as $m) $strings[] = stripslashes($m[1]);
+
+ return $strings;
+ }
+}
+?> \ No newline at end of file