view models/extractapp.php @ 104:e542b161d907 extractapp

bug fixed: for only lowercase accepted in html tag.
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Fri, 05 Aug 2016 13:34:55 +0200
parents 6ba742b712b0
children 025530e37dcd
line wrap: on
line source

<?php
/*
 * extractapp.php
 * This file is part of Extraction-interface.
 *
 * Extraction-interface 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.
 *
 * Extraction-interface 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 Extraction-interface.  If not, see <http://www.gnu.org/licenses/>.
*/
/** 
 * ExtractappModel class is extended from the BaseModel class.
 * This is where we implement the functions/models to prepare data that been sent to views.
 * ExtractappModel is notified by Extractapp controller when there has been a change in its state,
 * and produces the output/data to the corresponding view in "views/Extractapp/". 
 * 
*/

class ExtractappModel extends BaseModel{
    
    protected $section_id = 0, $data_path, $file_id = 0, $current_fileId=0, 
        $branch_id = 0, $user_id = 0, $lg_text = "", $topic, $taglist_infile = "", 
        $book_meta = "", $book_dynasty = "";

    public $messages = array('info'=>"",'error'=>"",'warning'=>"",'debug'=>"");


    public function SetTextFromFileId() {   // remove $_postdata as input
        /**
         * Get text content from LGService by $this->file_id. 
         * After preprocessing the text string (replace space to circle symbol, link for page number, etc),
         * set $this->lg_text to the processed text gotten from LGService.
         */

        /*
        $this->file_id = $_postdata['fileId'];
        $branch_id = $_postdata['branchId'];
        $section_id = $_postdata['sectionId'];

        $this->branch_id = $branch_id;
        $this->user_id = $_postdata['userId'];
        $this->section_id = $section_id;

        $this->section_name = $_postdata['sectionName'];
        $this->book_id = $_postdata['bookId'];
        $this->book_name = $_postdata['bookName'];
        */

        // get from URL with file_id
        $lg_text_url = $this->get_text_from_fileId_url.$this->file_id;
        //$lg_text = file_get_contents($lg_text_url);
        // --- get/set text and parsing meta data from text file
        $lg_text = $this->ParseDataInFile($lg_text_url);


        $stringInput = $lg_text;
        $stringInput = preg_replace("/ /u", "○", $stringInput);
        $stringInput = preg_replace("/\n/u", "<br>", $stringInput);
        $stringInput = preg_replace("/【(.*?)】/u", "【<a href=\"review_index_xml_images.php?books_id=".$this->book_id."&pages=\\1&entry=0\" target=\"_bookImg\">\\1</a>】", $stringInput);
        $lg_text = $stringInput;

        $this->lg_text = $lg_text;

    }

    public function SetBookMetadataBySectionId() {

        // get book_meta from $$this->get_section_metadata_by_sectionId_url
        $section_meta_url = $this->get_section_metadata_by_sectionId_url.$this->section_id;
        $section_meta = json_decode(file_get_contents($section_meta_url), true);

        $b = $section_meta['section']['book'];
        
        $this->book_name = $b['name'];
        $this->book_id = $b['id'];
        /*
        $book_meta = array();
        array_push($book_meta, array($b['id'],$b['name'],$b['level1'],$b['level2'],
                    $b['period'],$b['dynasty'], $b['start_year'], $b['end_year'],$b['line'],
                    $b['volume'],$b['author'], $b['edition'],$b['in_jibengujiku'], $b['admin_type']));    // missing author,year,pagenumber
        */
        /*
        $book_meta = array('id'=>$b['id'],'name'=>$b['name'],'level1'=>$b['level1'],'level2'=>$b['level2'],
                    'period'=>$b['period'],'dynasty'=>$b['dynasty'],'start_year'=>$b['start_year'], 'end_year'=>$b['end_year'],'line'=>$b['line'],
                    'volume'=>$b['volume'],'author'=>$b['author'],'edition'=>$b['edition'],
                    'in_jibengujiku'=>$b['in_jibengujiku'],'admin_type'=>$b['admin_type']);    // missing author,year,pagenumber
        */

        $book_meta->id = $b['id'];
        $book_meta->name = $b['name'];
        $book_meta->level1 = $b['level1'];
        $book_meta->level2 = $b['level2'];
        $book_meta->period = $b['period'];
        $book_meta->dynasty = $b['dynasty'];
        $book_meta->start_year = $b['start_year'];
        $book_meta->end_year = $b['end_year'];
        $book_meta->line = $b['line'];
        $book_meta->volume = $b['volume'];
        $book_meta->author = $b['author'];
        $book_meta->edition = $b['edition'];
        $book_meta->in_jibengujiku = $b['in_jibengujiku'];
        $book_meta->admin_type = $b['admin_type'];

        $coordinates = $section_meta['section']['coordinates_books'];
        $book_meta->x = $coordinates['x'];
        $book_meta->y = $coordinates['y'];
        $book_meta->place_name = $coordinates['place_name'];



        $this->book_meta = $book_meta;

    }

    public function SetTextFromSectionId() {  // remove $_postdata as input
        /**
         * Get text content from LGService by $this->section_id. 
         * After preprocessing the text string (replace space to circle symbol, link for page number, etc),
         * set $this->lg_text to the processed text gotten from LGService.
         */

        /*
        $section_id = $_postdata['sectionId'];
        $this->section_id = $section_id;
        $this->user_id = $_postdata['userId'];

        $this->section_name = $_postdata['sectionName'];
        $this->book_id = $_postdata['bookId'];
        $this->book_name = $_postdata['bookName'];
        */

        // get from URL with file_id
        // $lg_text_url = $this->get_text_from_sectionId_url.$section_id;
        $lg_text_url = $this->get_text_from_sectionId_url.$this->section_id;
        $lg_text = file_get_contents($lg_text_url);


        $stringInput = $lg_text;
        $stringInput = preg_replace("/<(.*?)>/u", "○", $stringInput);
        $stringInput = preg_replace("/ /u", "○", $stringInput);
        $stringInput = preg_replace("/\n/u", "<br>", $stringInput);
        $stringInput = preg_replace("/【(.*?)】/u", "【<a href=\"review_index_xml_images.php?books_id=".$this->book_id."&pages=\\1&entry=0\" target=\"_bookImg\">\\1</a>】", $stringInput);
        $lg_text = $stringInput;

        $this->lg_text = $lg_text;
    }

    // This is only used on localhost
    public function SetTextFromLocal($_id){     
        $this->section_id = $_id;
        //$this->branch_id = 1;   // local test sets branch_id to 1
        $this->messages['debug'] .= "[Debug] from my local"."<br>";
        $this->lg_text = $this->GetSectionContent();
    }


