Second pass at wiki, history with diffs now present, a=chris

Chris Pollett [2014-05-16 07:May:th]
Second pass at wiki, history with diffs now present, a=chris
Filename
controllers/group_controller.php
css/search.css
lib/archive_bundle_iterators/mediawiki_bundle_iterator.php
lib/centroid.php
lib/processors/html_processor.php
lib/processors/text_processor.php
lib/utility.php
lib/wiki_parser.php
locale/ar/configure.ini
locale/bn/configure.ini
locale/de/configure.ini
locale/en-US/configure.ini
locale/es/configure.ini
locale/fa/configure.ini
locale/fr-FR/configure.ini
locale/he/configure.ini
locale/hi/configure.ini
locale/in-ID/configure.ini
locale/it/configure.ini
locale/it/statistics.txt
locale/ja/configure.ini
locale/kn/configure.ini
locale/ko/configure.ini
locale/pl/configure.ini
locale/pt/configure.ini
locale/ru/configure.ini
locale/te/configure.ini
locale/th/configure.ini
locale/tr/configure.ini
locale/vi-VN/configure.ini
locale/zh-CN/configure.ini
models/group_model.php
views/wiki_view.php
diff --git a/controllers/group_controller.php b/controllers/group_controller.php
index e6b0c82b0..a7f22e2c9 100644
--- a/controllers/group_controller.php
+++ b/controllers/group_controller.php
@@ -37,18 +37,8 @@ if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
 require_once BASE_DIR."/controllers/controller.php";
 /** Loads common constants for web crawling */
 require_once BASE_DIR."/lib/crawl_constants.php";
-/** Need get host for search filter admin */
-require_once BASE_DIR."/lib/url_parser.php";
-/** Used in rule parser test in page options */
-require_once BASE_DIR."/lib/page_rule_parser.php";
-/** Used to create, update, and delete user-trained classifiers. */
-require_once BASE_DIR."/lib/classifiers/classifier.php";
-/** Loads crawl_daemon to manage news_updater */
-require_once BASE_DIR."/lib/crawl_daemon.php";
-/** get processors for different file types */
-foreach(glob(BASE_DIR."/lib/processors/*_processor.php") as $filename) {
-    require_once $filename;
-}
+/** For Wiki Parsing */
+require_once BASE_DIR."/lib/wiki_parser.php";
 /**
  * Controller used to handle admin functionalities such as
  * modify login and password, CREATE, UPDATE,DELETE operations
@@ -225,18 +215,31 @@ class GroupController extends Controller implements CrawlConstants
         $clean_array = array(
             "group_id" => "int",
             "page_name" => "string",
-            "page" => "string"
+            "page" => "string",
+            "filter" => 'string',
+            "limit" => 'int',
+            "num" => 'int',
+            "page_id" => 'int',
+            "show" => 'int',
+            "diff1" => 'int',
+            "diff2" => 'int'
         );
+        $last_care_missing = 3;
         $missing_fields = false;
+        $i = 0;
         foreach($clean_array as $field => $type) {
             if(isset($_REQUEST[$field])) {
                 $$field = $this->clean($_REQUEST[$field], $type);
-            } else {
+            } else if($i < $last_care_missing) {
                 $$field = false;
                 $missing_fields = true;
             }
+            $i++;
+        }
+        if(is_string($page)) {
+                $page = $_REQUEST['page'];
+            $page = str_replace("&#039;", "'", $page);
         }
-        var_dump($page);
         if(isset($_REQUEST['group_id'])) {
             $group_id = $this->clean($_REQUEST['group_id'], "int");

@@ -254,37 +257,146 @@ class GroupController extends Controller implements CrawlConstants
                 ($group["STATUS"] == ACTIVE_STATUS &&
                 $group["MEMBER_ACCESS"] == GROUP_READ_WRITE)) {
                 $data["CAN_EDIT"] = true;
-                if(isset($_REQUEST["arg"])) {
-                    switch($_REQUEST["arg"])
-                    {
-                        case "edit":
-                            $data["MODE"] = "edit";
-                            if($missing_fields && $page) {
-                                $data['SCRIPT'] .=
-                                    "doMessage('<h1 class=\"red\" >".
-                                    tl("group_controller_missing_fields").
-                                    "</h1>')";
-                            } else if(!$missing_fields && $page){
-                                $group_model->setPageName($user_id,
-                                    $group_id, $page_name, $page,
-                                    $locale_tag);
-                            }
-                        break;
+            }
+        }
+        if(isset($_REQUEST["arg"])) {
+            switch($_REQUEST["arg"])
+            {
+                case "edit":
+                    if(!$data["CAN_EDIT"]) { continue; }
+                    $data["MODE"] = "edit";
+                    if($missing_fields && $page) {
+                        $data['SCRIPT'] .=
+                            "doMessage('<h1 class=\" red\" >".
+                            tl("group_controller_missing_fields").
+                            "</h1>')";
+                    } else if(!$missing_fields && $page){
+                        $group_model->setPageName($user_id,
+                            $group_id, $page_name, $page,
+                            $locale_tag);
+                        $data['SCRIPT'] .=
+                            "doMessage('<h1 class=\"red\" >".
+                            tl("group_controller_page_saved").
+                            "</h1>')";
                     }
-                }
+                break;
+                case "history":
+                    if(!$data["CAN_EDIT"] || !$page_id) {
+                        continue;
+                    }
+                    $data["MODE"] = "history";
+                    $data["PAGE_NAME"] = "history";
+                    $limit = isset($limit) ? $limit : 0;
+                    $num = (isset($_SESSION["MAX_PAGES_TO_SHOW"])) ?
+                       $_SESSION["MAX_PAGES_TO_SHOW"] :
+                       DEFAULT_ADMIN_PAGING_NUM;
+                    $default_history = true;
+                    if(isset($show)) {
+                        $page_info = $group_model->getHistoryPage(
+                            $page_id, $show);
+                        if($page_info) {
+                            $data["MODE"] = "show";
+                            $default_history = false;
+                            $data["PAGE_NAME"] = $page_info["PAGE_NAME"];
+                            $parser = new WikiParser();
+                            $parsed_page = $parser->parse($page_info["PAGE"]);
+                            $data["PAGE_ID"] = $page_id;
+                            $data[CSRF_TOKEN] =
+                                $this->generateCSRFToken($user_id);
+                            $history_link = "?c=group&amp;a=wiki&amp;".
+                                CSRF_TOKEN.'='.$data[CSRF_TOKEN].
+                                '&amp;arg=history&amp;page_id='.
+                                $data['PAGE_ID'];
+                            $data["PAGE"] =
+                                "<div>&nbsp;</div>".
+                                "<div class='black-box back-dark-gray'>".
+                                "<div class='float-opposite'>".
+                                "<a href='$history_link'>".
+                                tl("group_controller_back") . "</a></div>".
+                                tl("group_controller_history_page",
+                                $data["PAGE_NAME"], date("r", $show)) .
+                                "</div>" . $parsed_page;
+                            $data["DISCUSS_THREAD"] =
+                                $page_info["DISCUSS_THREAD"];
+                        }
+                    } else if(isset($diff1) && isset($diff2)) {
+                        $page_info1 = $group_model->getHistoryPage(
+                            $page_id, $diff1);
+                        $page_info2 = $group_model->getHistoryPage(
+                            $page_id, $diff2);
+                        $data["MODE"] = "diff";
+                        $default_history = false;
+                        $data["PAGE_NAME"] = $page_info2["PAGE_NAME"];
+                        $data["PAGE_ID"] = $page_id;
+                        $data[CSRF_TOKEN] =
+                            $this->generateCSRFToken($user_id);
+                        $history_link = "?c=group&amp;a=wiki&amp;".
+                            CSRF_TOKEN.'='.$data[CSRF_TOKEN].
+                            '&amp;arg=history&amp;page_id='.
+                            $data['PAGE_ID'];
+                        $out_diff = "--- {$data["PAGE_NAME"]}\t''$diff1''\n";
+                        $out_diff .= "+++ {$data["PAGE_NAME"]}\t''$diff2''\n";
+                        $out_diff .= diff($page_info1["PAGE"],
+                            $page_info2["PAGE"]);
+                        $data["PAGE"] =
+                            "<div>&nbsp;</div>".
+                            "<div class='black-box back-dark-gray'>".
+                            "<div class='float-opposite'>".
+                            "<a href='$history_link'>".
+                            tl("group_controller_back") . "</a></div>".
+                            tl("group_controller_diff_page",
+                            $data["PAGE_NAME"], date("r", $diff1),
+                            date("r", $diff2)) .
+                            "</div>" . "<pre>\n$out_diff\n</pre>\n";
+                    }
+                    if($default_history) {
+                        $data["LIMIT"] = $limit;
+                        $data["RESULTS_PER_PAGE"] = $num;
+                        list($data["TOTAL_ROWS"], $data["HISTORY"]) =
+                            $group_model->getPageHistory($page_id, $limit,
+                            $num);
+                    }
+                    $data['page_id'] = $page_id;
+                break;
+                case "pages":
+                    $data["PAGE_NAME"] = "pages";
+                    $data["MODE"] = "pages";
+                    $limit =isset($limit) ? $limit : 0;
+                    $num = (isset($_SESSION["MAX_PAGES_TO_SHOW"])) ?
+                       $_SESSION["MAX_PAGES_TO_SHOW"] :
+                       DEFAULT_ADMIN_PAGING_NUM;
+                    if(!isset($filter)) {
+                        $filter = "";
+                    }
+                    $data["LIMIT"] = $limit;
+                    $data["RESULTS_PER_PAGE"] = $num;
+                    list($data["TOTAL_ROWS"], $data["PAGES"]) =
+                        $group_model->getPageList(
+                        $group['GROUP_ID'], $locale_tag, $filter, $limit, $num);
+                break;
             }
         }
         if(!$page_name) {
             $page_name = tl('group_controller_main');
         }
         $data["GROUP"] = $group;
-        $data["PAGE_NAME"] = $page_name;
-        $data["PAGE"] = $group_model->getPageByName($group_id, $page_name,
-            $locale_tag, $data["MODE"]);
-        if(!$data["PAGE"] && $locale_tag != DEFAULT_LOCALE) {
-            //fallback to default locale for translation
-            $data["PAGE"] = $group_model->getPageName(
-                $group_id, $page_name, DEFAULT_LOCALE, $data["MODE"]);
+        if(in_array($data["MODE"], array("read", "edit"))) {
+            if(!isset($data["PAGE"]) || !$data['PAGE']) {
+                $data["PAGE_NAME"] = $page_name;
+                $page_info = $group_model->getPageInfoByName($group_id,
+                    $page_name, $locale_tag, $data["MODE"]);
+                $data["PAGE"] = $page_info["PAGE"];
+                $data["PAGE_ID"] = $page_info["ID"];
+                $data["DISCUSS_THREAD"] = $page_info["DISCUSS_THREAD"];
+            }
+            if(!$data["PAGE"] && $locale_tag != DEFAULT_LOCALE) {
+                //fallback to default locale for translation
+                $page_info = $group_model->getPageInfoByName(
+                    $group_id, $page_name, DEFAULT_LOCALE, $data["MODE"]);
+                $data["PAGE"] = $page_info["PAGE"];
+                $data["PAGE_ID"] = $page_info["ID"];
+                $data["DISCUSS_THREAD"] = $page_info["DISCUSS_THREAD"];
+            }
         }
         return $data;
     }
diff --git a/css/search.css b/css/search.css
index 7e7a9f641..a90d55fdd 100755
--- a/css/search.css
+++ b/css/search.css
@@ -62,53 +62,6 @@ p
     color: green;
 }

-.word-cloud-spacer
-{
-    margin-left:1em;
-    font-weight: bold;
-    color : gray;
-}
-
-.word-cloud-1
-{
-    font-size: 16pt;
-    color: #080;
-    text-decoration: none;
-}
-
-.word-cloud-2
-{
-    font-size: 15pt;
-    color: #090;
-    text-decoration: none;
-}
-
-.word-cloud-3
-{
-    font-size: 14pt;
-    color: #0A0;
-    text-decoration: none;
-}
-
-.word-cloud-4
-{
-    font-size: 13pt;
-    color: #0B0;
-    text-decoration: none;
-}
-
-.word-cloud-5
-{
-    font-size: 12pt;
-    color: #0C0;
-    text-decoration: none;
-}
-
-.word-cloud:hover
-{
-    text-decoration: underline;
-}
-
 .hidden
 {
     visibility: hidden;
@@ -565,7 +518,7 @@ body.mobile
     position: absolute;
     text-align: center;
     top: .1in;
-    width: 100%;
+    width: 8.5in;
     z-index: 3;
 }

@@ -856,7 +809,7 @@ ul.in-list li
 }

 .admin-heading,
-.group-heading,
+.group-heading
 {
     position: relative;
     top: 30px;
@@ -874,7 +827,7 @@ ul.in-list li
 .mobile .group-heading
 {
     position: absolute;
-    top: 10 px;
+    top: 10px;
 }
 .mobile .group-heading small
 {
@@ -1227,6 +1180,54 @@ ul.in-list li
     clear: both;
 }

+.word-cloud-spacer
+{
+    margin-left:1em;
+    font-weight: bold;
+    color : gray;
+}
+
+.word-cloud-1
+{
+    font-size: 16pt;
+    color: #080;
+    text-decoration: none;
+}
+
+.word-cloud-2
+{
+    font-size: 15pt;
+    color: #090;
+    text-decoration: none;
+}
+
+.word-cloud-3
+{
+    font-size: 14pt;
+    color: #0A0;
+    text-decoration: none;
+}
+
+.word-cloud-4
+{
+    font-size: 13pt;
+    color: #0B0;
+    text-decoration: none;
+}
+
+.word-cloud-5
+{
+    font-size: 12pt;
+    color: #0C0;
+    text-decoration: none;
+}
+
+.word-cloud:hover
+{
+    text-decoration: underline;
+}
+
+
 .access-result
 {
     box-shadow: 0px 0px 3px 3px #ccc;
@@ -1256,8 +1257,8 @@ ul.in-list li
     font-weight: normal;
 }

-div..button-group-result
- div.group-result
+div.button-group-result,
+div.group-result
 {
     font-size: 12pt;
     width:97%;
diff --git a/lib/archive_bundle_iterators/mediawiki_bundle_iterator.php b/lib/archive_bundle_iterators/mediawiki_bundle_iterator.php
index ae5d9b76d..3509a0bb7 100644
--- a/lib/archive_bundle_iterators/mediawiki_bundle_iterator.php
+++ b/lib/archive_bundle_iterators/mediawiki_bundle_iterator.php
@@ -158,11 +158,11 @@ class MediaWikiArchiveBundleIterator extends TextArchiveBundleIterator
      * Used to initialize the arrays of match/replacements used to format
      * wikimedia syntax into HTML (not perfectly since we are only doing
      * regexes)
+     *
+     * @param string $base_address base url for link substitutions
      */
