Extension:Astro

From MediaWiki.org
Jump to: navigation, search
MediaWiki extensions manual
Crystal Clear action run.png
Astro

Release status: experimental

Implementation Tag
Database changes No
License GPL v2+
Download See below

Translate the Astro extension if it is available at translatewiki.net

Check usage and version matrix; code metrics

The Astro extension provides capabilities to parse Astronomical Equatorial coordinates and pass results into an article.

Install[edit | edit source]

Create a file called 'astro_extension.php' in your extensions/ directory, and add the following code:

Code[edit | edit source]

<?php
# Astro Extension
# Extract astronomical coordinates from astro_params http request's parameter.
#
# Example Code
#
# <astro>{ra_hour}<sup>h</sup>&nbsp;{ra_min}<sup>m</sup>&nbsp;{ra_sec}<sup>s</sup>&nbsp;{dec_deg}&deg;&nbsp;{dec_min}&prime;&nbsp;{dec_sec}&Prime;</astro>
#

$wgExtensionFunctions[] = "wfAstroExtension";
$wgExtensionCredits['parserhook'][] = array(
        'name' => 'Astro',
        'author' => 'Friendlystar',
        'description' => 'adds &lt;astro&gt; tag, for astronomical coordinates insertion ',
        'url' => 'http://www.mediawiki.org/wiki/Extension:Astro'
);

/* DO NOT EDIT BEYOND THIS LINE */

function wfAstroExtension() {
    global $wgParser;
    $wgParser->setHook( "astro", "astro" );
    $wgParser->setHook( "astro_ra", "astro_ra" );
    $wgParser->setHook( "astro_dec", "astro_dec" );
}

# The callback function for converting the input text to HTML output
function astro($input)
{
        global $wgRequest, $wgOut;
        #$input = $wgOut->parse($input, false);
        #return $input;
        #
        /*
        #new method to parse: http://meta.wikimedia.org/wiki/MediaWiki_extensions_FAQ
     $localParser = new Parser();
     $output = $localParser->parse("<big>$input</big>", $parser->mTitle, $parser->mOptions);
     $text = $output->getText();
        */

        $title = $wgRequest->getVal( 'title', false );
        $mTitle = Title::makeTitle( NS_MAIN, $title );
        $coor = $wgRequest->getVal( 'astro_params', false );
        if ($coor) {
                $p = new astro_coord( $coor );
                if ($p->error) {
                        return $p->error;
                } else {
                        $search = array(
                                "{ra}", "{ra_hour}", "{ra_min}", "{ra_sec}", "{ra-in-deg}",
                                "{dec}", "{dec_deg}", "{dec_min}", "{dec_sec}",
                                "{dec_deg_url}", "{dec_deg_html}",
                                "{angle}", "{angle-in-deg}", "{view}",
                                "{box}", "{box_size}", "{box_width}", "{box_height}",  "{box_color}",
                                "{name}" );
                        $replace = array(
                                $p->ra, $p->ra_hour, $p->ra_min, $p->ra_sec, $p->ra*15,
                                $p->dec, $p->dec_deg, $p->dec_min, $p->dec_sec,
                                str_replace( '+', '%2B', $p->dec_deg), str_replace( '-', '&minus;', $p->dec_deg),
                                $p->angle, $p->angle/60, $wgRequest->getVal( 'view', '' ),
                                $wgRequest->getVal( 'astro_pointer', '' ), $wgRequest->getVal( 'astro_pointer_size', '' ),  $wgRequest->getVal( 'astro_pointer_width', '' ),  $wgRequest->getVal( 'astro_pointer_height', '' ),  $wgRequest->getVal( 'astro_pointer_color', '' ),
                                $p->name
                        );
                        #return $wgParser->parse(str_replace( $search, $replace, $input ), $mTitle, ParserOptions::newFromUser($wgUser), false, false)->getText();
                        return str_replace( $search, $replace, $input );
                }
        } else {
                return "(Undefined)";
        }
        /**/
}

# The callback function for converting the input text to HTML output
function astro_ra($input)
{
        global $wgRequest;
        $coor = $wgRequest->getVal( 'astro_params', false );
        if ($coor) {
                $p = new astro_param( $coor, $title );
                return $p->ra;
        }
        return $text;
}

# The callback function for converting the input text to HTML output
function astro_dec($input)
{
        global $wgRequest;
        $coor = $wgRequest->getVal( 'astro_params', false );
        if ($coor) {
                $p = new astro_param( $coor, $title );
                return $p->dec;
        }
        return $text;
}