    public function SetInfoFromPreviousPage($_postdata) {
        /**
         * Get information from post data passsed by the previous page, and set variables in $this.
         * The previous page could be: 
         *
         * (1) LGService: the first time user enters Extraction-interface, which should linked from LGService. 
         *
         * (2) Extraction-interface itself: changing topic then continue to tag, saving text to LGService, reload the text from LGService.
         * 
         */

        if (isset($_postdata['fileId'])) {
            $this->file_id = $_postdata['fileId'];
        }
        if (isset($_postdata['sectionId'])) {
            $this->section_id = $_postdata['sectionId'];
        }
        if (isset($_postdata['text'])) {
            $this->lg_text = $_postdata['text'];
        }
        if (isset($_postdata['branchId'])) {
            $this->branch_id = $_postdata['branchId'];
        }
        if (isset($_postdata['userId'])) {
            $this->user_id = $_postdata['userId'];
        }
        if (isset($_postdata['topic'])) {
            $this->topic = $_postdata['topic'];
        }
      

        if (isset($_postdata['sectionName'])) {
            $this->section_name = $_postdata['sectionName'];
        }
        if (isset($_postdata['bookName'])) {
            $this->book_name = $_postdata['bookName'];
        }
        if (isset($_postdata['bookId'])) {
            $this->book_id = $_postdata['bookId'];
        }
        if (isset($_postdata['currentFileId'])) {
            $this->current_fileId = $_postdata['currentFileId'];
        }
        if (isset($_postdata['taglistArray'])) {
            $this->taglist_infile = json_decode($_postdata['taglistArray']);
        }
        if (isset($_postdata['book_meta'])) {
            $this->book_meta = json_decode($_postdata['book_meta']);
        }

    }


    private function TaglistSubsetIn($list1, $list2) {    // $l1 is a subset of $l2 or not
        // l1 and l2: array( $row['id'], $row['name'], $row['tag'], $row['color'] )
        $cnt_list1 = count($list1);
        $cnt_list2 = count($list2);

        if ($cnt_list1 > $cnt_list2) {
            return false;
        }
        foreach ($list1 as $v1) {
            $cnt = 0;
            foreach ($list2 as $v2) {
                $num_field = count($v2);
                $matched = true;
                for ($i=0; $i < $num_field; $i++) { 
                    if ($v1[$i] != $v2[$i]) {
                        $matched = false;
                        break;
                    }
                }

                if (!$matched) {
                    // not match with this v2
                    $cnt += 1;
                } else {
                    break;
                }

            }
            if ($cnt == $cnt_list2) {
                return false; 
            }
        }
        return true;
       
    }
    
    // === for tagging ===
    private function ReplaceLgTextWithLatestTag() {
        // modify $this->lg_text with the latest tags from database
        // can do it by getting the tag's id using tag's information in the file, then by the id to get latest tag (in db)
        $lg_text = $this->lg_text;

        $taglist_indb = $this->GetTaglistByTopicId($this->GetTopic());
        $taglist_infile = $this->taglist_infile;

        if ($taglist_infile == "") return;
        
        $count_tag_indb = count($taglist_indb);

        foreach ($taglist_infile as $t1) {
            $id = $t1[0];
            $tag = $t1[2];
            $latest_tag = "";

            $cnt = 0;
            foreach ($taglist_indb as $t2) {
                if ($t2[0] == $id) {
                    $latest_tag = $t2[2];
                }
               
                if ($tag != $t2[2]) {
                    // not match with this t2
                    $cnt += 1;
                } else {
                    break;
                }

            }
            if ($cnt == $count_tag_indb) {
                if ($latest_tag == "") {
                    // tag has been deleted in the db
                    // delele the tag in $this->lg_text
                    //echo "tag been deleted";

                    $lg_text = preg_replace("/<\/".$tag.">/u", "", $lg_text);
                    $lg_text = preg_replace("/<".$tag.">/u", "", $lg_text);

                } else {
                    // replace all tags $tag into $latest_tag in $this->lg_text
                    //echo "replace tag: ".$tag." into ".$latest_tag."<br>";
                    $lg_text = preg_replace("/".$tag."/u", $latest_tag, $lg_text);
                }
            }
        }


        $this->lg_text = $lg_text;

    }
    public function StartTagging() {
        /**
         * This is the main method for tagging text. It passes all the information to "views/Extractapp/TaggingText.php" view.
         * The information contain the text string, taglist array, wordlis array, topic, etc.
         */
       
        $section_id = $this->section_id;
        
        $data = array();    // data array to be passed to view

        //for GetTaglistByTopicId: 
        $taglistArray = $this->GetTaglistByTopicId($this->GetTopic());

        // $this->taglist_infile is set (1) from file or (2) from _postdata['taglistArray'] which comes from frontend that user decided
        // $this->taglist_infile is the most up-to-date taglist decided by user. Should be written into file.
        if( $this->TaglistSubsetIn($this->taglist_infile, $taglistArray) ) {    // TaglistSubsetIn($l1,$l2): $l1 is a subset of $l2 or not
            $this->taglist_infile = "";
            
        } else {
            // taglist_infile is out-to-date
            // replace all the old tag with new ones in database
            // replace old tags for $this->lg_text with the latest tags from db
            $this->ReplaceLgTextWithLatestTag();

        }
        $stringInput = $this->lg_text;


        $data['taglist_infile'] = $this->taglist_infile;    // if taglist_infile == "" means taglist in file is up-to-date (will use taglist in db), otherwise means the taglist in file
        
        // book_meta
        $data['book_meta'] = $this->book_meta;

        // topic list
        $topiclistArray = $this->GetTopiclistArray();


        $wordlistArray = $this->GetWordlistArray();

        $data['stringInput'] = $stringInput;
        $data['taglistArray'] = $taglistArray;
        $data['wordlistArray'] = $wordlistArray;
        $data['section_id'] = $section_id;
        $data['topiclistArray'] = $topiclistArray;
        $data['default_topic_id'] = $this->GetTopic();
        $topic_id = $this->GetTopic();

        $data['topic_tag'] = $this->GetTopicTag($topic_id);
        $data['topic_name'] = $this->GetTopicName($topic_id);
        $data['topic_tag_ch'] = $this->GetTopicTagName($topic_id);

        $data['info'] = array('file_id'=>$this->file_id, 'user_id'=>$this->user_id,
                'branch_id'=>$this->branch_id, 'section_id'=>$this->section_id, 'book_id'=>$this->book_id, 
                'book_name'=>$this->book_name,'section_name'=>$this->section_name, 'period'=>$this->book_meta->period,
                'current_fileId'=>$this->current_fileId); 


        $this->messages['debug'] .= "[Debug] ";
        $this->messages['debug'] .= "file_id=".$this->file_id.", section_id=".$this->section_id;
        $this->messages['debug'] .= ", user_id=".$this->user_id.", branch_id=".$this->branch_id.", topic_id=".$this->topic;
        $this->messages['debug'] .= ", book_id=".$this->book_id.", book_name=".$this->book_name.", section_name=".$this->section_name;
        $this->messages['debug'] .= ", current_fileId=".$this->current_fileId."<br>";

        $this->messages['info'] .= "[Info] book name: ".$this->book_name;
        $this->messages['info'] .= ", period: ".$this->book_meta->period;
        $this->messages['info'] .= ", section id: ". $this->section_id;
        $this->messages['info'] .= ", section name: ".$this->section_name;
        $this->messages['info'] .= ", branch id: ".$this->branch_id;
        $this->messages['info'] .= ", file id: ".$this->file_id;
        $this->messages['info'] .= ", topic id: ".$this->topic;
        $this->messages['info'] .= "<br>";


        $data['messages'] = $this->messages;

        return $data;
        
    }

