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)

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;
  • 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;
  • 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' , 'rosettacode.org') ; define('ROSETTA', 'http://' . RCHost) ;

// 3 version of url prefix, when loading the Specific Language Page, // they will be tried one by one define('SafeURL', ROSETTA . '/w/index.php?title=') ; define('Prefix', ROSETTA . '/wiki/Category:') ; define('LastTry', ROSETTA . '/wiki/') ;

define('PAGENAME', 'PAGENAME') ; // if use as a query string key-value pair define('NA', 'Not Avaliable') ;

define('TaskURL', Prefix . 'Solutions_by_Programming_Task') ; define('ListURL', Prefix . 'Solutions_by_Programming_Language') ;

$langID = LangId() ; $IDLang = rawurldecode($langID) ;

// this control how to access this scrtpt $scriptURL = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['URL'] ; function ScriptURL($langId = NA){

 global $langID, $scriptURL ;
 if($langId == NA) $langId = $langID ;
 return $scriptURL . ($langId == NA ? "" : '?' . rawurlencode($langId)) ;

}

class Page extends DOMDocument {

 public $lnk , $id , $hdr, $msg , $tds ;
 public $dict = array() , $ok = FALSE ;
 public $cnt = 0 , $notCnt = 0 ; // $notCnt = count of not implemented tasks
 public $context  ;
 function __construct($url, $id, $isLangFile = FALSE) {
   global $langID ;
   $this->id = $id ;
   if($isLangFile) { 
     if($this->langURL(SafeURL)) // try one by one
       if($this->langURL(Prefix))
         $this->langURL(LastTry) ;         
   } else {
     @$this->loadHTMLFile($url) ;
     $this->context = $this->getElementById($this->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) ;
     $this->lnk = $xpath->query('table/tr/td/ul/li', $this->context) ;
     if($this->lnk && $this->lnk->length > 0) {
       $this->cnt = $this->lnk->length ;
       $this->ok = TRUE ;
     } else { // not inside a table
       $this->lnk = $xpath->query('ul/li', $this->context) ;
       if($this->lnk) { // may be zero task completed?
         $this->cnt = $this->lnk->length ;
         $this->ok = TRUE ;
       }       
     }
   }
 }
 function langURL($prefix) {
   global $langID ;
   $FAIL = TRUE ;
   if(@$this->loadHTMLFile($prefix . $langID))
     if($this->context = $this->getElementById($this->id))
       $FAIL = FALSE ;
   return $FAIL ;
 }
 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 makeDict(&$taskList) {
   global $scriptURL ;
   $temp = array() ;
   // collect lang's task list
   for($i = 0 ; $i < $this->lnk->length ; $i++) {
     $alink = $this->lnk->item($i)->getElementsByTagName("a")->item(0) ;
     $href = $alink->getAttribute("href") ;
     $temp[$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) ;
     $href = $alink->getAttribute("href") ;
     if(array_key_exists($href, $temp) === FALSE)
       $this->dict[$this->notCnt++] = // import from Tasks to Lang
         $this->importNode($taskList->item($i),true) ;
   }
   // clone hdr, msg
   $hdr = $this->hdr->cloneNode(TRUE) ;
   $msg = $this->msg->cloneNode(TRUE) ;
   // clear All nodes under $this->context(id)'s node    
   $context = $this->context ;
   $this->context = $context->cloneNode() ; // shallow copy, remove all child
   $context->parentNode->replaceChild($this->context, $context) ;
   // append hdr, msg back
   $this->hdr = $this->context->appendChild($hdr) ;      
   $this->msg = $this->context->appendChild($msg) ;  
   // 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) ; 
   // insert a languages list link
   $alink = $this->createElement("a", "Other Languages") ;
   $alink->setAttribute("href", $scriptURL) ;
   $alink->setAttribute("title", "Not completed tasks by other languages") ;
   $style = 'float:right;clear:right;position:relative;top:8px;' .
     'background-color:#eec;padding:2px 8px 2px 8px;';   
   $alink->setAttribute("style", $style) ;
   $this->context->insertBefore($alink, $this->hdr) ;    
 }

}

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 = intval(($lang->notCnt + 2) / 3) ;
   if($splitMax < 5) $splitMax = 5 ;
   $capital =  ;
   $lang->lnk = null ; // release node ref. to be remove
   for($i = 0 ; $i < $lang->tds->length ; $i++) {
     $td = $lang->tds->item($i) ;
     $td->setAttribute("width", "33%") ;
     $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 LangId(){

 $langId = NA ;
 if(count($_GET) > 0) {
   if(array_key_exists(PAGENAME, $_GET) && strlen($_GET[PAGENAME]) > 0)
     $langId = $_GET[PAGENAME] ;
   else {
     $keys = array_keys($_GET) ;
     if(count($keys) > 0 && strlen($keys[0]) > 0)
       $langId = $keys[0] ;
   }
 }
 return $langId ;

}

/*

*   Main Body
*/

if($langID != NA) {

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

}

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

 $lang->hdr->nodeValue = 'Not Completed Tasks by ' . $IDLang ;
 process_task() ;
 echo $lang->toHTML() ;

} else {

 $list = new Page(ListURL, 'mw-subcategories') ;
 if($list->ok) {
   if($langID == NA)
     $list->hdr->nodeValue = 'Not Completed Tasks by Languages' ;
   else
     $list->hdr->nodeValue = 'Not Completed Tasks by Languages ( "'
       . $IDLang . '" has no task completed or page error) '  ;
   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 06:01, 16 June 2008 (MDT)

Return to the user page of "Badmadevil".