User talk:Badmadevil: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎Not Implemented Tasks by Language: updated, query string handling changed)
(Providing some feedback re: skin)
Line 1: Line 1:
Welcome to Rosetta Code! I founded RC around a year ago, and still do most of the administrative work. Thanks for your code contributions. I'm curious, though, how did you hear about RC? --[[User:Short Circuit|Short Circuit]] 10:44, 23 February 2008 (MST)
Welcome to Rosetta Code! I founded RC around a year ago, and still do most of the administrative work. Thanks for your code contributions. I'm curious, though, how did you hear about RC? --[[User:Short Circuit|Short Circuit]] 10:44, 23 February 2008 (MST)
:Hi, thanks. I heard from a forward message posted at Digital Mars D newsgroup about a month ago. -[[User:Badmadevil|badmadevil]] 03:03, 24 February 2008 (MST)
:Hi, thanks. I heard from a forward message posted at Digital Mars D newsgroup about a month ago. -[[User:Badmadevil|badmadevil]] 03:03, 24 February 2008 (MST)

Hi there, I'm really not seeing the issues you're reporting about the new skin. If you could, post the browser version as well, as I see neither of the problems you've listed in the ones I'm testing with (FF3, Opera 9.5, IE7)
--[[User:Qrush|qrush]] 19:54, 22 June 2008 (UTC)


== Mylang ==
== Mylang ==

Revision as of 19:54, 22 June 2008

Welcome to Rosetta Code! I founded RC around a year ago, and still do most of the administrative work. Thanks for your code contributions. I'm curious, though, how did you hear about RC? --Short Circuit 10:44, 23 February 2008 (MST)

Hi, thanks. I heard from a forward message posted at Digital Mars D newsgroup about a month ago. -badmadevil 03:03, 24 February 2008 (MST)

Hi there, I'm really not seeing the issues you're reporting about the new skin. If you could, post the browser version as well, as I see neither of the problems you've listed in the ones I'm testing with (FF3, Opera 9.5, IE7) --qrush 19:54, 22 June 2008 (UTC)

Mylang

Good job with the mylang templates. I had done as well as I could before, but these are better. --Mwn3d 13:52, 22 March 2008 (MDT)

thank for appreciation :) --badmadevil 07:54, 23 March 2008 (MDT)

Not Implemented Tasks by Language