    public function SaveFullText($postdata) {
        // locally
        if ($postdata['text']){
            $date = date('Y_m_d_H_i_s', time());
            if ( file_exists("data/parsing_files/".$postdata['filename'].".txt") ) {
                $oldFile = file_get_contents("data/parsing_files/".$postdata['filename'].".txt");
                file_put_contents("data/parsing_files/".$postdata['filename']."_".$date.".txt", $oldFile);
            }
            
            if (get_magic_quotes_gpc()) {
                $require = stripslashes($postdata['text']);
            } else {
                $require = $postdata['text'];
            }
            
            $require = preg_replace("/【<a(.*?)>(.*?)<\/a>】/u", "【\\2】", $require);
            $require = preg_replace('/&amp;/u', "&", $require); 
            $require = preg_replace("/○/u", " ", $require); 
            $require = preg_replace("/<br>/u", "\n", $require);
            $require = preg_replace("/<br>/u", "\n", $require);
            file_put_contents("data/parsing_files/".$postdata['filename'].".txt", $require);
        }

    }


    public function UpdateInfoResponsedFromLGService($response) {
        /**
         * 
         */

        if (isset($response["file"])) {
            $response_file = $response["file"];
        }
        if (isset($response["branch"])) {
            $response_branch = $response["branch"];
        }

        $status = (string)$response["status"];
        if ($status == "ok") {
            $this->messages['info'] .= "[Info] Saving success. <br>";
            $this->file_id = (string)$response_file["id"]; 
            $this->branch_id = (string)$response_branch["id"];

        } else if ($status == "error") {
            // saving not success
            $this->messages['error'] .= "[Error] Saving Failed! ".(string)$response["message"]."<br>";
            $this->messages['warning'] .= "[Warning] Please check branch ".$this->branch_id." in LGService, and modify from the latest version.";

            // TODO shouldnt reload latest file from the LGService...
            // pass the orignal text?

            $response_currentFile = $response["currentFile"];
            $this->current_fileId = (string)$response_currentFile["id"];
        }
        

    }

    public function ReloadSetting() {
        if ($this->current_fileId != 0) {
            $this->file_id = $this->current_fileId;
            $this->current_fileId = 0;
        }
    }

    // This is only called by SaveFullTextToLGService()
    private function AppendMetadata($text_content) {
        $text = '<?xml version="1.0" encoding="UTF-8"?>';
        $text .= "\n<text>\n";
        // --- topic ---
        $text .= "<topic>".$this->topic."</topic>\n";
        // --- book meta data ---
        $book = $this->book_meta;
       
        $text .= "<book>\n";
            $text .= "<id>".$book->id."</id>\n";
            $text .= "<name>".$book->name."</name>\n";
            $text .= "<level1>".$book->level1."</level1>\n";
            $text .= "<level2>".$book->level2."</level2>\n";
            $text .= "<period>".$book->period."</period>\n";
            $text .= "<dynasty>".$book->dynasty."</dynasty>\n";
            $text .= "<start_year>".$book->start_year."</start_year>\n";
            $text .= "<end_year>".$book->end_year."</end_year>\n";
            $text .= "<line>".$book->line."</line>\n";
            $text .= "<volume>".$book->volume."</volume>\n";
            $text .= "<author>".$book->author."</author>\n";
            $text .= "<edition>".$book->edition."</edition>\n";
            $text .= "<in_jibengujiku>".$book->in_jibengujiku."</in_jibengujiku>\n";
            $text .= "<admin_type>".$book->admin_type."</admin_type>\n";
       
            $text .= "<place_name>".$book->place_name."</place_name>\n";
            $text .= "<x>".$book->x."</x>\n";
            $text .= "<y>".$book->y."</y>\n";
        $text .= "</book>\n";
        

        // --- section info ---
        $text .= "<section>\n";
        $text .= "<id>".$this->section_id."</id>\n";
        $text .= "<name>".$this->section_name."</name>\n";
        $text .= "</section>\n";

        // ---- taglist ---
        // $taglist = $this->taglist_infile;
        // obtain the latest taglist from db
        // TDOO: possible bug: when taglist is modified by other user, the latest taglist from db of course will be changed.
        // As the result, here the taglist we get from db will be inconsistent with the tag in file.
        // which means the information in <tagitem> nodes are inconsistent with the text in <text_content> node.

        $taglist = $this->GetTaglistByTopicId($this->GetTopic());

        foreach ($taglist as $tagitem) {
            $text .= "<tagitem>\n";
            $text .= "<id>".$tagitem[0]."</id>\n";
            $text .= "<name>".$tagitem[1]."</name>\n";
            $text .= "<tag>".$tagitem[2]."</tag>\n";
            $text .= "<color>".$tagitem[3]."</color>\n";
            $text .= "</tagitem>\n";
        }
        // ----
        // --- text_content ---
        $text .= $text_content;
        $text .= "</text>";
        // ----

        return $text;
    }