-    function initializeSubstitutions()
+    function initializeSubstitutions($base_address)
     {
-        $base_address = $this->header['base_address'];
-
         $substitutions = array(
             array('/{{([^}]*)({{([^{}]*)}})/', '{{$1$3' ),
             array('/{{([^}]*)({{([^{}]*)}})/', '{{$1$3' ),
@@ -342,7 +342,7 @@ class MediaWikiArchiveBundleIterator extends TextArchiveBundleIterator
         static $minimal_regexes = false;
         static $first_call = true;
         if($first_call) {
-            $this->initializeSubstitutions();
+            $this->initializeSubstitutions($this->header['base_address']);
         }
         $page_info = $this->getNextTagData("page");
         if($no_process) { return $page_info; }
@@ -697,4 +697,4 @@ function fixLinksCallback($matches)
     return $out;
 }

-?>
\ No newline at end of file
+?>
diff --git a/lib/centroid.php b/lib/centroid_summarizer.php
similarity index 100%
rename from lib/centroid.php
rename to lib/centroid_summarizer.php
diff --git a/lib/processors/html_processor.php b/lib/processors/html_processor.php
index d398b96d3..cf78a9bed 100755
--- a/lib/processors/html_processor.php
+++ b/lib/processors/html_processor.php
@@ -58,7 +58,7 @@ require_once BASE_DIR."/lib/url_parser.php";
 /**
 * Get the centroid summary
 */
-require_once BASE_DIR."/lib/centroid.php";
+require_once BASE_DIR."/lib/centroid_summarizer.php";
 /**
  * For guessing language from charset
  */
diff --git a/lib/processors/text_processor.php b/lib/processors/text_processor.php
index c05e34d67..d2aa4c26c 100755
--- a/lib/processors/text_processor.php
+++ b/lib/processors/text_processor.php
@@ -55,7 +55,7 @@ require_once BASE_DIR."/lib/processors/page_processor.php";
 /**
 * Get the centroid summary
 */
-require_once BASE_DIR."/lib/centroid.php";
+require_once BASE_DIR."/lib/centroid_summarizer.php";

 /**
  * So can extract parts of the URL if need to guess lang
@@ -248,4 +248,4 @@ class TextProcessor extends PageProcessor
     }
 }

-?>
\ No newline at end of file
+?>
diff --git a/lib/utility.php b/lib/utility.php
index 994521ccb..10dbd2157 100755
--- a/lib/utility.php
+++ b/lib/utility.php
@@ -1810,4 +1810,177 @@ function arrayColumnCount($arr, $key_column, $count_column)
     return $out_arr;
 }

-?>
\ No newline at end of file
+/**
+ *  Computes a Unix-style diff of two strings. That is it only
+ *  outputs lines which disagree between the two strings. It outputs +line
+ *  if a line occurs in the second but not first string and -line if a
+ *  line occurs in the first string but not the second.
+ *
+ *  @param string $data1 first string to compare
+ *  @param string $data2 second string to compare
+ */
+function diff($data1, $data2)
+{
+    $lines1 = explode("\n", $data1);
+    $lines2 = explode("\n", $data2);
+    $num_lines1 = count($lines1);
+    $num_lines2 = count($lines2);
+    $shorter_len = min($num_lines1, $num_lines2);
+    $longer_len = max($num_lines1, $num_lines2);
+    $first_diff = 0;
+    // trim off the starts and end lines of the strings that are same
+    $head_lcs = array();
+    while($first_diff < $shorter_len &&
+        $lines1[$first_diff] == $lines2[$first_diff]) {
+        $head_lcs[] = array($first_diff, $first_diff, $lines1[$first_diff]);
+        $first_diff++;
+    }
+    if($first_diff == $shorter_len) {
+        if($num_lines1 == $num_lines2) {
+            return "";
+        } else {
+            $tmp = $lines1;
+            $prefix = "-";
+            if($num_lines1 == $shorter_len) {
+                $tmp = $lines2;
+                $prefix = "+";
+            }
+            $out = "@@ -$shorter_len,0 +$shorter_len,$out_len @@\n";
+            for($i = $shorter_len; $i < $longer_len; $i++) {
+                $out .= $prefix . $tmp[$i]."\n";
+            }
+            return $out;
+        }
+    }
+    $last_diff = 0;
+    $tail_lcs = array();
+    $index1 = $num_lines1 - 1 - $last_diff;
+    $index2 = $num_lines2 - 1 - $last_diff;
+    while($shorter_len - $last_diff > $first_diff &&
+        $lines1[$index1] == $lines2[$index2]) {
+        array_unshift($tail_lcs, array($index1, $index2, $lines1[$index1]));
+        $last_diff++;
+        $index1--;
+        $index2--;
+    }
+    $trim_lines1 = array_slice($lines1, $first_diff, -$last_diff);
+    $trim_lines2 = array_slice($lines2, $first_diff, -$last_diff);
+    /*  To compute a diff, we first compute the
+        LCS = Longest common subsequence of the two string.
+     */
+    $lcs = computeLCS($trim_lines1, $trim_lines2, $first_diff);
+    $lcs = array_merge($head_lcs, $lcs, $tail_lcs);
+
+    $previous_first = -1;
+    $previous_second = -1;
+    $old_line = "";
+    $out_string = "";
+    foreach($lcs as $lcs_item) {
+        list($current_first, $current_second, $line) = $lcs_item;
+        $gap1 = $current_first - $previous_first;
+        $gap2 = $current_second - $previous_second;
+        if($gap1 > 1 || $gap2 > 1) {
+            $gap1++;
+            $gap2++;
+            $out_string .= "@@ -$previous_first,$gap1 ".
+                " +$previous_second,$gap2 @@\n";
+            $out_string .= " ".$old_line."\n";
+            for($i = $previous_first + 1; $i < $current_first; $i++) {
+                $out_string .= "-" . $lines1[$i] . "\n";
+            }
+            for($i = $previous_second + 1; $i < $current_second; $i++) {
+                $out_string .= "+" . $lines2[$i] . "\n";
+            }
+            $out_string .= " ".$line."\n";
+        }
+        $previous_first = $current_first;
+        $previous_second = $current_second;
+        $old_line = $line;
+    }
+    if($lcs == array()) {
+        $out_string .= "@@ -0,$num_lines1 ".
+            " +0,$num_lines2 @@\n";
+        for($i = 0; $i < $num_lines1; $i++) {
+            $out_string .= "-" . $lines1[$i] . "\n";
+        }
+        for($i = 0; $i < $num_lines2; $i++) {
+            $out_string .= "+" . $lines2[$i] . "\n";
+        }
+    }
+    return $out_string;
+}
+
+/**
+ *  Computes the longest common subsequence of two arrays
+ *
+ *  @param array $lines1 an array of lines to compute LCS of
+ *  @param array $lines2 an array of lines to compute LCS of
+ *  @param int $offset an offset to shift over array addresses in output by
+ */
+function computeLCS($lines1, $lines2, $offset = 0)
+{
+    /*
+        add a dummy line so don't have to worry about
+        shifting indices in CLRS pseudo-code implementation
+    */
+    $num_lines1 = count($lines1);
+    $num_lines2 = count($lines2);
+    array_unshift($lines1, 0);
+    array_unshift($lines2, 0);
+    /*
+        LCS = Longest common subsequence of the two string.
+        The code below is based off the pseudo-code in CLRS
+     */
+    $lcs_moves = array();
+    $lcs_values = array();
+    for($i = 1; $i <= $num_lines1; $i++) { //initialize first column
+        $lcs_values[$i][0] = 0;
+    }
+    for($j = 0; $j <= $num_lines2; $j++) { //initialize first column
+        $lcs_values[0][$j] = 0;
+    }
+    $lcs_moves = array();
+    for($i = 1; $i <= $num_lines1; $i++) {
+        for($j = 1; $j <= $num_lines2; $j++) {
+            if($lines1[$i] == $lines2[$j]) {
+                  $lcs_values[$i][$j] = $lcs_values[$i - 1][$j - 1] + 1;
+                  $lcs_moves[$i][$j] = "d"; //diagonal
+            } elseif ($lcs_values[$i - 1][$j] >= $lcs_values[$i][$j - 1]) {
+                $lcs_values[$i][$j] = $lcs_values[$i - 1][$j];
+                $lcs_moves[$i][$j] = "u"; // up
+            } else {
+                $lcs_values[$i][$j] = $lcs_values[$i][$j - 1];
+                $lcs_moves[$i][$j] = "l"; // left
+            }
+        }
+    }
+    $lcs = array();
+    extractLCSFromTable($lcs_moves, $lines1, $num_lines1, $num_lines2,
+        $offset, $lcs);
+    return $lcs;
+}
+/**
+ *
+ *  @param array $lcs_moves
+ *  @param int $i
+ *  @param int $j
+ *  @param int $offset an offset to shift over array addresses in output by
+ *  @param array &$lcs
+ */
+function extractLCSFromTable($lcs_moves, $lines, $i, $j, $offset, &$lcs)
+{
+    if($i == 0 || $j == 0) {
+        return array();
+    }
+    if($lcs_moves[$i][$j] == "d") { //diagonal moves means common to both
+        //sub-case first so forward order
+        extractLCSFromTable($lcs_moves, $lines, $i - 1, $j - 1, $offset, $lcs);
+        $lcs[] = array($i + $offset- 1, $j + $offset - 1, $lines[$i]);
+    } elseif($lcs_moves[$i][$j] == "u") { // up move in matrix
+        extractLCSFromTable($lcs_moves, $lines, $i - 1, $j, $offset, $lcs);
+    } else { // left move in matrix
+        extractLCSFromTable($lcs_moves, $lines, $i, $j - 1, $offset, $lcs);
+    }
+}
+
+?>
diff --git a/lib/wiki_parser.php b/lib/wiki_parser.php
new file mode 100644
index 000000000..7b9722164
--- /dev/null
+++ b/lib/wiki_parser.php
@@ -0,0 +1,474 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2014  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  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 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  END LICENSE
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @package seek_quarry
+ * @subpackage library
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2014
+ * @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/** Used to load common constants among crawl components */
+require_once BASE_DIR."/lib/crawl_constants.php";
+
+/**
+ *
+ * @author Chris Pollett
+ *
+ * @package seek_quarry
+ * @subpackage library
+ */
+
+class WikiParser implements CrawlConstants
+{
+    /**
+     * Used to initialize the arrays of match/replacements used to format
+     * wikimedia syntax into HTML (not perfectly since we are only doing
+     * regexes)
+     *
+     * @param string $base_address base url for link substitutions
+     */
+    function __construct($base_address = "")
+    {
+        $substitutions = array(
+            array('/(\A|\n)=\s*([^=]+)\s*=/',
+                "\n<h1 id='$2'>$2</h1><hr />"),
+            array('/(\A|\n)==\s*([^=]+)\s*==/',
+                "\n<h2 id='$2'>$2</h2><hr />"),
+            array('/(\A|\n)===\s*([^=]+)\s*===/',
+                "\n<h3 id='$2'>$2</h3>"),
+            array('/(\A|\n)====\s*([^=]+)\s*====/',
+                "\n<h4 id='$2'>$2</h4>"),
+            array('/(\A|\n)=====\s*([^=]+)\s*=====/',
+                "\n<h5 id='$2'>$2</h5>"),
+            array('/(\A|\n)======\s*([^=]+)\s*======/',
+                "\n<h6 id='$2'>$2</h6>"),
+            array("/{{Main\s*\|(.+?)(\|.+)?}}/i",
+                "<div class='indent'>(<a href=\"".
+                $base_address."$1\">$1</a>)</div>"),
+            array("/{{See also\s*\|(.+?)(\|.+)?}}/i",
+                "<div class='indent'>(<a href=\"".
+                $base_address."$1\">$1</a>)</div>"),
+            array("/{{See\s*\|(.+?)(\|.+)?}}/i",
+                "<div class='indent'>(<a href=\"".
+                $base_address."$1\">$1</a>)</div>"),
+            array("/{{\s*Related articles\s*\|(.+?)\|(.+?)}}/si",
+                "<div class='indent'>(<a href=\"".
+                $base_address . "$1\">$1?</a>)</div>"),
+            array('/\[\[([^\[\]]+?)\|([^\[\]]+?)\]\]/s',
+                "<a href=\"{$base_address}$1\">$2</a>"),
+            array('/\[\[([^\[\]]+?)\]\]/s',
+                "<a href=\"{$base_address}$1\">$1</a>"),
+            array("/\[(http[^\s\]]+)\s+(.+?)\]/s",
+                "[<a href=\"$1\">$2</a>]"),
+            array("/\[(http[^\]\s]+)\s*\]/","(<a href=\"$1\">&rarr;</a>)"),
+            array("/'''''(.+?)'''''/s", "<b><i>$1</i></b>"),
+            array("/'''(.+?)'''/s", "<b>$1</b>"),
+            array("/''(.+?)''/s", "<i>$1</i>"),
+            array('/{{center\|(.+?)}}/s', "<div class='center'>$1</div>"),
+            array('/{{left\|(.+?)}}/s', "<div class='align-left'>$1</div>"),
+            array('/{{right\|(.+?)}}/s', "<div class='align-right'>$1</div>"),
+            array('/{{smallcaps\|(.+?)}}/s', "<small>$1</small>"),
+            array('/{{Hatnote\|(.+?)}}/si', "($1)"),
+            array("/{{fraction\|(.+?)\|(.+?)}}/si", "<small>$1/$2</small>"),
+            array("/{{lang[\||\-](.+?)\|(.+?)}}/si", "$1 &rarr; $2"),
+            array("/{{convert\|(.+?)\|(.+?)\|(.+?)}}/si", "$1$2"),
+            array("/{{IPA-(.+?)\|(.+?)}}/si", "(IPA $2)"),
+            array('/(\A|\n)\*(.+)(\n|\Z)/', "\n<li>$2</li>\n"),
+            array('/(\A|\n)\*(.+)(\n|\Z)/', "\n<li>$2</li>\n"),
+            array('/(\A|[^>])\n<li>/', "$1\n<ul>\n<li>"),
+            array('@</li>\n(\Z|[^<])@', "</li>\n</ul>\n$1"),
+            array('@</li>\n<li>\*@', "\n**"),
+            array('/\n\*\*(.+?)(\n|\Z)/s', "\n<li>$1</li>\n"),
+            array('/\n\*\*(.+?)(\n|\Z)/s', "\n<li>$1</li>\n"),
+            array('/([^>])\n<li>/', "$1\n<ul>\n<li>"),
+            array('@</li></li>@', "</li>\n</ul>\n</li>"),
+            array('/(\A|\n)\#(.+?)(\n|\Z)/s', "\n<li>$2</li>\n"),
+            array('/(\A|\n)\#(.+?)(\n|\Z)/s', "\n<li>$2</li>\n"),
+            array('/(\A|[^>])\n<li>/', "$1\n<ol>\n<li>"),
+            array('@</li>\n(\Z|[^<])@',
+                "</li>\n</ol>\n$1"),
+            array('@</li>\n<li>\#@', "\n##"),
+            array('/\n\#\#(.+?)(\n|\Z)/s', "\n<li>$1</li>\n"),
+            array('/\n\#\#(.+?)(\n|\Z)/s', "\n<li>$1</li>\n"),
+            array('/([^>])\n<li>/', "$1\n<ol>\n<li>"),
+            array('@</li></li>@', "</li>\n</ol>\n</li>"),
+            array('@</li>\n<li>\*@', "\n**"),
+            array('/\n\*\*(.+?)(\n|\Z)/s', "\n<li>$1</li>\n"),
+            array('/\n\*\*(.+?)(\n|\Z)/s', "\n<li>$1</li>\n"),
+            array('/([^>])\n<li>/', "$1\n<ul>\n<li>"),
+            array('@</li></li>@', "</li>\n</ul>\n</li>"),
+            array('@</li>\n<li>\#@', "\n##"),
+            array('/\n\#\#(.+?)(\n|\Z)/s', "\n<li>$1</li>\n"),
+            array('/\n\#\#(.+?)(\n|\Z)/s', "\n<li>$1</li>\n"),
+            array('/([^>])\n<li>/', "$1\n<ol>\n<li>"),
+            array('@</li></li>@', "</li>\n</ol>\n</li>"),
+            array('/(\A|\n);([^:]+):([^\n]+)/',
+                "<dl><dt>$2</dt>\n<dd>$3</dd></dl>\n"),
+            array('/(\A|\n)----/', "$1<hr />"),
+            array('/\r/', ""),
+        );
+
+        $this->matches = array();
+        $this->replaces = array();
+        $this->base_address = $base_address;
+        foreach($substitutions as $substitution) {
+            list($this->matches[], $this->replaces[]) = $substitution;
+        }
+    }
+
+
+    /**
+     *
+     */
+    function parse($document)
+    {
+        $toc = $this->makeTableOfContents($document);
+        list($document, $references) = $this->makeReferences($document);
+        $document = preg_replace_callback('/(\A|\n){\|(.*?)\n\|}/s',
+            "makeTableCallback", $document);
+        if(strlen($document) < PAGE_RANGE_REQUEST) {
+            $document = substr($document, 0, PAGE_RANGE_REQUEST);
+        }
+        $document = preg_replace($this->matches, $this->replaces, $document);
+        $document = preg_replace_callback("/((href=)\"([^\"]+)\")/",
+            "fixLinksCallback", $document);
+        $doc_parts = preg_split("/\n\n+/", $document);
+        $document = "";
+        $space_like = array(" ", "\t");
+        foreach($doc_parts as $part) {
+            if(trim($part) == "") {
+                continue;
+            }
+            $start = substr($part, 0, 2);
+            if(in_array($start[0], $space_like)) {
+                $document .= "\n<pre>\n".ltrim($part)."\n</pre>\n";
+            } else if($start == ": " || $start == ":\t") {
+                $document .= "\n<div class='indent'>\n".substr($part, 2).
+                    "\n</div>\n";
+            } else {
+                $document .= "\n<div>\n".$part. "\n</div>\n";
+            }
+        }
+        $document = $this->insertReferences($document, $references);
+        $document = $this->insertTableOfContents($document, $toc);
+        return $document;
+    }
+
+    /**
+     * Used to make a table of contents for a wiki page based on the
+     * level two headings on that page.
+     *
+     *  @param string $page a wiki document
+     *  @return string HTML table of contents to be inserted after wiki
+     *      page processed
+     */
+    function makeTableOfContents($page)
+    {
+        $toc= "";
+        $matches = array();
+        $min_sections_for_toc = 4;
+        preg_match_all('/(\A|\n)==\s*([^=]+)\s*==/', $page, $matches);
+        if(isset($matches[2]) && count($matches[2]) >= $min_sections_for_toc) {
+            $toc .= "<div style='border: 1px ridge #000; width:280px;".
+                "background-color:#EEF; padding: 3px; margin:6px;'><ol>\n";
+            foreach($matches[2] as $section) {
+                $toc .= "<li><a href='#".addslashes($section)."'>".
+                    $section."</a></li>\n";
+            }
+            $toc .= "</ol></div>\n";
+        }
+        return $toc;
+    }
+
+    /**
+     * Used to make a reference list for a wiki page based on the
+     * cite tags on that page.
+     *
+     *  @param string $page a wiki document
+     *  @return string HTML reference list to be inserted after wiki
+     *      page processed
+     */
+    function makeReferences($page)
+    {
+        $base_address = $this->base_address;
+        $references= "\n";
+        $matches = array();
+        preg_match_all('/{{v?cite(.+?)}}/si', $page, $matches);
+        citeCallback(NULL, 1);
+        $page = preg_replace_callback('/{{v?cite?a?t?i?o?n?(.+?)}}/si',
+            "citeCallback", $page);
+        if(isset($matches[1])) {
+            $i = 1;
+            $wiki_fields = array("title", "publisher", "author", "journal",
+                "book", "quote");
+            foreach($matches[1] as $reference) {
+                $ref_parts = explode("|", $reference);
+                $references .= "<div id=\"ref_$i\">$i.".
+                    "<a href=\"#cite_$i\">^</a>.";
+                crawlTimeoutLog("..Making wiki references outer..");
+                if(count($ref_parts) > 0) {
+                    $ref_data = array();
+                    $type = trim(strtolower($ref_parts[0]));
+                    array_shift($ref_parts);
+                    foreach($ref_parts as $part) {
+                        crawlTimeoutLog("..Making wiki references inner..");
+                        $part_parts = explode("=", $part);
+                        if(isset($part_parts[1])){
+                            $field = strtolower(trim($part_parts[0]));
+                            $value = trim($part_parts[1]);
+                            if(in_array($field, $wiki_fields)) {
+                                $value = preg_replace($this->matches,
+                                    $this->replaces, $value);
+                                $value = strip_tags($value,
+                                    '<a><b><i><span><img>');
+                            }
+                            $ref_data[$field] = $value;
+                        }
+                    }
+                    if(!isset($ref_data['author']) && isset($ref_data['last'])
+                        && isset($ref_data['first'])) {
+                        $ref_data['author'] = $ref_data['last'].", ".
+                            $ref_data['first'];
+                    }
+                    if(isset($ref_data['authorlink']) ) {
+                        if(!isset($ref_data['author'])) {
+                            $ref_data['author'] = $ref_data['authorlink'];
+                        }
+                        $ref_data['author'] = "<a href=\"$base_address".
+                            $ref_data['author']."\">{$ref_data['author']}</a>";
+                    }
+                    if(!isset($ref_data['title']) && isset($ref_data['url'])) {
+                        $ref_data['title'] = $ref_data['url'];
+                    }
+                    if(isset($ref_data['title']) && isset($ref_data['url'])) {
+                        $ref_data['title'] = "<a href=\"{$ref_data['url']}\">".
+                            "{$ref_data['title']}</a>";
+                    }
+                    if(isset($ref_data['quote'])) {
+                        $references .= '"'.$ref_data['quote'].'". ';
+                    }
+                    if(isset($ref_data['author'])) {
+                        $references .= $ref_data['author'].". ";
+                    }
+                    if(isset($ref_data['title'])) {
+                        $references .= '"'.$ref_data['title'].'". ';
+                    }
+
+                    if(isset($ref_data['accessdate']) &&
+                        !isset($ref_data['archivedate'])) {
+                        $references .= '('.$ref_data['accessdate'].') ';
+                    }
+                    if(isset($ref_data['archivedate'])) {
+                        if(isset($ref_data['archiveurl'])) {
+                            $ref_data['archivedate'] = "<a href=\"".
+                                $ref_data['archiveurl']."\">".
+                                $ref_data['archivedate']."</a>";
+                        }
+                        $references .= '('.$ref_data['archivedate'].') ';
+                    }
+                    if(isset($ref_data['journal'])) {
+                         $references .= "<i>{$ref_data['journal']}</i> ";
+                    }
+                    if(isset($ref_data['location'])) {
+                         $references .= $ref_data['location'].". ";
+                    }
+                    if(isset($ref_data['publisher'])) {
+                         $references .= $ref_data['publisher'].". ";
+                    }
+                    if(isset($ref_data['doi'])) {
+                         $references .= "doi:".$ref_data['doi'].". ";
+                    }
+                    if(isset($ref_data['isbn'])) {
+                         $references .= "ISBN:".$ref_data['isbn'].". ";
+                    }
+                    if(isset($ref_data['jstor'])) {
+                         $references .= "JSTOR:".$ref_data['jstor'].". ";
+                    }
+                    if(isset($ref_data['oclc'])) {
+                         $references .= "OCLC:".$ref_data['oclc'].". ";
+                    }
+                    if(isset($ref_data['volume'])) {
+                         $references .= "<b>".$ref_data['volume'].
+                            "</b> ";
+                    }
+                    if(isset($ref_data['issue'])) {
+                         $references .= "#".$ref_data['issue'].". ";
+                    }
+                    if(isset($ref_data['date'])) {
+                         $references .= $ref_data['date'].". ";
+                    }
+                    if(isset($ref_data['year'])) {
+                         $references .= $ref_data['year'].". ";
+                    }
+                    if(isset($ref_data['page'])) {
+                         $references .= "p.".$ref_data['page'].". ";
+                    }
+                    if(isset($ref_data['pages'])) {
+                         $references .= "pp.".$ref_data['pages'].". ";
+                    }
+                }
+                $references .="</div>\n";
+                $i++;
+            }
+        }
+        return array($page, $references);
+    }
+
+    /**
+     *  After regex processing has been done on a wiki page this function
+     *  inserts into the resulting page a table of contents just before
+     *  the first h2 tag, then returns the result page
+     *
+     *  @param string $page page in which to insert table of contents
+     *  @param string $toc HTML table of contents
+     *  @return string resulting page after insert
+     */
+    function insertTableOfContents($page, $toc)
+    {
+        $pos = strpos($page, "<h2");
+        if($pos !== false) {
+            $start = substr($page, 0, $pos);
+            $end = substr($page, $pos);
+            $page = $start . $toc. $end;
+        }
+        return $page;
+    }
+
+    /**
+     *  After regex processing has been done on a wiki page this function
+     *  inserts into the resulting page a reference at
+     *  {{reflist locations, then returns the result page
+     *
+     *  @param string $page page in which to insert the reference lists
+     *  @param string $toc HTML table of contents
+     *  @return string resulting page after insert
+     */
+    function insertReferences($page, $references)
+    {
+        $page = preg_replace('/{{reflist(.+?)}}/si', $references, $page);
+
+        return $page;
+    }
+
+}
+
+/**
+ * Callback used by a preg_replace_callback in nextPage to make a table
+ * @param array $matches of table cells
+ */
+function makeTableCallback($matches)
+{
+    $table = str_replace("\n!","\n|#",$matches[2]);
+    $table = str_replace("!!","\n||#",$table);
+    $row_data = explode("|", $table);
+    $first = true;
+    $out = $matches[1];
+    $state = "";
+    $type = "td";
+    $old_type = "td";
+    foreach($row_data as $item) {
+        crawlTimeoutLog("..Making Wiki Tables..");
+        if($first) {
+            $item = trim(str_replace("\n", " ", $item));
+            $out .= "<table $item>\n<tr>";
+            $first = false;
+            $old_line = true;
+            continue;
+        }
+        if($item == "" || $item[0] == "-") {
+            if($out[strlen($out) - 2] != "r") {
+                $out .= "</$old_type>";
+            }
+            $out .= "</tr>\n<tr>";
+            continue;
+        }
+
+        if($item[0] == "+") {
+            $type= "caption";
+            $old_type = $type;
+            $item = substr($item, 1);
+        }
+        if($item[0] == "#") {
+            $type= "th";
+            $old_type = $type;
+            $item = substr($item, 1);
+        }
+        $trim_item = trim($item);
+        $start = substr($trim_item, 0, 5);
+        if($start == "align" || $start== "colsp" ||$start == "style" ||
+            $start == "scope" ||  $start== "rowsp"|| $start == "valig") {
+            $old_type = $type;
+            $state = str_replace("\n", " ", $trim_item);
+            continue;
+        }
+        if($out[strlen($out) - 2] != "r") {
+            $out .= "</$old_type>";
+        }
+        $out .= "<$type $state>\n$trim_item";
+        $state = "";
+        $old_type = $type;
+        $type = "td";
+    }
+    $out .= "</$old_type></tr></table>";
+    return $out;
+}
+
+/**
+ * Used to convert {{cite }} to a numbered link to a citation
+ *
+ * @param array $matches from regular expression to check for {{cite }}
+ * @param int init used to initialize counter for citations
+ * @return string a HTML link to citation in current document
+ */
+function citeCallback($matches, $init = -1)
+{
+    static $ref_count = 1;
+    if($init != -1) {
+        $ref_count = $init;
+        return "";
+    }
+    $out = "<sup>(<a id=\"cite_$ref_count\" ".
+        "href=\"#ref_$ref_count\">$ref_count</a>)</sup>";
+    $ref_count++;
+    return $out;
+}
+
+/**
+ * Used to changes spaces to underscores in links generated from our earlier
+ * matching rules
+ *
+ * @param array $matches from regular expression to check for links
+ * @return string result of correcting link
+ */
+function fixLinksCallback($matches)
+{
+    $out = $matches[2].'"'.str_replace(" ", "_", $matches[3]).'"';
+    return $out;
+}
+?>
diff --git a/locale/ar/configure.ini b/locale/ar/configure.ini
index ce56d3649..f2bc92f69 100755
--- a/locale/ar/configure.ini
+++ b/locale/ar/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = "تمرير الاختيار."
 ; system_component.php line: 1041
 system_component_using_local_config = "استخدام configs/local_config.php حتى تغيير دليل العمل أعلاه قد لا تعمل."
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = "العودة إلى يوب"
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = "خروج السيارات في دقيقة واحدة!!"
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = "خروج السيارات في دقيقة واحدة!!"
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/bn/configure.ini b/locale/bn/configure.ini
index 28bdf4b9e..873838014 100755
--- a/locale/bn/configure.ini
+++ b/locale/bn/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = ""
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/de/configure.ini b/locale/de/configure.ini
index b62464cba..8f0675bad 100755
--- a/locale/de/configure.ini
+++ b/locale/de/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = ""
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/en-US/configure.ini b/locale/en-US/configure.ini
index 4d977db6e..8e9ad087e 100755
--- a/locale/en-US/configure.ini
+++ b/locale/en-US/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = "Check Passed."
 ; system_component.php line: 1041
 system_component_using_local_config = "Using configs/local_config.php so changing work directory above may not work."
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = "Missing Fields!"
+;
+; group_controller.php line: 276
+group_controller_page_saved = "Page Saved!"
+;
+; group_controller.php line: 304
+group_controller_back = "Back"
+;
+; group_controller.php line: 306
+group_controller_history_page = "Historical Version of %s from %s."
+;
+; group_controller.php line: 336
 group_controller_main = "Main"
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = "Return to Yioop"
 ; view.php line: 36
 view_locale_version4 = "Version 4"
 ;
-; wiki_view.php line: 75
-wiki_view_read = "Read"
-;
-; wiki_view.php line: 77
-wiki_view_edit = "Edit"
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = "Read"
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = "Edit"
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = "Pages"
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = "Feed"
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = "Wiki"
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = "Auto-logout in One Minute!!"
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = "%s page does not exist."
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = "You can create this page by clicking on the edit link above."
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = "Or you can use the form below to create or edit a different page."
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = "Submit"
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = "%s page does not exist."
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = "If you have sufficient access you might be able to create the page by logging in and navigating back here."
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = "%s page does not exist."
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = "Auto-logout in One Minute!!"
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = "History"
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = "Discuss"
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = "Locale: %s"
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = "Page: %s"
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = "Save"
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = "Cur"
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = "Next"
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = "Cur"
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = "Next"
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = "Edited by %s. "
+;
+; wiki_view.php line: 310
+wiki_view_page_len = "(%s bytes)."
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/es/configure.ini b/locale/es/configure.ini
index bf96e686e..218648a6a 100755
--- a/locale/es/configure.ini
+++ b/locale/es/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = "Entrada Aprobada"
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = ""
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = "Auto-cerrar la sesi&oacute;n en un minuto!"
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = "Auto-cerrar la sesi&oacute;n en un minuto!"
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/fa/configure.ini b/locale/fa/configure.ini
index 44e232555..fa5980749 100755
--- a/locale/fa/configure.ini
+++ b/locale/fa/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = "در بررسی مشکلی پیدا نشد."
 ; system_component.php line: 1041
 system_component_using_local_config = "از configs/local_config.php استفاده می&zwnj;شود، بنابراین ممکن است تغییر بالا عمل نکند."
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = "بازگشت به Yioop"
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = "خروج خودکار تا یک دقیقهٔ دیگر!!"
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = "خروج خودکار تا یک دقیقهٔ دیگر!!"
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/fr-FR/configure.ini b/locale/fr-FR/configure.ini
index 911ae49ec..16d4427bf 100755
--- a/locale/fr-FR/configure.ini
+++ b/locale/fr-FR/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = "Retourner &agrave; Yioop"
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/he/configure.ini b/locale/he/configure.ini
index ff1e8e43d..48719da4e 100755
--- a/locale/he/configure.ini
+++ b/locale/he/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = ""
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/hi/configure.ini b/locale/hi/configure.ini
index 73bb1cce5..f9b87c540 100755
--- a/locale/hi/configure.ini
+++ b/locale/hi/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = "वापस Yioop! पर"
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/in-ID/configure.ini b/locale/in-ID/configure.ini
index a5e321be7..bca055fd5 100755
--- a/locale/in-ID/configure.ini
+++ b/locale/in-ID/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = ""
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/it/configure.ini b/locale/it/configure.ini
index 3f1c0fd75..226586079 100755
--- a/locale/it/configure.ini
+++ b/locale/it/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = "Controllo passato."
 ; system_component.php line: 1041
 system_component_using_local_config = "Usando configs/local_config.php la Cartella di Lavoro sopra potrebbe non funzionare."
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = "Ritorna a Yioop"
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = "Fine Accesso in un minuto!!"
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = "Fine Accesso in un minuto!!"
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/it/statistics.txt b/locale/it/statistics.txt
index 67f539ecf..b9615e5f1 100755
--- a/locale/it/statistics.txt
+++ b/locale/it/statistics.txt
@@ -1 +1 @@
-d:39;
\ No newline at end of file
+d:38;
\ No newline at end of file
diff --git a/locale/ja/configure.ini b/locale/ja/configure.ini
index 7cae87d71..c616c2293 100755
--- a/locale/ja/configure.ini
+++ b/locale/ja/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = "ウィオップ!に戻る"
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = "自動なログアウト一分ぐらい"
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = "自動なログアウト一分ぐらい"
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/kn/configure.ini b/locale/kn/configure.ini
index cfc8ac05a..caf31f498 100755
--- a/locale/kn/configure.ini
+++ b/locale/kn/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = "ಪರಿಶೀಲನೆ ತೇರ್ಗಡೆ
 ; system_component.php line: 1041
 system_component_using_local_config = "configs/local_config.php ಉಪಯೋಗದಲ್ಲಿದೆ, ಅದರಿಂದ ಮೇಲಿನ ಕಾರ್ಯ ನಿರ್ದೇಶಿಕೆಯನ್ನು ಬದಲಾವಣೆ ನಿಷ್ಕ್ರಿಯವಾಗಬಹುದು "
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = "ಯೂಪ್&#039;ಗೆ ಮರಳಿರಿ"
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/ko/configure.ini b/locale/ko/configure.ini
index 948dae1c3..d10589e51 100755
--- a/locale/ko/configure.ini
+++ b/locale/ko/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = "Yioop 으로 돌아가기"
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = "1 분내에 자동 로그 아웃 됍니다."
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = "1 분내에 자동 로그 아웃 됍니다."
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/pl/configure.ini b/locale/pl/configure.ini
index 7a2337c02..f67797ad8 100755
--- a/locale/pl/configure.ini
+++ b/locale/pl/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = ""
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/pt/configure.ini b/locale/pt/configure.ini
index 90226670a..38a78644b 100755
--- a/locale/pt/configure.ini
+++ b/locale/pt/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = ""
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/ru/configure.ini b/locale/ru/configure.ini
index 19eabb28e..d249d3695 100755
--- a/locale/ru/configure.ini
+++ b/locale/ru/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = ""
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/te/configure.ini b/locale/te/configure.ini
index 00485cd01..089cdd696 100755
--- a/locale/te/configure.ini
+++ b/locale/te/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = ""
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/th/configure.ini b/locale/th/configure.ini
index ba5ce01c0..4b6eb2a83 100755
--- a/locale/th/configure.ini
+++ b/locale/th/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = ""
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/tr/configure.ini b/locale/tr/configure.ini
index 75da8e8de..561a073b5 100755
--- a/locale/tr/configure.ini
+++ b/locale/tr/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = ""
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = ""
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/vi-VN/configure.ini b/locale/vi-VN/configure.ini
index b5ba0e8f4..46fbe0e4d 100755
--- a/locale/vi-VN/configure.ini
+++ b/locale/vi-VN/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = "Kiểm tra được th&ocirc;ng qua"
 ; system_component.php line: 1041
 system_component_using_local_config = ""
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = "Trở lại trang Yioop"
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = "Tự động tho&aacute;t trong một ph&uacute;t"
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = "Tự động tho&aacute;t trong một ph&uacute;t"
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/locale/zh-CN/configure.ini b/locale/zh-CN/configure.ini
index dd4d5b94a..1709c010b 100755
--- a/locale/zh-CN/configure.ini
+++ b/locale/zh-CN/configure.ini
@@ -1011,7 +1011,19 @@ system_component_check_passed = "通過檢查"
 ; system_component.php line: 1041
 system_component_using_local_config = "使用當地語言"
 ;
-; group_controller.php line: 246
+; group_controller.php line: 268
+group_controller_missing_fields = ""
+;
+; group_controller.php line: 276
+group_controller_page_saved = ""
+;
+; group_controller.php line: 304
+group_controller_back = ""
+;
+; group_controller.php line: 306
+group_controller_history_page = ""
+;
+; group_controller.php line: 336
 group_controller_main = ""
 ;
 ; machine_controller.php line: 174
@@ -3249,66 +3261,78 @@ signin_view_return_yioop = "回到首頁"
 ; view.php line: 36
 view_locale_version4 = ""
 ;
-; wiki_view.php line: 75
-wiki_view_read = ""
-;
-; wiki_view.php line: 77
-wiki_view_edit = ""
-;
-; wiki_view.php line: 81
+; wiki_view.php line: 74
 wiki_view_read = ""
 ;
-; wiki_view.php line: 85
+; wiki_view.php line: 75
 wiki_view_edit = ""
 ;
-; wiki_view.php line: 91
+; wiki_view.php line: 78
 wiki_view_pages = ""
 ;
-; wiki_view.php line: 102
+; wiki_view.php line: 103
 wiki_view_feed = ""
 ;
-; wiki_view.php line: 103
+; wiki_view.php line: 104
 wiki_view_wiki = ""
 ;
-; wiki_view.php line: 116
+; wiki_view.php line: 139
+adminview_auto_logout_one_minute = ""
+;
+; wiki_view.php line: 168
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 118
+; wiki_view.php line: 170
 wiki_view_create_edit = ""
 ;
-; wiki_view.php line: 119
+; wiki_view.php line: 171
 wiki_view_use_form_below = ""
 ;
-; wiki_view.php line: 131
+; wiki_view.php line: 183
 wiki_element_submit = ""
 ;
-; wiki_view.php line: 135
+; wiki_view.php line: 187
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 137
+; wiki_view.php line: 189
 wiki_view_signin_edit = ""
 ;
-; wiki_view.php line: 139
+; wiki_view.php line: 191
 wiki_view_page_no_exist = ""
 ;
-; wiki_view.php line: 156
-adminview_auto_logout_one_minute = ""
-;
-; wiki_view.php line: 187
+; wiki_view.php line: 210
 wiki_element_history = ""
 ;
-; wiki_view.php line: 190
+; wiki_view.php line: 214
 wiki_element_discuss = ""
 ;
-; wiki_view.php line: 206
+; wiki_view.php line: 228
 wiki_element_locale_name = ""
 ;
-; wiki_view.php line: 210
+; wiki_view.php line: 232
 wiki_element_page = ""
 ;
-; wiki_view.php line: 217
+; wiki_view.php line: 240
 wiki_element_savebutton = ""
 ;
+; wiki_view.php line: 294
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 295
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 300
+wiki_view_diff_current = ""
+;
+; wiki_view.php line: 303
+wiki_view_diff_next = ""
+;
+; wiki_view.php line: 309
+wiki_view_edited_by = ""
+;
+; wiki_view.php line: 310
+wiki_view_page_len = ""
+;
 ; /Applications/MAMP/htdocs/git/yioop//lib/indexing_plugins
 ;
 ; wordfilter_plugin.php line: 307
diff --git a/models/group_model.php b/models/group_model.php
index 95b6a73a6..851b641db 100644
--- a/models/group_model.php
+++ b/models/group_model.php
@@ -36,6 +36,9 @@ if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
 require_once BASE_DIR."/models/model.php";
 /** For crawlHash function */
 require_once BASE_DIR."/lib/utility.php";
+/** For formatting wiki */
+require_once BASE_DIR."/lib/wiki_parser.php";
+
 /**
  * This is class is used to handle
  * db results related to Group Administration. Groups are collections of
@@ -327,7 +330,9 @@ class GroupModel extends Model
         $db->execute($sql, $params);
         $sql = "DELETE FROM GROUP_ITEM WHERE GROUP_ID=?";
         $db->execute($sql, $params);
-        $sql = "DELETE FROM USER_GROUP WHERE GROUP_ID=?";
+        $sql = "DELETE FROM GROUP_PAGE WHERE GROUP_ID=?";
+        $db->execute($sql, $params);
+        $sql = "DELETE FROM GROUP_PAGE_HISTORY WHERE GROUP_ID=?";
         $db->execute($sql, $params);
     }

@@ -740,16 +745,18 @@ class GroupModel extends Model
     {
         $db = $this->db;
         $pubdate = time();
+        $parser = new WikiParser();
+        $parsed_page = $parser->parse($page);
         if($page_id = $this->getPageID($group_id, $page_name, $locale_tag)) {
             $sql = "UPDATE GROUP_PAGE SET PAGE=? WHERE ID = ?";
-            $result = $db->execute($sql, array($page, $page_id));
+            $result = $db->execute($sql, array($parsed_page, $page_id));
         } else {
             $discuss_thread = $this->addGroupItem(0, $group_id, $user_id,
                 "++".$page_name, "++".$page_name." ".date("r", $pubdate));
             $sql = "INSERT INTO GROUP_PAGE (DISCUSS_THREAD, GROUP_ID,
                 TITLE, PAGE, LOCALE_TAG) VALUES (?, ?, ?, ?, ?)";
             $result = $db->execute($sql, array($discuss_thread, $group_id,
-                $page_name, $page, $locale_tag));
+                $page_name, $parsed_page, $locale_tag));
             $page_id = $db->insertID("GROUP_PAGE");
         }

@@ -771,7 +778,6 @@ class GroupModel extends Model
         $sql = "SELECT ID FROM GROUP_PAGE WHERE GROUP_ID = ?
             AND TITLE=? AND LOCALE_TAG= ?";
         $result = $db->execute($sql, array($group_id, $page_name, $locale_tag));
-        echo "hi";
         if(!$result) { return false; }
         $row = $db->fetchArray($result);
         if($row) {
@@ -787,26 +793,127 @@ class GroupModel extends Model
      *  @param string $locale_tag
      *  @param string mode
      */
-    function getPageByName($group_id, $name, $locale_tag, $mode)
+    function getPageInfoByName($group_id, $name, $locale_tag, $mode)
     {
         $db = $this->db;
         if($mode == "edit") {
-            $sql = "SELECT HP.PAGE AS PAGE FROM GROUP_PAGE GP,
+            $sql = "SELECT HP.PAGE_ID AS ID, HP.PAGE AS PAGE,
+                GP.DISCUSS_THREAD AS DISCUSS_THREAD FROM GROUP_PAGE GP,
                 GROUP_PAGE_HISTORY HP WHERE GP.GROUP_ID = ?
                 AND GP.TITLE=? AND GP.LOCALE_TAG= ? AND HP.PAGE_ID=GP.ID
                 ORDER BY HP.PUBDATE DESC ".$db->limitOffset(0, 1);
         } else {
-            $sql = "SELECT PAGE FROM GROUP_PAGE WHERE GROUP_ID = ?
-                AND TITLE=? AND LOCALE_TAG= ?";
+            $sql = "SELECT ID, PAGE, DISCUSS_THREAD FROM GROUP_PAGE
+                WHERE GROUP_ID = ? AND TITLE=? AND LOCALE_TAG= ?";
         }
         $result = $db->execute($sql, array($group_id, $name, $locale_tag));
         if(!$result) { return false; }
         $row = $db->fetchArray($result);
+        if(!$row) {
+            return false;
+        }
+        return $row;
+    }
+
+    /**
+     *
+     *  @param int $page_id
+     *  @param int $pubdate
+     */
+    function getHistoryPage($page_id, $pubdate)
+    {
+        $db = $this->db;
+        $sql = "SELECT HP.PAGE_ID AS ID, HP.PAGE AS PAGE, HP.TITLE AS PAGE_NAME,
+            GP.DISCUSS_THREAD AS DISCUSS_THREAD FROM GROUP_PAGE GP,
+            GROUP_PAGE_HISTORY HP WHERE HP.PAGE_ID = ?
+            AND HP.PUBDATE=? AND HP.PAGE_ID=GP.ID";
+        $result = $db->execute($sql, array($page_id, $pubdate));
+        if(!$result) { return false; }
+        $row = $db->fetchArray($result);
         if(!isset($row["PAGE"])) {
             return false;
         }
-        return $row["PAGE"];
+        return $row;
+    }
+    /**
+     *
+     *  @param int $page_id
+     *  @param string $limit
+     *  @param string $num
+     */
+    function getPageHistory($page_id, $limit, $num)
+    {
+        $db = $this->db;
+        $sql = "SELECT COUNT(*) AS TOTAL FROM GROUP_PAGE_HISTORY H, USERS U
+            WHERE H.PAGE_ID = ? AND
+            U.USER_ID= H.EDITOR_ID";
+        $result = $db->execute($sql, array($page_id));
+        if($result) {
+            $row = $db->fetchArray($result);
+            $total = ($row) ? $row["TOTAL"] : 0;
+        }
+        $pages = array();
+        if($total > 0) {
+            $sql = "SELECT H.PUBDATE AS PUBDATE, U.USER_NAME AS USER_NAME,
+                LENGTH(H.PAGE) AS PAGE_LEN FROM GROUP_PAGE_HISTORY H, USERS U
+                WHERE H.PAGE_ID = ? AND
+                U.USER_ID= H.EDITOR_ID ORDER BY PUBDATE DESC ".
+                $db->limitOffset($limit, $num);
+            $result = $db->execute($sql, array($page_id));
+            $i = 0;
+            if($result) {
+                while($pages[$i] = $db->fetchArray($result)) {
+                    $i++;
+                }
+                unset($pages[$i]); //last one will be null
+            }
+        }
+        return array($total, $pages);
     }

+    /**
+     *
+     *  @param int $group_id
+     *  @param string $locale_tag
+     *  @param string $filter
+     *  @param string $limit
+     *  @param string $num
+     */
+    function getPageList($group_id, $locale_tag, $filter, $limit, $num)
+    {
+        $db = $this->db;
+        $filter_parts = preg_split("/\s+/", $filter);
+        $like = "";
+        foreach($filter_parts as $part) {
+            $part = trim(mb_strtoupper($db->escapeString($part)));
+            if($part != "") {
+                $like .= " AND UPPER(TITLE) LIKE %$part% ";
+            }
+        }
+        $sql = "SELECT COUNT(*) AS TOTAL
+            FROM GROUP_PAGE WHERE GROUP_ID = ? AND
+            LOCALE_TAG= ? $like";
+        $result = $db->execute($sql, array($group_id, $locale_tag));
+        if($result) {
+            $row = $db->fetchArray($result);
+            $total = ($row) ? $row["TOTAL"] : 0;
+        }
+        $pages = array();
+        if($total > 0) {
+            $sql = "SELECT TITLE, SUBSTR(PAGE,0, 100) AS DESCRIPTION
+                FROM GROUP_PAGE WHERE GROUP_ID = ? AND
+                LOCALE_TAG= ? $like ORDER BY TITLE ASC ".
+                $db->limitOffset($limit, $num);
+            $result = $db->execute($sql, array($group_id, $locale_tag));
+            $i = 0;
+            if($result) {
+                while($pages[$i] = $db->fetchArray($result)) {
+                    $i++;
+                }
+                unset($pages[$i]); //last one will be null
+            }
+        }
+        return array($total, $pages);
+    }
 }
 ?>