/**
 *   Parse astro parameters
 */

class astro_coord {
        var $ra;
        var $dec;

        var $ra_hour;
        var $ra_min;
        var $ra_sec;
        var $dec_deg;
        var $dec_min;
        var $dec_sec;
        var $angle;
        var $name;

        var $pieces;
        var $error;
        var $coor;
        var $title;

        /**
         *   Constructor:
         *   Read coordinates, and if there is a range, read the range
         */

        function astro_coord( $param )
        {
                $this->pieces = explode(" ", str_replace( '  ', ' +', str_replace( '_', ' ', $param ) ));
                if ($i = strpos($this->pieces[0],';')) {
                        /* ra;dec (two values seperated by a semicolon) */
                        $this->ra = substr($this->pieces[0],0,$i);
                        $this->dec = substr($this->pieces[0],$i+1);
                        array_shift($this->pieces);
                        $this->angle = array_shift($this->pieces);
                        $this->name = array_shift($this->pieces);
                    $this->dec = str_replace( '&minus;', '-', str_replace( '\u2212', '-', $this->dec ) );
                        $this->ra_hour = floor($this->ra);
                        $this->ra_min = floor(($this->ra-$this->ra_hour)*60);
                        $this->ra_sec = round((($this->ra-$this->ra_hour)*60-$this->ra_min)*60*10000)/10000;
                    $decfactor = 1.0 ;
                    if (strpos($this->dec,'-')!==false) {
                        $decfactor = -1.0 ;
                        $this->dec = -$this->dec;
                    }
                    $dec_int = floor($this->dec);
                        $this->dec_deg = ($decfactor==1.0?'+':'-').$dec_int;
                        $this->dec_min = floor(($this->dec-$dec_int)*60);
                        $this->dec_sec = round((($this->dec-$dec_int)*60-$this->dec_min)*60*10000)/10000;
                } else {
                        $this->ra_hour  = array_shift($this->pieces);
                        $this->ra_min   = array_shift($this->pieces);
                        $this->ra_sec   = array_shift($this->pieces);
                        $this->dec_deg  = array_shift($this->pieces);
                        $this->dec_min  = array_shift($this->pieces);
                        $this->dec_sec  = array_shift($this->pieces);
                        $this->angle    = array_shift($this->pieces);
                        $this->name     = array_shift($this->pieces);
                    $decfactor = 1.0 ;
                    $this->dec_deg = str_replace( '&minus;', '-', str_replace( '\u2212', '-', $this->dec_deg ) );
                    if (strpos($this->dec_deg,'-')!==false) {
                        $decfactor = -1.0 ;
                    }
                    $this->ra = $this->ra_hour + $this->ra_min/60.0 + $this->ra_sec/3600.0;
                    $this->dec = $this->dec_deg + $decfactor*($this->dec_min/60.0 + $this->dec_sec/3600.0);

                    if (strpos($this->dec_deg,'-')===false && strpos($this->dec_deg,'+')===false) {
                        $this->dec_deg = '+' . $this->dec_deg;
                    }
                }


                if ($this->ra >  24 or $this->ra <  0
                 or $this->dec > 90 or $this->dec < -90
                 or $ra_min > 60 or $ra_min < 0
                 or $dec_min > 60 or $dec_min < 0
                 or $ra_sec > 60 or $ra_sec < 0
                 or $dec_sec > 60 or $dec_sec < 0) {
                        $this->error = "Out of range";
                }
        }
}

LocalSettings changes[edit | edit source]

Then simply add the following line to the end of your LocalSettings.php file:

include("extensions/astro_extension.php");

You also have to make sure the page with extension is not cached. One of the ways to turn off cache is to add line in your LocalSettings.php file:

$wgCachePages = false;

and you are ready to go! Go to the sandbox and see if it works!

Usage[edit | edit source]

Basic syntax for embedding data in article, as detailed in the code:

<astro>{ra_hour}h {ra_min}m {ra_sec}s  {dec_deg_html}° {dec_min}′ {dec_sec}″</astro>

For details go to http://wikisky.org/w/index.php?title=Astro_extension&astro_params=12_22_54.9_+15_49_21_15_M100

Feel free to contact me [[w:User talk:Friendlystar<Friendlystar]]

Comments[edit | edit source]

Warning: Default sort key "Astro" overrides earlier default sort key "ASTRO".