Changeset 509


Ignore:
Timestamp:
08/18/2010 03:36:03 AM (18 months ago)
Author:
ofer
Message:

Changes in parser in attempt to simplify code, allow the special goaway entity that will be used in the future gettext support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/WordPress/plugin/transposh/core/parser.php

    r503 r509  
    1515require_once("constants.php"); 
    1616require_once("logging.php"); 
     17require_once("utils.php"); 
    1718 
    1819/** 
     
    8990    public $fetch_translate_func = null; 
    9091    public $prefetch_translate_func = null; 
    91     private $segment_id = 0; 
     92    /** @var int stores the number of the last used span_id */ 
     93    private $span_id = 0; 
    9294    /** @var simple_html_dom_node Contains the current node */ 
    9395    private $currentnode; 
     
    280282     * @param int $end - end of phrase in element 
    281283     */ 
    282     function tag_phrase($string, $start, $end) { 
     284    function tag_phrase($string, $start, $end, $gettext = false) { 
    283285        $phrase = trim(substr($string, $start, $end - $start)); 
    284286        if ($phrase) { 
     
    290292            $node->_[HDOM_INFO_OUTER] = ''; 
    291293            $node->phrase = $phrase; 
     294            $node->start = $start; 
     295            $node->len = strlen($phrase); 
    292296            if ($this->inbody) $node->inbody = $this->inbody; 
    293297            if ($this->inselect) $node->inselect = true; 
     298            if ($gettext) { 
     299                $node->phrase = substr(substr($phrase, 11), 0, -11); 
     300                $node->gettext = true; 
     301            } 
    294302        } 
    295303    } 
     
    320328                    $this->tag_phrase($string, $start, $pos); 
    321329                    $start = $pos + $len_of_entity; 
     330                } 
     331                //goaway entity 
     332                if ($entity == '&transposh;') { 
     333                    $closerent = strpos($string, $entity, $start); 
     334                    $start = $pos; 
     335                    $this->tag_phrase($string, $start, $closerent + $len_of_entity, true); //special tagging? 
     336                    $start = $closerent + $len_of_entity; 
     337                    $pos = $closerent; 
    322338                } 
    323339                //skip past entity 
     
    358374                $pos += $num_len + 1; 
    359375            } else { 
     376                // smarter marking of start location 
     377                if ($start == $pos && $this->is_white_space($string[$pos])) 
     378                        $start++; 
    360379                $pos++; 
    361380            } 
     
    478497        // Use base64 encoding to make that when the page is translated (i.e. update_translation) we 
    479498        // get back exactlly the same string without having the client decode/encode it in anyway. 
    480         $span = '<span class ="' . SPAN_PREFIX . '" id="' . SPAN_PREFIX . $this->segment_id . '" data-token="' . transposh_utils::base64_url_encode($original_text) . '" data-source="' . $source . '"'; 
     499        $span = '<span class ="' . SPAN_PREFIX . '" id="' . SPAN_PREFIX . $this->span_id . '" data-token="' . transposh_utils::base64_url_encode($original_text) . '" data-source="' . $source . '"'; 
    481500        // those are needed for on the fly image creation / hidden elements translations 
    482501        if ($this->is_edit_mode || $for_hidden_element) { 
     
    491510        } 
    492511        $span .= '>'; 
    493         ++$this->segment_id; 
     512        if (!$for_hidden_element) { 
     513            if ($translated_text) $span .= $translated_text; 
     514            else $span .= $original_text; 
     515        } 
     516        $span .= '</span>'; 
     517        ++$this->span_id; 
    494518        return $span; 
    495519    } 
     
    594618        // texts are first 
    595619        foreach ($this->html->find('text') as $e) { 
    596             $right = ''; 
    597             $newtext = ''; 
     620            $replace = array(); 
    598621            foreach ($e->nodes as $ep) { 
    599622                list ($translated_text, $source) = call_user_func_array($this->fetch_translate_func, array($ep->phrase, $this->lang)); 
     
    605628                } 
    606629                if (($this->is_edit_mode || ($this->is_auto_translate && $translated_text == null))/* && $ep->inbody */) { 
    607                     $spanend = '</span>'; 
    608630                    if ($ep->inselect || !$ep->inbody) { 
    609                         $savedspan .= $this->create_edit_span($ep->phrase, $translated_text, $source, true) . $spanend; 
    610                         $span = ''; 
    611                         $spanend = ''; 
     631                        $savedspan .= $this->create_edit_span($ep->phrase, $translated_text, $source, true); 
    612632                    } else { 
    613                         $span = $this->create_edit_span($ep->phrase, $translated_text, $source); 
    614                         if ($translated_text == null) 
    615                                 $translated_text = $ep->phrase; 
     633                        $translated_text = $this->create_edit_span($ep->phrase, $translated_text, $source); 
    616634                    } 
    617635                } 
    618                 else { 
    619                     $span = ''; 
    620                     $spanend = ''; 
    621                 } 
     636                // store replacements 
    622637                if ($translated_text) { 
    623                     list ($left, $right) = explode($ep->phrase, $e->outertext, 2); 
    624                     $newtext .= $left . $span . $translated_text . $spanend; 
    625                     $e->outertext = $right; 
    626                 } 
    627             } 
    628             if ($newtext) { 
    629                 $e->outertext = $newtext . $right; 
    630                 logger("phrase: $newtext", 4); 
    631             } 
    632             // hmm? 
     638                    $replace[$translated_text] = $ep; 
     639                } 
     640            } 
     641            // do replacements in reverse 
     642            foreach (array_reverse($replace, true) as $replace => $epg) { 
     643                $e->outertext = substr_replace($e->outertext, $replace, $epg->start, $epg->len); 
     644            } 
     645 
     646            // this adds saved spans to the first not in select element which is in the body 
    633647            if (!$ep->inselect && $savedspan && $ep->inbody) { 
    634648                $e->outertext = $savedspan . $e->outertext; 
     
    638652 
    639653        // now we handle the title attributes (and the value of submit buttons) 
     654        $hidden_phrases = array(); 
    640655        foreach (array('title', 'value') as $title) { 
    641             $hidden_phrases = array(); 
    642656            foreach ($this->html->find('[' . $title . ']') as $e) { 
     657                $replace = array(); 
    643658                $span = ''; 
    644                 $spanend = ''; 
    645                 $right = ''; 
    646                 $newtext = ''; 
    647659                // when we already have a parent outertext we'll have to update it directly 
    648660                if ($e->parent->_[HDOM_INFO_OUTER]) { 
     
    671683                                if (!in_array($ep->phrase, $hidden_phrases)) { 
    672684                                    $this->stats->hidden_translateable_phrases++; 
    673                                     $span .= $this->create_edit_span($ep->phrase, $translated_text, $source, true) . '</span>'; 
     685                                    $span .= $this->create_edit_span($ep->phrase, $translated_text, $source, true); 
    674686                                    //    logger ($span); 
    675687                                    $hidden_phrases[] = $ep->phrase; 
     
    677689                            } 
    678690                        } 
     691                        // if we need to replace, we store this 
    679692                        if ($translated_text) { 
    680                             list ($left, $right) = explode($ep->phrase, $e->$title, 2); 
    681                             $newtext .= $left . $translated_text; 
    682                             $e->$title = $right; 
     693                            $replace[$translated_text] = $ep; 
    683694                        } 
    684695                    } 
    685696                } 
    686                 if ($newtext) { 
    687                     $e->$title = $newtext . $right; 
    688                     logger("$title-phrase: $newtext", 4); 
     697                // and later replace 
     698                foreach (array_reverse($replace, true) as $replace => $epg) { 
     699                    $e->title = substr_replace($e->title, $replace, $epg->start, $epg->len); 
    689700                } 
    690701 
Note: See TracChangeset for help on using the changeset viewer.