diff --git a/views/wiki_view.php b/views/wiki_view.php
index 2724c944f..781d28bae 100644
--- a/views/wiki_view.php
+++ b/views/wiki_view.php
@@ -69,27 +69,28 @@ class WikiView extends View
         <div class="subsearch">
         <ul class="out-list">
         <?php
+        $modes = array();
         if($can_edit) {
-            if($data["MODE"] == "edit") {
-                ?><li class="outer"><a href="<?php e($base_query .
-                    '&amp;arg=read&amp;a=wiki');
-                    ?>"><?php e(tl('wiki_view_read'));
-                ?></a></li>
-                <li class="outer"><b><?php e(tl('wiki_view_edit'));
-                    ?></b></li>
-            <?php
+            $modes = array(
+                "read" => tl('wiki_view_read'),
+                "edit" => tl('wiki_view_edit')
+            );
+        }
+        $modes["pages"] = tl('wiki_view_pages');
+        foreach($modes as $name => $translation) {
+            if($data["MODE"] == $name) { ?>
+                <li class="outer"><b><?php e($translation); ?></b></li>
+                <?php
             } else {
-                ?><li class="outer"><b><?php e(tl('wiki_view_read'));
-                ?></b></li>
+                ?>
                 <li class="outer"><a href="<?php e($base_query .
-                    '&amp;arg=edit&amp;a=wiki');
-                    ?>"><?php e(tl('wiki_view_edit'));
-                ?></a></li>
-            <?php
+                    '&amp;arg='.$name.'&amp;a=wiki&amp;page_name='.
+                    $data['PAGE_NAME']); ?>"><?php
+                    e($translation); ?></a></li>
+                <?php
             }
         }
         ?>