    public function SaveFullTextToLGService($_postdata) {
        /**
         * It saves the full tagged text string in postdata to LGService.
         * The responses returned by LGService will later be handled in 
         */

        // --------
        global $AT_LOCAL;

        if ($_postdata['text']){
            $date = date('Y_m_d_H_i_s', time());
            if ( file_exists("data/parsing_files/".$_postdata['sectionId'].".txt") ) {
                $oldFile = file_get_contents("data/parsing_files/".$_postdata['sectionId'].".txt");
                //saving in my local machine in developing phrase
                if ($AT_LOCAL) {
                    file_put_contents("data/parsing_files/".$_postdata['sectionId']."_".$date.".txt", $oldFile);
                }
            }
            
            if (get_magic_quotes_gpc()) {
                $require = stripslashes($_postdata['text']);
            } else {
                $require = $_postdata['text'];
            }
 
            $require = preg_replace("/【<a(.*?)>(.*?)<\/a>】/u", "【\\2】", $require);
            $require = preg_replace('/&amp;/u', "&", $require); 
            $require = preg_replace("/○/u", " ", $require); 
            $require = preg_replace("/<br(.*?)>/u", "\n", $require);
            //$require = preg_replace("/<br>/u", "\n", $require);

            $require = "<text_content>".$require."</text_content>\n";
            
            /*
            if ($_postdata['branchId'] == 0) {
                // -- new branch case
                $require = "<text_content>".$require."</text_content>\n";
            }
            */

            $require = $this->AppendMetadata($require);
                
            //saving in my local machine in developing phrase
            if ($AT_LOCAL) {
                file_put_contents("data/parsing_files/".$_postdata['sectionId'].".txt", $require);
            }
        } 

        // ------


        if ($_postdata['branchId'] != 0) {
            // -- exiting branch case
            $postfields = array(
                "text" => $require, 
                "branchId" => $_postdata['branchId'],
                "userId" => $_postdata['userId'],
                "userPreviousFileId" => $_postdata['fileId'],
            );  
            $save_url = $this->save_to_LGService_url;     

        } else {
            // -- new branch case
            // echo "saveNew!";
            $user_id = "0";
            if ($_postdata['userId']) {
                $user_id = $_postdata['userId'];
            }
            
            $postfields = array(
                "text" => $require, 
                "sectionId" => $_postdata['sectionId'],
                "userId" => $user_id,
                "label" => $_postdata['label'],
            ); 
            $save_url = $this->save_new_to_LGService_url;
        }   

        
        // set up the curl resource
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $save_url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
        //curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
            'Content-type: multipart/form-data;charset=utf-8'                                                          
        ));       

        //if (!$AT_LOCAL) {
        // execute the request
        $output = curl_exec($ch);
        //}


        // output the profile information - includes the header
        //echo($output) . PHP_EOL;

        // close curl resource to free up system resources
        curl_close($ch);
        
        $response = json_decode($output, true);
        return $response;

    }

    // --- for regex ----
    private function GetRegexFilenameById($topic_id) {
        $query = sprintf("SELECT regex_filename FROM `TopicRegexRelation` WHERE  topic_id=\"%s\"", $topic_id);
        $result = mysql_query($query);
        if (!$result) {
            return json_encode("Failed during selecting TopicRegexRelation table.");
        }

        $filenames = array();
        while ($row = mysql_fetch_assoc($result)) {
            array_push($filenames, $row['regex_filename']);
        }

        return $filenames;
    }
    public function LoadSmartRegex($topic_id) {

        // Load regex file based on current topic. Only shows the regex in this topic --
        $filenames = $this->GetRegexFilenameById($topic_id);
        
        // Get regex file from filesystem ----
        $data_path = "./data/"; // get the current file path, which is getcwd(), and concatenate with "/data/"
        $returnArray = array();
        $files1 = scandir($data_path."regex_files");
        foreach ( $files1 as $file ) {
            if ( $file != "." && $file != ".." && $file != ".DS_Store") {
                foreach ($filenames as $filename) {
                    if ($file == $filename) {
                        $returnArray[preg_replace("/\.txt/", "", $file)] = file_get_contents( $data_path."regex_files/".$file );
                        break;
                    }
                }
            }
        }
        echo json_encode($returnArray);
        return;
    }


    public function SaveSmartRegex($_postdata) {
        if ($_postdata['text']){

            // --- update topic_regex_relation table ---
            $topic_id = $_postdata['topic_id'];
            $filename = $_postdata['filename'].'.txt';
            
            // check if already existing a record for this regex file
            $query = "SELECT * FROM TopicRegexRelation WHERE topic_id=".$topic_id." AND regex_filename='".$filename."'";
            $result = mysql_query($query);
            if (!$result) {
                echo json_encode("ErrorDB");
            }
            while ($row = mysql_fetch_assoc($result)) {
                if ($row && !$_postdata['forcesave']) {
                    // promt user a comfirm to force saving or not
                    echo json_encode("ForceSave");
                    return;
                }
            } 

        
            if (!$_postdata['forcesave']) {
                $query = "INSERT INTO TopicRegexRelation (topic_id, regex_filename) VALUES (".$topic_id.",'".$filename."')";
                $result = mysql_query($query);
                if (!$result) {
                    echo json_encode("ErrorDB");
                }
            } 
            // --- write to filesystem ---
            
            /*
            $date = date('Y_m_d_H_i_s', time());
            if ( file_exists("regex_files/".$_POST['filename'].".txt") ) {
                $oldFile = file_get_contents("regex_files/".$_POST['filename'].".txt");
                file_put_contents("regex_files/".$_POST['filename']."_".$date.".txt", $oldFile);
            }
            */
            $data_path = "./data/"; // get the current file path, which is getcwd(), and concatenate with "/data/"
            
            if (get_magic_quotes_gpc()) {
                $require = stripslashes($_postdata['text']);
            } else {
                $require = $_postdata['text'];
            }

            file_put_contents( $data_path."regex_files/".$_postdata['filename'].".txt", $require);   


        }
    }


    private function GetTableArray($_taglistArray, $_topic_tag, $_content) {

        $outputTableArray = array();
        $outputTableArray[0]=array();
        $outputTableArray[0][0]=array();
        $outputTableArray[0][1]=array();
        foreach ( $_taglistArray as $value ) {
            $outputTableArray[0][0][$value[2]] = $value[1];
            $outputTableArray[0][1][$value[2]] = $value[1]."(Title)";
        }
        $outputTableArray[0]["other"] = "其他";
        $outputTableArray[0]["page"] = "頁數";
        $outputTableArray[0]["full"] = "全文";

        // id, name, tag, color in _taglistArray
        foreach ( $_taglistArray as $tagValue ) {
            $tag_name = $tagValue[2];   // $tagValue[2] is tag_name
            $content = preg_replace("/<\/".$tag_name.">○*<".$tag_name.">/u", "", $_content);
            $content = preg_replace("/<".$tag_name.">[ ]*<\/".$tag_name.">/u", "", $_content);
        }

        $contentLineArray = explode( "<br>", $content );

        $count=0;
        $pageNow=NULL;
        foreach ( $contentLineArray as $value ) {
            $count++;
            $recordString = $value;
            $otherString = $recordString;
            //echo $recordString."<br>\n";
            // find hyper link in pattern with <a>...</a>
            if ( preg_match("/【<a(.*?)>(.*?)<\/a>】/u", $recordString, $matches) ) {
                $pageNow = $matches[2];
            }
            foreach ( $_taglistArray as $tagValue ) {
                $tag_name = $tagValue[2];   // $tagValue[2] is tag_name

                if ( preg_match_all("/<".$tag_name.">(.*?)<\/".$tag_name.">/u", $recordString, $matches, PREG_SET_ORDER) ) {
                    foreach ( $matches as $matchesValue ) {
                        $matchesValue[1] = preg_replace("/○/u", "", $matchesValue[1]);

                        if ( preg_match_all("/〈(.*?)〉/u", $matchesValue[1], $matches2, PREG_SET_ORDER) ) {
                            foreach ( $matches2 as $matches2Value ) {
                                if ( isset($outputTableArray[$count][0][$tag_name]) ) {
                                    $outputTableArray[$count][0][$tag_name] .= ";".$matches2Value[1];
                                } else {
                                    $outputTableArray[$count][0][$tag_name] = $matches2Value[1];
                                }
                            }
                        } else {
                            if ( isset($outputTableArray[$count][0][$tag_name]) ) {
                                $outputTableArray[$count][0][$tag_name] .= ";".$matchesValue[1];
                            } else {
                                $outputTableArray[$count][0][$tag_name] = $matchesValue[1];
                            }
                        }
                    }
                    $otherString = preg_replace("/<".$tag_name.">(.*?)<\/".$tag_name.">/u", " ", $otherString);   
                }
            }
            $otherString = preg_replace("/○/u", "", $otherString);
            $outputTableArray[$count]["other"] = $otherString;
            $outputTableArray[$count]["page"] = $pageNow;
            $value = preg_replace("/>/u", "&gt;", $value);
            $value = preg_replace("/</u", "&lt;", $value);
            $outputTableArray[$count]["full"] = $value;
        }
        
        

        foreach ( $outputTableArray as $arrayIndex => $arrayValue ) {
            // output each row which the topic tag
            // e.g. the original version is for 'person'           
            if ( !isset($arrayValue[0][$_topic_tag]) ) {
                unset($outputTableArray[$arrayIndex]);
            }

        }
        // ----- 

        return $outputTableArray;
    }

    // === for export table ===
    public function ExportTable($postdata, $isFromFile) {
        if ($isFromFile) {
            $content = $this->lg_text;
            $topic = $this->topic;
            $section_id = $this->section_id;
            $sectionName = $this->section_name;
            $bookId = $this->book_id;
            $bookName = $this->book_name;

            $taglistArray = $this->taglist_infile;

        } else {
            $content = $postdata['content'];
            $topic = $postdata['topic'];
            $section_id = $postdata['sectionId'];
            $sectionName = $postdata['sectionName'];
            $bookId = $postdata['bookId'];
            $bookName = $postdata['bookName'];

            //$taglistArray = $this->GetTaglistArray();
            $taglistArray = $this->GetTaglistByTopicId($topic);
        }
        // =====

        $topic_tag = $this->GetTopicTag($topic);

        // input data: taglistArray, topic_tag, content; output: outputTableArray
        $outputTableArray = $this->GetTableArray($taglistArray, $topic_tag, $content);



        $bookMeta = $this->book_meta;   // just added

        // data for view
        $data = array();
        $data['outputTableArray'] = $outputTableArray;
        $data['bookId'] = $bookId;
        $data['section_id'] = $section_id;
        $data['bookName'] = $bookName;
        $data['sectionName'] = $sectionName;
        $data['bookMeta'] = $bookMeta;

        return $data;

    }
    // === for manage tag list ===
    public function EditTaglist($_postdata) {
        /**
        */

        $query = "SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Taglist'";
        $result = mysql_query($query);
        if (!$result) {
            echo json_encode(mysql_error());
        }
        $row = mysql_fetch_assoc($result);
        $largest_id = $row['AUTO_INCREMENT']-1;


        $topic_id = $_postdata['topic_id'];
        $result = $this->GetTaglistByTopicId($topic_id);

        $taglistArray = array();

        foreach ($result as $row) {
            $taglistArray[$row[0]] = array($row[1], $row[2], $row[3]);
            //$taglistArray[$row['id']] = array($row['name'], $row['tag'], $row['color']);
        }

        $topic_tag_name = $this->GetTopicTag($topic_id);

        $query = "SELECT id FROM Taglist WHERE Taglist.tag='".$topic_tag_name."'";
        $result = mysql_query($query);
        if (!$result) {
            echo json_encode(mysql_error());
        }
        $row = mysql_fetch_assoc($result);
        $topic_tag_id = $row['id'];

        $data = array();
        $data['taglistArray'] = $taglistArray;
        $data['topic_id'] = $topic_id;
        $data['largest_id'] = $largest_id;
        $data['topic_tag_id'] = $topic_tag_id;


        return $data;
       
    }

    private function GetTag($_postdata) {
        if (get_magic_quotes_gpc()) {
            $id = stripslashes($_postdata['id']);
            $name = stripslashes($_postdata['name']);
            $tag = stripslashes($_postdata['tag']);
            $color = stripslashes($_postdata['color']);
        } else {
            $id = $_postdata['id'];
            $name = $_postdata['name'];
            $tag = $_postdata['tag'];
            $color = $_postdata['color'];
        }
        return array($id, $name, $tag, $color);
    }

    public function NewTagElement($postdata) {
        if ($postdata['id']){   
            list($id, $name, $tag, $color) = $this->GetTag($postdata);

             // for creationDate and lastChangeDate
            $date = date('Y-m-d H:i:s', time());

            $query1 = sprintf("INSERT INTO Taglist (`id`, `name`, `tag`, `color`, `creationDate`, `lastChangeDate`) VALUES (%s, %s, %s, %s, %s, %s)",
                                $this->GetSQLValueString($id, "int"),
                                $this->GetSQLValueString($name, "text"),
                                $this->GetSQLValueString($tag, "text"),
                                $this->GetSQLValueString($color, "text"),
                                $this->GetSQLValueString($date, "date"),
                                $this->GetSQLValueString($date, "date"));
                                //$this->GetSQLValueString($this->systemNAME, "text"));
            
            $result1 = mysql_query($query1);
            if (!$result1) {
                //echo json_encode("error when insert into Taglist table");
                echo 0;
                return;
            } 

            // add it to topic_tag_relation table
            $topic_id = $postdata['topic_id'];

            // tag_id is $id;
            //$query = sprintf("INSERT INTO `TopicTagRelation` (`topicId`,`tagId`) VALUES (%s,%s)", $topic_id, $id);

            $query = sprintf("INSERT INTO TopicTagRelation (`topicId`, `tagId`, `creationDate`, `lastChangeDate`) VALUES (%s, %s, %s, %s)",
                    $this->GetSQLValueString($topic_id, "int"),
                    $this->GetSQLValueString($id, "int"),
                    $this->GetSQLValueString($date, "date"),
                    $this->GetSQLValueString($date, "date"));


            $result = mysql_query($query);
            if (!$result) {
                echo 1;
                //echo json_encode("error when insert into TopicTagRelation table");
            }
        
        }

    }

    public function SaveTagElement($postdata) {
        if ($postdata['id']){   
            list($id, $name, $tag, $color) = $this->GetTag($postdata);
            
            // for lastChangeDate
            $date = date('Y-m-d H:i:s', time());

            $query = sprintf("UPDATE Taglist SET `name`=%s, `tag`=%s, `color`=%s , `lastChangeDate`=%s WHERE `id`=%s",
                                $this->GetSQLValueString($name, "text"),
                                $this->GetSQLValueString($tag, "text"),
                                $this->GetSQLValueString($color, "text"),
                                $this->GetSQLValueString($date, "date"),
                                $this->GetSQLValueString($id, "int"));
            $result = mysql_query($query);
                     
        }

    }

    public function DeleteTag($postdata) {
        if ($postdata['id']) {
            $tag_id = $postdata['id'];

            // delete record in 'taglist' table
            $query = sprintf("DELETE FROM `Taglist` WHERE `id` = %s", stripslashes($tag_id));
            $result = mysql_query($query);

            // delete record in 'topic_tag_relation' table
            $topic_id = $postdata['topic_id'];
            $query = sprintf("DELETE FROM `TopicTagRelation` WHERE `tagId` = %s and `topicId` = %s", stripslashes($tag_id), stripcslashes($topic_id));
            $result = mysql_query($query);

        }
       
    }

    // === for config topic ===
    public function CreateNewTopic($_postdata) {    
        $new_topic_id = "2";  // default topic_id=1 for 'person' topic

        // get user input data from postdata
        $new_topic_name_en = $_postdata['new_topic_name_en'];
        $new_topic_name_ch = $_postdata['new_topic_name_ch'];
        $new_topic_name_pi = $_postdata['new_topic_name_pi'];
        $new_topic_tag = $_postdata['new_topic_tag'];
        $new_topic_tag_name = $_postdata['new_topic_tag_name'];

        // -- Start Transaction -- 
        mysql_query("BEGIN");

        // create records for the new topic in database
        /* In table:
            taglist: name, tag, color (default, user can change later in the editing page)
            topics: tag, name_en, name_ch, name_pinyin
            topic_tag_relation: topic_id (new), tag_id (new)

        - need transaction for the following actions:
            taglist.name: topic_tag name in chinese 
            taglist.tag: topic_tag name in eng
            topics.tag: (the same a taglist.tag)
            topics.name_en:
            topics.name_ch: 
            topics.name_pinyin: 

             
            topic_tag_relation.topic_id = new_topic_id
            topic_tag_relation.tag_id = new_tag_id 
                which are the new record that just been created in the 'taglist' and 'topics' table
        */

        // new record in topics table           
        $query="INSERT INTO Topic (tag, name_en, name_ch, name_pinyin) VALUES ('".$new_topic_tag."','".$new_topic_name_en."','".$new_topic_name_ch."','".$new_topic_name_pi."')";  
        $result_topics=mysql_query($query);
        if($result_topics){
            $new_topic_id = mysql_insert_id();
        } else {
            //echo mysql_error();
        }

        // new record in taglist table
        $query="INSERT INTO Taglist (name, tag, color) VALUES ('".$new_topic_tag_name."','".$new_topic_tag."','rgb(255, 0, 174)')";  
        $result_taglist=mysql_query($query);
        if($result_taglist){
            $new_tag_id = mysql_insert_id();
        } else {
            //echo mysql_error();
        }

        // new record in topic_tag_relation
        $query="INSERT INTO TopicTagRelation (topicId, tagId) VALUES ('".$new_topic_id."','".$new_tag_id."')";  
        $result_topic_tag_relation=mysql_query($query);
        if($result_topic_tag_relation){
            
        } else {
            //echo mysql_error();
        }

 
        // --- End Transaction ---
        if ($result_taglist && $result_topics && $result_topic_tag_relation) {
            mysql_query("COMMIT");  
            
        } else {
            mysql_query("ROLLBACK");
            return "error";
        }
        

        $_postdata['topic'] = $new_topic_id;
        return $_postdata;
    }

    public function ConfigTagsInTopic($_postdata) {
        /**
        * 
        */

        $topic = $_postdata['topic'];
        $result = $this->GetTopicById($topic);
        $row = mysql_fetch_assoc($result);
        $topic_name_en = $row['nameEn'];
        $topic_name_ch = $row['nameCh'];
        $topic_name_pinyin = $row['namePinyin'];
        $topic_tag = $row['tag'];


        /*
        $topic_name_en = $row['name_en'];
        $topic_name_ch = $row['name_ch'];
        $topic_name_pinyin = $row['name_pinyin'];
        */

        /*
        $query = "SELECT taglist.*, topic_tag_relation.topic_id FROM taglist LEFT JOIN topic_tag_relation ON taglist.id = topic_tag_relation.tag_id ORDER BY `topic_id`";
        $result = mysql_query($query);
        if (!$result) {
            return json_encode("Failed during selecting/joining taglist and topic_tag_relation table.");
        }
        $taglistArray = array();
        while ($row = mysql_fetch_assoc($result)) {
            array_push($taglistArray, array('id'=>$row['id'],'name'=>$row['name'], 'tag'=>$row['tag'], 'color'=>$row['color'], 'topic_id'=>$row['topic_id']) );
        }
        */

        // ------
        $query = "SELECT Taglist.*, TopicTagRelation.topicId FROM Taglist LEFT JOIN TopicTagRelation ON Taglist.id = TopicTagRelation.tagId ORDER BY `topicId`";
        $result = mysql_query($query);
        if (!$result) {
            return json_encode("Failed during selecting/joining Taglist and TopicTagRelation table.");
        }
        
        $tag_intopic = array();
        $tag_others = array();
        $tag_tmp_others = array();
        while ($row = mysql_fetch_assoc($result)) {
            // should exclude the topic tag, which is in either $topic_intopic nor $tag_tmp_others
            if ($row['tag'] == $topic_tag) {
                // escape for the topic tag
            } else if ($row['topicId'] == $topic) {
                array_push($tag_intopic, array('id'=>$row['id'],'name'=>$row['name'], 'tag'=>$row['tag'], 'color'=>$row['color'], 'topic_id'=>$row['topicId']));
            } else {
                array_push($tag_tmp_others, array('id'=>$row['id'],'name'=>$row['name'], 'tag'=>$row['tag'], 'color'=>$row['color'], 'topic_id'=>$row['topicId']));
            }
        }

        // --- check if there's any duplicated tags in tag_tmp_others. remove the duplicated tags
        $num_others = count($tag_tmp_others);
        for ($i=0; $i < $num_others; $i++) { 
            $cnt = 0;
            for ($j=$i+1; $j < $num_others; $j++) { 
                if ($tag_tmp_others[$i]['tag'] == $tag_tmp_others[$j]['tag']) {
                    break;
                } else {
                    $cnt++;
                }
            }
            if ($cnt == ($num_others-$i-1) ) {
                $row = $tag_tmp_others[$i];
                array_push($tag_others, array('id'=>$row['id'],'name'=>$row['name'], 'tag'=>$row['tag'], 'color'=>$row['color'], 'topic_id'=>$row['topicId']) );
            }
        }

        // --- remove duplicated tags in tag_others that is duplicated with tags in tag_intopic
        $tag_tmp_others = $tag_others;
        $tag_others = array();
        
        foreach ($tag_tmp_others as $tmp) {
            $cnt = 0;
            foreach ($tag_intopic as $intopic) {
                if ($tmp['tag'] == $intopic['tag']) {
                    break;
                } else {
                    $cnt ++;
                }
            }
            if ($cnt == count($tag_intopic)) {
                // not appear in $tag_intopic
                array_push($tag_others, $tmp);
            }
        }
        
        // -----


        $data = array();
        //$data['taglistArray'] = $taglistArray;
        $data['topic'] = $topic;
        $data['topic_name'] = array('name_en'=>$topic_name_en,'name_ch'=>$topic_name_ch,'name_pinyin'=>$topic_name_pinyin);

        $data['tag_intopic'] = $tag_intopic;
        $data['tag_others'] = $tag_others;

        return $data;
    }



    public function UpdateTagsInTopic($_postdata) {
        $topic_id = $_postdata['topic_id'];
        $tag_ids = json_decode(str_replace('\\', '', $_postdata['ids']));

        // update topic_tag_relation by tags_ids array as `tag_id` and topic_id as `topic_id`

        
        // --- add new topic_tag_relation ---
        foreach ($tag_ids as $tag_id) {
            $query = "SELECT * FROM TopicTagRelation WHERE tagId=".$tag_id;
            $result = mysql_query($query);
            if (!$result) {
                echo json_encode("error when select from TopicTagRelation");
            }
            //$topic_tag = array();
            $flag = false;
            while ($row = mysql_fetch_assoc($result)) {
                if ($row['topicId'] == $topic_id) {
                    $flag = true;
                    break;
                }
            }
            if (!$flag) {
                // insert a row into topic_tag_relation table
                // $queryUpdate = "INSERT INTO TopicTagRelation (topicId, tagId) VALUES (".$topic_id.",".$tag_id.")";

                $date = date('Y-m-d H:i:s', time());    
                $queryUpdate = sprintf("INSERT INTO TopicTagRelation (`topicId`, `tagId`, `creationDate`, `lastChangeDate`) VALUES (%s, %s, %s, %s)",
                    $this->GetSQLValueString($topic_id, "int"),
                    $this->GetSQLValueString($tag_id, "int"),
                    $this->GetSQLValueString($date, "date"),
                    $this->GetSQLValueString($date, "date"));

                $resultUpdate = mysql_query($queryUpdate); 
                if (!$resultUpdate) {
                    return json_encode("error when insert TopicTagRelation table");
                }   
            }

        }


        // --- remove tags from this topic ---
        // bug: this remove the topic tag as well?

        // don't delete the topic tag!
        $topic_tag = $this->GetTopic($topic_id)["tag"];
        $topic_tag_id = $this->GetTagIdByTag($topic_tag);

        //$query = "SELECT * FROM TopicTagRelation WHERE topicId=".$topic_id;
        $query = "SELECT * FROM TopicTagRelation WHERE topicId=".$topic_id." and tagId!=".$topic_tag_id;
        $result = mysql_query($query);
        if (!$result) {
            echo json_encode("error when select from TopicTagRelation");
        }

        while ($row = mysql_fetch_assoc($result)) {
            $cnt = 0;
            foreach ($tag_ids as $tag_id) {
                if ($row['tagId'] == $tag_id) {
                    break;
                } else {
                    $cnt ++;
                }
            }
            $_id = $row['id'];
            if ($cnt == count($tag_ids)) {
                // delete row with (topic_id, tag_ids)
                $queryDelete = "DELETE FROM TopicTagRelation WHERE id=".$_id;
                $resultDelete = mysql_query($queryDelete);
                if (!$resultDelete) {
                    echo json_encode("error when delete from TopicTagRelation");
                }
            }
        }


    }


    private function GetTaglistByTopicId($topic_id) {
        $taglistArray = array();
        // select taglist ids from topic_tag_relation table
        $query = sprintf("SELECT * FROM `TopicTagRelation` WHERE `topicId`='%s'", $topic_id);
        $result = mysql_query($query);
        if (!$result) {
            return json_encode("Failed during selecting TopicTagRelation table.");
        }
        $taglist_ids = array();

        while ($row = mysql_fetch_assoc($result)) {
            array_push($taglist_ids, $row['tagId']);
        }

        // select taglist by tag ids
        foreach ($taglist_ids as $tag_id) {
            $query = sprintf("SELECT * FROM `Taglist` WHERE `id`='%s'", $tag_id);
            $result = mysql_query($query);
            if (!$result) {
                echo mysql_error();
                return json_encode("Failed during selecting Taglist table.");
            }

            $row = mysql_fetch_assoc($result);
            array_push($taglistArray, array( $row['id'], $row['name'], $row['tag'], $row['color'] ));

        }
        return $taglistArray;
    }

    public function SetTopic($topic) {
        $this->topic = $topic;
    }

    private function GetTopic() {
        return $this->topic;
    }

    private function GetTopiclistArray() {
        $topiclistArray = array();
        $result = $this->GetTopicList();
        while ($row = mysql_fetch_assoc($result)) {
            //array_push($topiclistArray, array('id'=>$row['id'],'name'=>$row['name'],'tag'=>$row['tag']));
            //array_push($topiclistArray, array('id'=>$row['id'],'tag'=>$row['tag'],'name_en'=>$row['name_en'],'name_ch'=>$row['name_ch'],'name_pinyin'=>$row['name_pinyin'],));
            array_push($topiclistArray, array('id'=>$row['id'],'tag'=>$row['tag'],'name_en'=>$row['nameEn'],'name_ch'=>$row['nameCh'],'name_pinyin'=>$row['namePinyin'],));
        }
        return $topiclistArray;
    }


    private function GetTopicTag($topic_id) {
        $result = $this->GetTopicById($topic_id);
        $row = mysql_fetch_assoc($result);
        $tag = $row['tag'];

        // TODO need to reconstruct the structure for topic tag considering user may use Uppercase but only lowercase accpetable in html tag that why we store only lowercase in Taglist.tag field in database table.
        // Temporate solution is we replace " " with "_" and .lowercase(), which are as the same as we do in LGServices when create a topic and also create the correpsonding topic tag
        
        $tag = str_replace(' ', '_', $tag);
        return strtolower($tag);

        //return $tag;
    }
    private function GetTopicName($topic_id) {
        $result = $this->GetTopicById($topic_id);
        $row = mysql_fetch_assoc($result);
        //$name = $row['name'];
        $name = array('name_en'=>$row['nameEn'], 'name_ch'=>$row['nameCh'], 'name_pinyin'=>$row['namePinyin']);
        return $name;
    }
    private function GetTopicTagName($topic_id) {
        $topic_tag = $this->GetTopicTag($topic_id);
        $query = "SELECT * FROM `Taglist` WHERE tag='".$topic_tag."'";
        $result = mysql_query($query);
        $row = mysql_fetch_assoc($result);

        return $row['name'];
    }




    // =========================== 

    // === for manage wordlist ===
    public function EditWordlist() {
        /**
        * EditWordlist shows the wordlist in a new window.
        * User can view each one of the wordlist and edit it, also s/he can create a new wordlist here.
        */

        $result = $this->GetWordlist();
        $wordlistArray = array();
        while ($row = mysql_fetch_assoc($result)) {
            $wordlistArray[$row['id']] = $row['name'];
        }

        $data = array();
        $data['wordlistArray'] = $wordlistArray;
        return $data;
    }


    public function AddNewList($postdata) {
        if ($postdata['text']){ 
            if (get_magic_quotes_gpc()) {
                $name = stripslashes($postdata['text']);
            } else {
                $name = $postdata['text'];
            }

            $query1 = sprintf("INSERT INTO `Wordlist` (`name`) VALUES (%s)",
                            $this->GetSQLValueString($name, "text"));
                            //$this->GetSQLValueString($this->systemNAME, "text"));
            $result1 = mysql_query($query1);
            file_put_contents( "data/wordlist/".mysql_insert_id().".txt", "(empty now)");
        }
    }  


    public function SaveWordlist($postdata) {

        if ($postdata['text']){
            $date = date('Y_m_d_H_i_s', time());
            if ( file_exists("data/wordlist/".$postdata['filename'].".txt") ) {
                $filename = "data/wordlist/".$postdata['filename']."_".$date.".txt";
                $oldFile = file_get_contents("data/wordlist/".$postdata['filename'].".txt");
                file_put_contents($filename, $oldFile);
            } 
            /*else {
                $filename = "data/wordlist/".$postdata['filename'].".txt";
            }
            */


            if (get_magic_quotes_gpc()) {
                $require = stripslashes($postdata['text']);
            } else {
                $require = $postdata['text'];
            }

            $require = preg_replace("/<br>/u", "<br>", $require);
            file_put_contents("data/wordlist/".$postdata['filename'].".txt", $require);
        }
        /*
        if ($postdata['text']){
            $date = date('Y_m_d_H_i_s', time());
            if ( file_exists("data/wordlist/".$postdata['filename'].".txt") ) {
                $oldFile = file_get_contents("data/wordlist/".$postdata['filename'].".txt");
                file_put_contents("data/wordlist/".$postdata['filename']."_".$date.".txt", $oldFile);
            }
        
            if (get_magic_quotes_gpc()) {
                $require = stripslashes($postdata['text']);
            } else {
                $require = $postdata['text'];
            }

            // $require = preg_replace("/<br>/u", "", $require);
            file_put_contents("data/wordlist/".$postdata['filename'].".txt", $require);
        }
        */
    }


    // =======================================

    private function sortFunction($a,$b) {
        return strlen($b)-strlen($a);
    }

    private function GetSectionId() {

        if (is_numeric($this->section_id)) {
            return $this->section_id;
        } else {
            return json_encode("Error: No section id");
        }
    }
    

    /* only used locally */
    /*
    private function GetSectionInfo() {
        $section_id = $this->GetSectionId();
        if (!is_numeric($section_id)){
            return $section_id;
        }

        $result = $this->GetSectionsById($section_id);

        
        while ($row = mysql_fetch_assoc($result)) {
            $bookId=$row['books_id'];
            $startPage=$row['start_page'];
            $endPage=$row['end_page'];
            $sectionName = $row['name'];
        }

        $data = array();
        $data['bookId'] = $bookId;
        $data['startPage'] = $startPage;
        $data['endPage'] = $endPage;
        $data['sectionName'] = $sectionName;


        return $data;
    }
    */

    private function ParseDataInFile($filename) {
        $text = file_get_contents($filename);
        $xml = simplexml_load_string($text); //or die("Error: Cannot load from xml string");
        if (!$xml) {
            // when file created by section_id, read the plain text from file_get_contents
            return $text;
        }

        $this->topic = (string)$xml->topic; // set topic id

        // get taglist in file
        $taglist_infile = $xml->tagitem;
        $taglistArray = array();
        foreach ($taglist_infile as $row) {
            array_push($taglistArray, array((string)$row->id,(string)$row->name,(string)$row->tag,(string)$row->color ));
        }
        if ($taglistArray) {
            $this->taglist_infile = $taglistArray; 
        }

        // --- get book meta data from file, replaced by SetBookMetaDataBySectionId(), which retrives book meta data from LGService
        /*
        $book_meta = $xml->book;
        $book_metaArray = array();
        foreach ($book_meta as $row) {
            array_push($book_metaArray, array((string)$row->id,(string)$row->name,(string)$row->level1,(string)$row->level2,
                (string)$row->period,(string)$row->dynasty,(string)$row->start_year,(string)$row->end_year,(string)$row->line,
                (string)$row->volume,(string)$row->author,(string)$row->edition,(string)$row->in_jibengujiku,(string)$row->admin_type ));
        }
        if ($book_metaArray) {
            $this->book_meta = $book_metaArray;
        }
        */
        // -----
        // get section_id, section_name from file
        if ($this->section_id == 0 && isset($xml->section)) {
            if ($xml->section) {
                $this->section_id = (string)$xml->section->id;
                $this->section_name = (string)$xml->section->name;
            }
        }
        // book meta data
        if (!isset($this->book_id) && isset($xml->book)) {
            $this->book_id = (string)$xml->book->id;
            $this->book_name = (string)$xml->book->name;
        }



        $contentString = (string)($xml->text_content->asXML());

        $removed_str = array("<text_content>","</text_content>");
        $new_contentString = str_replace($removed_str, "", $contentString);


        return $new_contentString;
    }


    /** This is only been called by SetTextFromLocal().
    */        
    /*
    private function GetSectionContent() {  

        $section_id = $this->GetSectionId();
        $section_info = $this->GetSectionInfo();

        $bookId = $section_info['bookId'];
        $startPage = $section_info['startPage'];
        $endPage = $section_info['endPage'];
        $this->section_name = $section_info['sectionName'];


        $contentString="";
        $data_path = $this->GetDataPath();
        if ( file_exists($data_path."parsing_files/".$section_id.".txt") ) {
            $filename = $data_path."parsing_files/".$section_id.".txt";
            
            // --- parsing meta data
            $stringInput = $this->ParseDataInFile($filename);
            // ----

            // if the text is from file system
            $stringInput = preg_replace("/ /u", "○", $stringInput);
            $stringInput = preg_replace("/\n/u", "<br>", $stringInput);
            $stringInput = preg_replace("/【(.*?)】/u", "【<a href=\"review_index_xml_images.php?books_id=".$bookId."&pages=\\1&entry=0\" target=\"_bookImg\">\\1</a>】", $stringInput);
            
            $this->branch_id = 1;   // testing at local

        } else {
            $query = sprintf("SELECT `content`, `line`, `books_id` FROM `contents` WHERE `books_id`=\"%s\" AND `line`>=%d AND `line`<=%d", $bookId, $startPage, $endPage);
            $result = mysql_query($query);
            if (!$result) {
                return json_encode("Failed during selecting content table.");
            }
            while ($row = mysql_fetch_assoc($result)) {
                $contentString.="【".$row['line']."】".$row['content']."\n";
            }
           
            // the text is from database
            $stringInput = $contentString;
            $stringInput = preg_replace("/<(.*?)>/u", "○", $stringInput);
            $stringInput = preg_replace("/ /u", "○", $stringInput);
            $stringInput = preg_replace("/\n/u", "<br>", $stringInput);
            $stringInput = preg_replace("/【(.*?)】/u", "【<a href=\"review_index_xml_images.php?books_id=".$bookId."&pages=\\1&entry=0\" target=\"_bookImg\">\\1</a>】", $stringInput);
        }

        return $stringInput;

    }
    */

    
    private function GetDataPath() {
        return getcwd()."/data/"; // get the current file path, which is getcwd(), and concatenate with "/data/"
    }

    private function GetTaglistArray() {
        $taglistArray = array();
        $result = $this->GetTaglist();
        while ($row = mysql_fetch_assoc($result)) {
            array_push($taglistArray, array( $row['id'], $row['name'], $row['tag'], $row['color'] ));
        }

        return $taglistArray;
    }

    private function GetWordlistArray() {
        $wordlistArray="";
        $result = $this->GetWordlist();
        while ($row = mysql_fetch_assoc($result)) {
            $listString = file_get_contents("data/wordlist/".$row['id'].".txt");
            $listString = preg_replace("/<div>/u", "\n", $listString);
            $listString = preg_replace("/<\/div>/u", "", $listString);
            $listString = preg_replace("/<span(.*?)>/u", "", $listString);
            $listString = preg_replace("/<\/span>/u", "", $listString);
            //$listString = preg_replace("/\n/u", "|", $listString);
            
            $wordlistArray2 = explode( "\n", $listString );
            //usort($wordlistArray2,'sortFunction');
            foreach ( $wordlistArray2 as $index=>$value ) {
                $wordlistArray2[$index] = implode("○?", preg_split("/(?<!^)(?!$)/u", $value));
            }
            foreach ( $wordlistArray2 as $index=>$value ) {
                if ($value=="") unset($wordlistArray2[$index]);
                
            }
            $listString = implode("|", $wordlistArray2);
            
            if ( $listString[0]=="|" ) $listString = substr($listString, 1);
            $wordlistArray[] = array( $row['id'], $row['name'], $listString );
        }


        return $wordlistArray;

    }

     
}



?>