User talk:Badmadevil

From Rosetta Code

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)

Theme problems

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) I'm really not seeing the issues you're talking about. Perhaps your font size is larger than normal? Ctrl + 0 or View > Zoom > Reset. --qrush 19:54, 22 June 2008 (UTC)

oops... then my browser setting problem is the most possible explanation, sorry for the extra work. (btw, in my FF3, by changing zoom, it only affect the size of top-left logo's Rosetta Code text if zoom text only, else everything is proportional) -- badmadevil 04:08, 23 June 2008 (UTC)
This should be fixed. Give the skim another try. --Short Circuit 00:14, 14 February 2009 (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)