-        <li class="outer"><a href=""><?php e(tl('wiki_view_pages'));?></a></li>
         </ul>
         </div>
         <?php
@@ -105,45 +106,27 @@ class WikiView extends View
             ?></small>
         </h1>
         <?php
-        if($data["MODE"] == "edit") {
-            $this->renderEditPageForm($data);
-        } else {
-            ?>
-            <div class="small-margin-current-activity">
-            <?php
-            if($data["PAGE"]) {
-                e($data["PAGE"]);
-            } else if($can_edit) {
-                e("<h2>".tl("wiki_view_page_no_exist", $data["PAGE_NAME"]).
-                    "</h2>");
-                e("<p>".tl("wiki_view_create_edit")."</p>");
-                e("<p>".tl("wiki_view_use_form_below")."</p>");?>
-                <form id="editpageForm" method="get" action='#'>
-                <input type="hidden" name="c" value="group" />
-                <input type="hidden" name="<?php e(CSRF_TOKEN); ?>" value="<?php
-                    e($data[CSRF_TOKEN]); ?>" />
-                <input type="hidden" name="a" value="wiki" />
-                <input type="hidden" name="arg" value="edit" />
-                <input type="hidden" name="group_id" value="<?php
-                    e($data['GROUP']['GROUP_ID']); ?>" />
-                <input type="text" name="page_name" class="narrow-field"
-                    value="" />
-                <button class="button-box" type="submit"><?php
-                    e(tl('wiki_element_submit')); ?></button>
-                </form>
-                <?php
-            } else if(!$logged_in) {
-                e("<h2>".tl("wiki_view_page_no_exist", $data["PAGE_NAME"]).
-                    "</h2>");
-                e("<p>".tl("wiki_view_signin_edit")."</p>");
-            } else {
-                e("<h2>".tl("wiki_view_page_no_exist", $data["PAGE_NAME"]).
-                    "</h2>");
-            }
-            ?>
-            </div>
-            <?php
+        switch($data["MODE"])
+        {
+            case "edit":
+                $this->renderEditPageForm($data);
+            break;
+
+            case "pages":
+                $this->renderPages($data);
+            break;
+
+            case "history":
+                $this->renderHistory($data);
+            break;
+
+            case "show":
+            case "read":
+            default:
+                $this->renderReadPage($data, $can_edit, $logged_in);
+            break;
         }
+
         if($logged_in) {
         ?>
         <script type="text/javascript">
@@ -175,6 +158,45 @@ class WikiView extends View
         }
     }