Hello. IIRC, it has been mentioned an idea to display a page of tasks not implemented by a specific language (It is from Ian Osgood's wishlist), it seems no such page at Rosetta Code yet. I've coded a dirty hack of such page using PHP.

This version should preserve Rosetta Code's pages look and feel, and may be better integrated into RC site.

Bugs fix notes :

  • When PHP flag allow_url_fopen is enabled, it is possible to read contents from RC Site via local server. Then, by directly testing with RC Site, many bugs were found;
  • fixed, it seems that articles in tasks or languages' pages have at least 3 version of url. In most cases, they refer to the same file, but it seems some are not (may be re-direction?). Previously, some url can be accessed while other cannot, if only using one version of url; now all 3 version is tried. The version of '/w/index.php?title=' has highest priority, so that page like C++ will not mistaken by C page;
changed, it seems I'm wrong again. All pages can be accesses by '/wiki/Category:' version's url, only that to not mistaken C++ page with C page, url extracted from RC page have to be encoded 2 times. In most case, this '/wiki/Category:(encoded-url)' can reach the page correctly, only pages like PL/I, PL/SQL need 1 decode. No more other version of url is needed. -- badmadevil 09:14, 17 June 2008 (MDT)
  • fixed, previously, required link nodes to be got by xpath are assumed to be inside a table, but it is found that language page having 7 or less task completed didn't use a table; the later case is dealing with another proper xpath;
  • some pages have not any task completed, eg. assembler, pike, JoCaml. They are treated as error loading page, rather than display all tasks from Task-list page;
  • unsolved, there are unknown errors on parsing pages of JScript.NET & Visual Basic.NET as DOM. They can be load as DOMDocument (so that it is not a problem of url, eg.wrong encoding of url string), but can't get the required Node by getElementById inside the DOMDoc;
fixed, it is really a problem of wrong encoding, the 'dot' is not properly encoded, and the page loaded I said previously is the create new articles page. It has been fixed. All bugs should has been fixed. -- badmadevil 12:22, 16 June 2008 (MDT)
  • Usage, this version need not config, as long as allow_url_fopen is enabled. Place this script in a server (local server or RC Site) some where can be access from www, and that is it.
  • Tested with PHP 5.2.1



Sources:

<php><?php // may be need to enable allow_url_fopen, or change it to local file path define('RCHost' , 'www.rosettacode.org') ; define('ROSETTA', 'http://' . RCHost) ; define('Prefix', ROSETTA . '/wiki/Category:') ; define('TaskURL', 'Solutions_by_Programming_Task') ; define('ListURL', 'Solutions_by_Programming_Language') ;

define('LANGID', 'LANGID') ; // if use as a query string key-value pair define('NA', 'NotAvaliable') ;

$subfix = "" ; $langID = LangId() ; $IDLang = myDecode($langID) ;

// this control how to access this scrtpt $scriptURL = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['URL'] ;

function ScriptURL($langId){

 global $scriptURL, $subfix;
 
 if($langId == NA) 
   $tail = strlen($subfix) == 0 ?  : '?' . $subfix ;
 else {
   $tail = strlen($subfix) == 0 ?  : '&' . $subfix ;
   $tail = '?' . LANGID . '=' . myEncode($langId) . $tail ;
 }
 return $scriptURL . $tail ;

} function pageUrl($page) {

 global $subfix;
 $tail = strlen($subfix) == 0 ?  : '?' . $subfix ;   
 return Prefix . $page . $tail ;

} function myEncode($s) { return str_replace('.', '%252E', rawurlencode($s)) ; } function myDecode($s) { return str_replace('_', ' ' , rawurldecode($s)) ; }

function LangId(){

 global $subfix ;
 $langId = NA ;
 if(count($_SERVER['QUERY_STRING']) > 0) {
   parse_str($_SERVER['QUERY_STRING'], $query) ;
   if(array_key_exists(LANGID, $query) && strlen($query[LANGID]) > 0)
     $langId = $query[LANGID] ;
   else
     foreach($query as $key => $value)
       if(strlen($value) == 0) {         
         $query[LANGID] = $key ;
         $langId = $key ;
         unset($query[$key]) ;
         break ;
       }
   if(array_key_exists(LANGID, $query))
     unset($query[LANGID]) ;
   $subfix = http_build_query($query) ;            
 }
 return $langId ;

}

class Page extends DOMDocument {

 public $lnk , $hdr, $msg , $tds, $url, $context ;
 public $dict = array() , $ok = TRUE ;
 public $cnt = 0 , $notCnt = 0 ; // $notCnt = count of not implemented tasks
 function __construct($url, $id) {
   global $langID ;
   if($url == $langID) {
     if(!@$this->loadHTMLFile($this->url = pageURL($langID)))
       if(!@$this->loadHTMLFile($this->url = pageURL(myDecode($langID))))
         $this->ok = FALSE ;
     if($this->ok) $this->context = $this->getElementById($id) ;
   } else {
     if(@$this->loadHTMLFile($url))
       $this->context = $this->getElementById($id) ;
   }
   if($this->context) {
     $xpath = new DOMXPath($this) ;
     $this->hdr = $xpath->query('h2', $this->context)->item(0) ;
     $this->msg = $xpath->query('p',  $this->context)->item(0) ;
     if($xpath->query('table', $this->context)->length)
       $this->lnk = $xpath->query('table/tr/td/ul/li', $this->context) ;
     else // not inside a table
       $this->lnk = $xpath->query('ul/li', $this->context) ;
     $this->cnt = $this->lnk->length ;
   } else
     $this->ok = FALSE ;
 }
 function toHTML() {
   // not need if this script is inside RC site
   if(stristr($_SERVER['HTTP_HOST'], RCHost) === FALSE) {
     $head = $this->getElementsByTagName("head")->item(0) ;
     $base = $this->createElement("base") ;
     $base->setAttribute("href", ROSETTA) ;
     $head->insertBefore($base, $head->firstChild) ;
   }
   return $this->saveHTML() ;
 }
 function prepare(&$taskList) {
   $temp = array() ;
   // collect lang's task list
   for($i = 0 ; $i < $this->lnk->length ; $i++) {
     $alink = $this->lnk->item($i)->getElementsByTagName("a")->item(0) ;
     $temp[$alink->getAttribute("href")] = TRUE ;
   }
   // set diff : total tasks - lang's tasks => not completed tasks
   for($i = 0 ; $i < $taskList->length ; $i++) {
     $alink = $taskList->item($i)->getElementsByTagName("a")->item(0) ;
     if(array_key_exists($alink->getAttribute("href"), $temp) === FALSE)
       $this->dict[$this->notCnt++] = // import from Tasks into Lang
         $this->importNode($taskList->item($i),true) ;
   }
   $lang->lnk = null ; // release node ref. to be remove
   // clear All nodes under $this->context(id)'s node
   while($this->context->lastChild)
     $this->context->removeChild($this->context->lastChild) ;
   // create new hdr, msg
   $this->hdr = $this->context->appendChild($this->createElement("h2")) ;
   $this->msg = $this->context->appendChild($this->createElement("p")) ;
   // make table
   $table = $this->createElement("table") ;
   $tr = $this->createElement("tr") ;
   for($i = 0 ; $i < 3 ; $i++)
     $tr->appendChild($this->createElement("td")) ;
   $table->appendChild($tr) ;
   $this->context->appendChild($table) ;
   // get tds later work with
   $xpath = new DOMXPath($this) ;
   $this->tds = $xpath->query('table/tr/td', $this->context) ;
 }

}

function process_task(){

 global $task, $lang ;
 if($lang->notCnt == 0) {
   $lang->msg->nodeValue =
     "All {$task->cnt} simpler tasks are completed ( {$lang->cnt} " .
     "total completed tasks, some implementations and puzzles may be " .
     "not yet completed )." ;
   // no more tasks below, add a height to the table to look like a void.
   $lang->tds->item(0)->setAttribute("height", "100px") ;
 } else {
   $lang->msg->nodeValue =
     "There are {$lang->notCnt} not completed tasks " .
     "out of {$task->cnt} total tasks ( {$lang->cnt} " .
     "completed tasks, implementations and puzzles etc.)." ;
   $curr = 0 ;
   $splitMax = $lang->tds->length ;
   $splitMax = intval(($lang->notCnt + $splitMax - 1) / $splitMax) ;
   if($splitMax < 5) $splitMax = 5 ;
   $capital =  ;
   for($i = 0 ; $i < $lang->tds->length ; $i++) {
     $td = $lang->tds->item($i) ;
     $td->setAttribute("width", intval(100/$lang->tds->length) . "%") ;
     $td->setAttribute("valign", "top") ;
     $ul = NULL ;
     $splitCnt = 0 ;
     while($curr < $lang->notCnt && $splitCnt < $splitMax) {
       $li = $lang->dict[$curr] ;
       $heading = $capital ;
       $title = $li->getElementsByTagName("a")->item(0)->getAttribute("title") ;
       $capital = strtoupper(substr($title, 0, 1)) ;
       if($splitCnt == 0) {
         if($capital == $heading)
           $h3 = $lang->createElement("h3", $capital . " cont.") ;
         else
           $h3 = $lang->createElement("h3", $capital) ;
         $td->appendChild($h3) ;
         $ul = $lang->createElement("ul") ;
       } else if($capital != $heading) {
         $td->appendChild($ul) ;
         $h3 = $lang->createElement("h3", $capital) ;
         $td->appendChild($h3) ;
         $ul = $lang->createElement("ul") ;
       }
       $ul->appendChild($li) ;
       $curr++ ;
       $splitCnt++ ;
     }
     if($ul) $td->appendChild($ul) ;
   }
 }

} function process_list(){ // replace languages link with corresponding scriptURL

 global $list ;
 for($i = 0 ; $i < $list->lnk->length ; $i++) {
   $alink = $list->lnk->item($i)->getElementsByTagName("a")->item(0) ;
   $href = $alink->getAttribute("href") ;
   $idLang = substr($href, 1 + strrpos($href,":")) ;
   $alink->setAttribute("href", ScriptURL($idLang)) ;
 }

} function linkText(&$node, $pre, $href, $text, $post) {

 $doc = $node->ownerDocument ;
 if($pre ) $node->appendChild($doc->createElement("span", $pre)) ;
 if($href) {
   if(!$text) $text = 'null' ;
   $alink = $doc->createElement("a", $text) ;
   $alink->setAttribute("href", $href) ;
   $alink->setAttribute("title", $text) ;
   $node->appendChild($alink) ;
 }
 if($post) $node->appendChild($doc->createElement("span", $post)) ;

}

/*

*   Main Body
*/

if($langID != NA) {

 $lang = new Page($langID, 'mw-pages') ;
 if($lang->ok) {
   $task = new Page(pageURL(TaskURL), 'mw-pages') ;
   if($task->ok)
     $lang->prepare($task->lnk) ;
 }

}

if($langID != NA && $lang->ok && $task->ok) {

 linkText($lang->hdr, 'Not Completed Tasks by ', $lang->url, $IDLang, NULL) ;
 linkText($lang->hdr, ' ( ', ScriptURL(NA), 'Other Languages', ' ) ') ;
 process_task() ;
 echo $lang->toHTML() ;

} else {

 $list = new Page(pageURL(ListURL), 'mw-subcategories') ;
 if($list->ok) {
   if($langID == NA)
     $list->hdr->nodeValue = 'Not Completed Tasks by Languages' ;
   else {
     $list->hdr->removeChild($list->hdr->lastChild) ;
     linkText($list->hdr, 'Not Completed Tasks by Languages ( "',
       $lang->url, $IDLang, '" hasn\'t any task completed yet ) ') ;
   }
   process_list() ;
   echo $list->toHTML() ;
 }
 else
   echo '<html><body>

Unknown Error, <a href="' . ROSETTA . '">Return Rosetta Code Main Page</a> or <a href="javascript:history.go(-1) ;">Go Back</a>.

         </body></html>' ;

} ?></php>

Hope it can be a temporary solution. -- badmadevil 12:33, 22 June 2008 (UTC)