+    function renderReadPage($data, $can_edit, $logged_in)
+    {
+        ?>
+        <div class="small-margin-current-activity">
+        <?php
+        if($data["PAGE"]) {
+            e($data["PAGE"]);
+        } else if($can_edit) {
+            e("<h2>".tl("wiki_view_page_no_exist", $data["PAGE_NAME"]).
+                "</h2>");
+            e("<p>".tl("wiki_view_create_edit")."</p>");
+            e("<p>".tl("wiki_view_use_form_below")."</p>");?>
+            <form id="editpageForm" method="get" action='#'>
+            <input type="hidden" name="c" value="group" />
+            <input type="hidden" name="<?php e(CSRF_TOKEN); ?>" value="<?php
+                e($data[CSRF_TOKEN]); ?>" />
+            <input type="hidden" name="a" value="wiki" />
+            <input type="hidden" name="arg" value="edit" />
+            <input type="hidden" name="group_id" value="<?php
+                e($data['GROUP']['GROUP_ID']); ?>" />
+            <input type="text" name="page_name" class="narrow-field"
+                value="" />
+            <button class="button-box" type="submit"><?php
+                e(tl('wiki_element_submit')); ?></button>
+            </form>
+            <?php
+        } else if(!$logged_in) {
+            e("<h2>".tl("wiki_view_page_no_exist", $data["PAGE_NAME"]).
+                "</h2>");
+            e("<p>".tl("wiki_view_signin_edit")."</p>");
+        } else {
+            e("<h2>".tl("wiki_view_page_no_exist", $data["PAGE_NAME"]).
+                "</h2>");
+        }
+        ?>
+        </div>
+        <?php
+    }
+
     /**
      *
      */
@@ -184,11 +206,13 @@ class WikiView extends View
         <div class="small-margin-current-activity">
         <div class="float-opposite">
         [<a href="?c=group&amp;a=wiki&amp;<?php
-            e(CSRF_TOKEN."=".$data[CSRF_TOKEN]) ?>&amp;arg=history"
+            e(CSRF_TOKEN.'='.$data[CSRF_TOKEN].'&amp;arg=history&amp;'.
+            'page_id='.$data['PAGE_ID']); ?>"
         ><?php e(tl('wiki_element_history'))?></a>]
-        [<a href="?c=group&amp;a=wiki&amp;<?php
-            e(CSRF_TOKEN."=".$data[CSRF_TOKEN]) ?>&amp;arg=discuss"
-        ><?php e(tl('wiki_element_discuss'))?></a>]
+        [<a href="?c=group&amp;a=groupFeeds&amp;<?php
+            e(CSRF_TOKEN.'='.$data[CSRF_TOKEN].
+            '&amp;just_thread='.$data['DISCUSS_THREAD']);?>" ><?php
+            e(tl('wiki_element_discuss'))?></a>]
         </div>
         <form id="editpageForm" method="post" action='#'>
             <input type="hidden" name="c" value="group" />
@@ -207,7 +231,8 @@ class WikiView extends View
                 ?></b><br />
                 <label for="page-data"><b><?php
                 e(tl('wiki_element_page', $data['PAGE_NAME']));
-                ?></b></label></div>
+                ?></b></label>
+            </div>
             <textarea class="tall-text-area" name="page" ><?php
                 e($data['PAGE']);
             ?></textarea>
@@ -215,8 +240,94 @@ class WikiView extends View
             <button class="button-box" type="submit"><?php
                 e(tl('wiki_element_savebutton')); ?></button>
             </div>
+        </form>
+        </div>
+        <?php
+    }
+
+    /**
+     *
+     */
+    function renderPages($data)
+    {
+        ?>
+        <div class="small-margin-current-activity">
+        <?php
+        $base_query = "?c=group&amp;".CSRF_TOKEN."=".
+            $data[CSRF_TOKEN] . "&amp;group_id=".
+                $data["GROUP"]["GROUP_ID"]."&amp;a=wiki&amp;arg=read";
+        $paging_query = "?c=group&amp;".CSRF_TOKEN."=".
+            $data[CSRF_TOKEN] . "&amp;group_id=".
+                $data["GROUP"]["GROUP_ID"]."&amp;a=wiki&amp;arg=pages";
+        foreach($data['PAGES'] as $page) {
+            ?>
+            <div class='group-result'>
+            <a href="<?php e($base_query.'&amp;page_name='.
+                $page['TITLE']);?>" ><?php e($page["TITLE"]); ?></a></br />
+            <?php e(strip_tags($page["DESCRIPTION"])."..."); ?>
             </div>
+            <div>&nbsp;</div>
             <?php
+        }
+        $this->helper("pagination")->render(
+            $paging_query,
+            $data['LIMIT'], $data['RESULTS_PER_PAGE'], $data['TOTAL_ROWS']);
+        ?>
+        </div>
+        <?php
+    }
+
+    /**
+     *
+     */
+    function renderHistory($data)
+    {
+        ?>
+        <div class="small-margin-current-activity">
+        <?php
+        $time = time();
+        $feed_helper = $this->helper("feeds");
+        $base_query = "?c=group&amp;".CSRF_TOKEN."=".
+            $data[CSRF_TOKEN] . "&amp;group_id=".
+                $data["GROUP"]["GROUP_ID"]."&amp;a=wiki&amp;arg=history&amp;".
+                "page_id=".$data["page_id"];
+        $current = $data['HISTORY'][0]["PUBDATE"];
+        $first = true;
+        foreach($data['HISTORY'] as $item) {
+            ?>
+            <div class='group-result'>
+            <?php
+            if($first && $data['LIMIT'] == 0) { ?>
+                (<b><?php e(tl("wiki_view_diff_current"));
+                    ?></b>| <b><?php e(tl("wiki_view_diff_next")); ?></b>)
+                <?php
+            } else { ?>
+                (<a href="<?php e($base_query.'&amp;diff2='.
+                    $current."&amp;diff1=".$item['PUBDATE']);?>" ><?php
+                    e(tl("wiki_view_diff_current"));
+                    ?></a> | <a href="<?php e($base_query.'&amp;diff2='.
+                    $next."&amp;diff1=".$item['PUBDATE']);?>" ><?php
+                    e(tl("wiki_view_diff_next"));
+                    ?></a>)
+                <?php
+            }
+            e("<a href='$base_query&show={$item['PUBDATE']}'>".
+                date("r", $item["PUBDATE"])."</a>. ");
+            e(tl("wiki_view_edited_by", $item["USER_NAME"]));
+            e(tl("wiki_view_page_len", $item["PAGE_LEN"]));
+            $first = false;
+            $next = $item['PUBDATE'];
+            ?>
+            </div>
+            <div>&nbsp;</div>
+            <?php
+        }
+        $this->helper("pagination")->render(
+            $base_query,
+            $data['LIMIT'], $data['RESULTS_PER_PAGE'], $data['TOTAL_ROWS']);
+        ?>
+        </div>
+        <?php
     }
 }
 ?>
ViewGit