diff --git a/_define.php b/_define.php new file mode 100644 index 0000000..9a6684c --- /dev/null +++ b/_define.php @@ -0,0 +1,28 @@ +registerModule( + /* Name */ 'lunarPhase', + /* Description */ 'Display the moon phases', + /* Author */ 'Tomtom, Pierre Van Glabeke', + /* Verion */ '1.5', + /* Properties */ + array( + 'permissions' => 'usage,contentadmin', + 'type' => 'plugin', + 'dc_min' => '2.7', + 'support' => 'http://lab.dotclear.org/wiki/plugin/lunarPhase', + 'details' => 'http://plugins.dotaddict.org/dc2/details/lunarPhase' + ) +); \ No newline at end of file diff --git a/_prepend.php b/_prepend.php new file mode 100644 index 0000000..99ee36c --- /dev/null +++ b/_prepend.php @@ -0,0 +1,16 @@ +addBehavior('publicHeadContent',array('lunarPhaseBehaviors','addCss')); + +class lunarPhaseBehaviors +{ + /** + This function add CSS file in the public header + */ + public static function addCss() + { + global $core; + + $url = $core->blog->getQMarkURL().'pf='.basename(dirname(__FILE__)).'/style.css'; + + echo ''; + } +} + +class lunarPhasePublic +{ + /** + Displays lunarphase widget + + @param w dcWidget dcWidget object + @return string HTML code of widget + */ + public static function widget($w) + { + global $core; + + if ($w->offline) + return; + + $lp = new lunarPhase(); + + if (($w->homeonly == 1 && $core->url->type != 'default') || + ($w->homeonly == 2 && $core->url->type == 'default')) { + return; + } + + $res = + ($w->title ? $w->renderTitle(html::escapeHTML($w->title)) : ''); + + # Get live content + $res .= lunarPhasePublic::getLive($w,$lp); + # Get prevision content + $res .= lunarPhasePublic::getPrevisions($w,$lp); + + return $w->renderDiv($w->content_only,'lunarphase '.$w->class,'',$res); + + } + + /** + Returns "live" part of lunarphase widget + + @param w dcWidget dcWidget object + @param lp lunarPhaset lunarPhase object + @return string Live HTML part + */ + public static function getLive($w,$lp) + { + $ul_mask = ''; + $li_mask = '
  • %1$s
  • '; + $live = $lp->getLive(); + $res = ''; + + # Phase + if ($w->phase) { + $res .= sprintf($li_mask,$live['name'],$live['id']); + } + # Illumination + if ($w->illumination) { + $res .= + sprintf($li_mask,sprintf(__('Illumination: %s%%'), + lunarPhasePublic::formatValue('percent',$live['illumination'])), + 'illumination'); + } + # Moon's age + if ($w->age) { + $res .= + sprintf($li_mask,sprintf(__('Age of moon: %s days'), + lunarPhasePublic::formatValue('int',$live['age'])), + 'age'); + } + # Distance from earth + if ($w->dist_to_earth) { + $res .= + sprintf($li_mask,sprintf(__('Distance to earth: %s km'), + lunarPhasePublic::formatValue('int',$live['dist_to_earth'])), + 'dist_to_earth'); + } + # Distance from sun + if ($w->dist_to_sun) { + $res .= + sprintf($li_mask,sprintf(__('Distance to sun: %s km'), + lunarPhasePublic::formatValue('int',$live['dist_to_sun'])), + 'dist_to_sun'); + } + # Moon's angle + if ($w->moon_angle) { + $res .= + sprintf($li_mask,sprintf(__('Angle of moon: %s deg'), + lunarPhasePublic::formatValue('deg',$live['moon_angle'])), + 'moon_angle'); + } + # Sun's angle + if ($w->sun_angle) { + $res .= + sprintf($li_mask,sprintf(__('Angle of sun: %s deg'), + lunarPhasePublic::formatValue('deg',$live['sun_angle'])), + 'sun_angle'); + } + # Parallax + if ($w->parallax) { + $res .= + sprintf($li_mask,sprintf(__('Parallax: %s deg'), + lunarPhasePublic::formatValue('deg',$live['parallax'])), + 'parallax'); + } + + if (strlen($res) > 0) { + return + '

    '.__('In live').'

    '. + sprintf($ul_mask,$res,'lunarphase'); + } + } + + /** + Returns "previsions" part of lunarphase widget + + @param w dcWidget dcWidget object + @param lp lunarPhaset lunarPhase object + @return string previsions HTML part + */ + public static function getPrevisions($w,$lp) + { + $ul_mask = ''; + $li_mask = '
  • %1$s
  • '; + $res = ''; + + if ($w->previsions) { + foreach ($lp->getPrevisions() as $k => $v) { + $res .= sprintf($li_mask,lunarPhasePublic::formatValue('date',$v['date']),$k,$v['name']); + } + } + + if (strlen($res) > 0) { + return + '

    '.__('Previsions').'

    '. + sprintf($ul_mask,$res,'lunarphase'); + } + } + + /** + Returns value passed in argument with a correct format + + @param type string Type of convertion + @param value mixed Value to convert + @return mixed Converted value + */ + public static function formatValue($type = '',$value) + { + $res = ''; + $format = $GLOBALS['core']->blog->settings->system->date_format.' - '; + $format .= $GLOBALS['core']->blog->settings->system->time_format; + $tz = $GLOBALS['core']->blog->settings->system->blog_timezone; + + switch ($type) { + case 'int': + $res = number_format($value,0); + break; + case 'float': + $res = number_format($value,2); + break; + case 'percent': + $res = number_format($value * 100,0); + break; + case 'date': + $res = dt::str($format,$value,$tz); + break; + case 'deg': + $res = number_format(($value * (180.0 / M_PI)),2); + break; + default: + $res = $value; + break; + } + + return $res; + } +} \ No newline at end of file diff --git a/_widgets.php b/_widgets.php new file mode 100644 index 0000000..0ffb6ae --- /dev/null +++ b/_widgets.php @@ -0,0 +1,44 @@ +addBehavior('initWidgets',array('lunarPhaseWidgets','initWidgets')); + +class lunarPhaseWidgets +{ + public static function initWidgets($w) + { + $w->create('lunarphase',__('LunarPhase: moon phases'),array('lunarPhasePublic','widget'), + null, + __('Display the moon phases')); + $w->lunarphase->setting('title',__('Title:'),__('Moon phases')); + $w->lunarphase->setting('phase',__('Display actual phase of moon'),1,'check'); + $w->lunarphase->setting('illumination',__('Display actual illumination of moon'),1,'check'); + $w->lunarphase->setting('age',__('Display actual age of moon'),1,'check'); + $w->lunarphase->setting('dist_to_earth',__('Display actual distance between moon and earth'),1,'check'); + $w->lunarphase->setting('dist_to_sun',__('Display actual distance between moon and sun'),1,'check'); + $w->lunarphase->setting('moon_angle',__('Display actual angle of moon'),1,'check'); + $w->lunarphase->setting('sun_angle',__('Display actual angle of sun'),1,'check'); + $w->lunarphase->setting('parallax',__('Display actual parallax of moon'),1,'check'); + $w->lunarphase->setting('previsions',__('Display all previsions for the next moon phases'),1,'check'); + $w->lunarphase->setting('homeonly',__('Display on:'),0,'combo', + array( + __('All pages') => 0, + __('Home page only') => 1, + __('Except on home page') => 2 + ) + ); + $w->lunarphase->setting('content_only',__('Content only'),0,'check'); + $w->lunarphase->setting('class',__('CSS class:'),''); + $w->lunarphase->setting('offline',__('Offline'),0,'check'); + } +} \ No newline at end of file diff --git a/changelog b/changelog new file mode 100644 index 0000000..bb1823e --- /dev/null +++ b/changelog @@ -0,0 +1,15 @@ +v1.5 (23/04/2015) Pierre Van Glabeke : +modification url support + +v1.4 (06/02/2015) Pierre Van Glabeke : +modifications localisation + +v1.3 (14/12/2014) Pierre Van Glabeke : +compatibilité dc2.7 + +v1.2 (17/02/2014) : +reprise par Pierre Van Glabeke +correction bug (waning_crescent_moon) +images refaites (merci à 999Diaoul) +compatibilité dc2.6 +fin de ligne unix \ No newline at end of file diff --git a/img/fm.png b/img/fm.png new file mode 100644 index 0000000..9d2d572 Binary files /dev/null and b/img/fm.png differ diff --git a/img/fqm.png b/img/fqm.png new file mode 100644 index 0000000..359d9b2 Binary files /dev/null and b/img/fqm.png differ diff --git a/img/nm.png b/img/nm.png new file mode 100644 index 0000000..95f4e53 Binary files /dev/null and b/img/nm.png differ diff --git a/img/tqm.png b/img/tqm.png new file mode 100644 index 0000000..41c75ba Binary files /dev/null and b/img/tqm.png differ diff --git a/img/wcm1.png b/img/wcm1.png new file mode 100644 index 0000000..0c15754 Binary files /dev/null and b/img/wcm1.png differ diff --git a/img/wcm2.png b/img/wcm2.png new file mode 100644 index 0000000..f399a1b Binary files /dev/null and b/img/wcm2.png differ diff --git a/img/wgm1.png b/img/wgm1.png new file mode 100644 index 0000000..4651a73 Binary files /dev/null and b/img/wgm1.png differ diff --git a/img/wgm2.png b/img/wgm2.png new file mode 100644 index 0000000..197db89 Binary files /dev/null and b/img/wgm2.png differ diff --git a/inc/class.lunarphase.php b/inc/class.lunarphase.php new file mode 100644 index 0000000..1e59a47 --- /dev/null +++ b/inc/class.lunarphase.php @@ -0,0 +1,213 @@ +live = new ArrayObject; + $this->previsions = new ArrayObject; + + $this->setLive(); + $this->setPrevisions(); + } + + public function getLive() + { + return $this->live; + } + + public function getPrevisions() + { + return $this->previsions; + } + + private function setLive() + { + $day = $this->jTime(time()) - self::epoch; + + # Calculate sun's position and angle + $N = $this->fixAngle((360 / 365.2422) * $day); + $M = $this->fixAngle($N + self::elonge - self::elongp); + $Ec = $this->kepler($M, self::eccent); + $Ec = sqrt((1 + self::eccent) / (1 - self::eccent)) * tan($Ec / 2); + $Ec = 2 * $this->toDeg(atan($Ec)); + $lambdaSun = $this->fixAngle($Ec + self::elongp); + $F = ((1 + self::eccent * cos($this->toRad($Ec))) / (1 - self::eccent * self::eccent)); + + # Calculate moon's age, position and angle + $ml = $this->fixAngle(13.1763966 * $day + self::mmLong); + $MM = $this->fixAngle($ml - 0.1114041 * $day - self::mmLongp); + $MN = $this->fixAngle(self::mlNode - 0.0529539 * $day); + $Ev = 1.2739 * sin($this->toRad(2 * ($ml - $lambdaSun) - $MM)); + $Ae = 0.1858 * sin($this->toRad($M)); + $A3 = 0.37 * sin($this->toRad($M)); + $MmP = $MM + $Ev - $Ae - $A3; + $mEc = 6.2886 * sin($this->toRad($MmP)); + $A4 = 0.214 * sin($this->toRad(2 * $MmP)); + $lP = $ml + $Ev + $mEc - $Ae + $A4; + $V = 0.6583 * sin($this->toRad(2 * ($lP - $lambdaSun))); + $lPP = $lP + $V; + $NP = $MN - 0.16 * sin($this->toRad($M)); + $y = sin($this->toRad($lPP - $NP)) * cos($this->toRad(self::mInc)); + $x = cos($this->toRad($lPP - $NP)); + $lambdaMoon = $this->toDeg(atan2($y, $x)); + $lambdaMoon += $NP; + $mage = $lPP - $lambdaSun; + $BetaM = $this->toDeg(asin(sin($this->toRad($lPP - $NP)) * sin($this->toRad(self::mInc)))); + + $this->live['illumination'] = (1 - cos($this->toRad($mage))) / 2; + $this->live['age'] = self::synodic * ($this->fixAngle($mage) / 360.0); + $this->live['dist_to_earth'] = (self::msMax * (1 - self::mEcc * self::mEcc)) / (1 + self::mEcc * cos($this->toRad($MmP + $mEc))); + $this->live['dist_to_sun'] = self::sunsMax / $F; + $this->live['sun_angle'] = $F * self::sunAngSiz; + $this->live['moon_angle'] = self::mAngSiz / ($this->live['dist_to_earth'] / self::msMax); + $this->live['parallax'] = self::mParallax / ($this->live['dist_to_earth'] / self::msMax); + + $this->setPhase(); + } + + private function setPhase() + { + if ($this->live['age'] >= self::synodic || $this->live['age'] <= self::synodic/8) { + $this->live['id'] = 'new_moon'; + $this->live['name'] = __('New moon'); + } + elseif ($this->live['age'] >= self::synodic/8 && $this->live['age'] <= self::synodic/4) { + $this->live['id'] = 'waxing_crescent_moon'; + $this->live['name'] = __('Waxing crescent moon'); + } + elseif ($this->live['age'] >= self::synodic/4 && $this->live['age'] <= self::synodic*3/8) { + $this->live['id'] = 'first_quarter_moon'; + $this->live['name'] = __('First quarter moon'); + } + elseif ($this->live['age'] >= self::synodic*3/8 && $this->live['age'] <= self::synodic/2) { + $this->live['id'] = 'waxing_gibbous_moon'; + $this->live['name'] = __('Waxing gibbous moon'); + } + elseif ($this->live['age'] >= self::synodic/2 && $this->live['age'] <= self::synodic*5/8) { + $this->live['id'] = 'full_moon'; + $this->live['name'] = __('Full moon'); + } + elseif ($this->live['age'] >= self::synodic*5/8 && $this->live['age'] <= self::synodic*3/4) { + $this->live['id'] = 'waning_gibbous_moon'; + $this->live['name'] = __('Waning gibbous moon'); + } + elseif ($this->live['age'] >= self::synodic*3/4 && $this->live['age'] <= self::synodic*7/8) { + $this->live['id'] = 'last_quarter_moon'; + $this->live['name'] = __('Last quarter moon'); + } + elseif ($this->live['age'] >= self::synodic*7/8 && $this->live['age'] <= self::synodic) { + $this->live['id'] = 'waning_crescent_moon'; + $this->live['name'] = __('Waning crescent moon'); + } + } + + private function setPrevisions() + { + $ts_day = 24*60*60; + $ts_synodic = self::synodic * $ts_day; + $start = time() - $this->live['age'] * $ts_day; + + $this->previsions['waxing_crescent_moon'] = array( + 'name' => __('Waxing crescent moon'), + 'date' => $start + $ts_synodic / 8 + ); + $this->previsions['first_quarter_moon'] = array( + 'name' => __('First quarter moon'), + 'date' => $start + $ts_synodic / 4 + ); + $this->previsions['waxing_gibbous_moon'] = array( + 'name' => __('Waxing gibbous moon'), + 'date' => $start + $ts_synodic * 3 / 8 + ); + $this->previsions['full_moon'] = array( + 'name' => __('Full moon'), + 'date' => $start + $ts_synodic / 2 + ); + $this->previsions['waning_gibbous_moon'] = array( + 'name' => __('Waning gibbous moon'), + 'date' => $start + $ts_synodic * 5 / 8 + ); + $this->previsions['last_quarter_moon'] = array( + 'name' => __('Last quarter moon'), + 'date' => $start + $ts_synodic * 3 / 4 + ); + $this->previsions['waning_crescent_moon'] = array( + 'name' => __('Waning crescent moon'), + 'date' => $start + $ts_synodic * 7 / 8 + ); + $this->previsions['new_moon'] = array( + 'name' => __('New moon'), + 'date' =>$start + $ts_synodic + ); + } + + private function fixAngle($x) + { + return ($x - 360.0 * (floor($x / 360.0))); + } + + private function toRad($x) + { + return ($x * (M_PI / 180.0)); + } + + private function toDeg($x) + { + return ($x * (180.0 / M_PI)); + } + + private function jTime($t) + { + return ($t / 86400) + 2440587.5; + } + + private function kepler($m, $ecc) + { + $delta = null; + $EPSILON = 1e-6; + + $m = $this->toRad($m); + $e = $m; + while (abs($delta) > $EPSILON) + { + $delta = $e - $ecc * sin($e) - $m; + $e -= $delta / (1 - $ecc * cos($e)); + } + return ($e); + } +} \ No newline at end of file diff --git a/locales/fr/main.po b/locales/fr/main.po new file mode 100644 index 0000000..fd4fec7 --- /dev/null +++ b/locales/fr/main.po @@ -0,0 +1,133 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: lunarPhase 1.1-RC2\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2010-09-30T22:49:45+00:00\n" +"Last-Translator: Thomas Bouron\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Display the moon phases" +msgstr "Afficher les phases de la Lune et autres données" + +#: _public.php:84 +msgid "Illumination: %s%%" +msgstr "Illumination : %s%%" + +#: _public.php:91 +msgid "Age of moon: %s days" +msgstr "Age de la Lune : %s jours" + +#: _public.php:98 +msgid "Distance to earth: %s km" +msgstr "Distance à la Terre : %s km" + +#: _public.php:105 +msgid "Distance to sun: %s km" +msgstr "Distance au Soleil : %s km" + +#: _public.php:112 +msgid "Angle of moon: %s deg" +msgstr "Angle de la Lune : %s deg" + +#: _public.php:119 +msgid "Angle of sun: %s deg" +msgstr "Angle du Soleil : %s deg" + +#: _public.php:126 +msgid "Parallax: %s deg" +msgstr "Parallaxe : %s deg" + +#: _public.php:133 +msgid "In live" +msgstr "En direct" + +#: _public.php:159 +msgid "Previsions" +msgstr "Prévisions" + +#: _widgets.php:20 +msgid "LunarPhase: moon phases" +msgstr "LunarPhase : phases de la Lune" + +#: _widgets.php:22 +msgid "Moon phases" +msgstr "Phases de la Lune" + +#: _widgets.php:24 +msgid "Display actual phase of moon" +msgstr "Afficher la phase actuelle de la Lune" + +#: _widgets.php:25 +msgid "Display actual illumination of moon" +msgstr "Afficher le taux d'illumination actuel de la Lune" + +#: _widgets.php:26 +msgid "Display actual age of moon" +msgstr "Afficher l'âge actuel de la Lune" + +#: _widgets.php:27 +msgid "Display actual distance between moon and earth" +msgstr "Afficher la distance actuelle entre la Terre et la Lune" + +#: _widgets.php:28 +msgid "Display actual distance between moon and sun" +msgstr "Afficher la distance actuelle entre le Soleil et la Lune" + +#: _widgets.php:29 +msgid "Display actual angle of moon" +msgstr "Afficher l'angle actuel de la Lune" + +#: _widgets.php:30 +msgid "Display actual angle of sun" +msgstr "Afficher l'angle actuel du Soleil" + +#: _widgets.php:31 +msgid "Display actual parallax of moon" +msgstr "Afficher la parallaxe actuelle de la Lune" + +#: _widgets.php:32 +msgid "Display all previsions for the next moon phases" +msgstr "Afficher toutes les prévisions des prochaines lunaisons" + +#: inc/class.lunarphase.php:107 +#: inc/class.lunarphase.php:174 +msgid "New moon" +msgstr "Nouvelle lune" + +#: inc/class.lunarphase.php:111 +#: inc/class.lunarphase.php:146 +msgid "Waxing crescent moon" +msgstr "Lune croissante" + +#: inc/class.lunarphase.php:115 +#: inc/class.lunarphase.php:150 +msgid "First quarter moon" +msgstr "Premier quartier" + +#: inc/class.lunarphase.php:119 +#: inc/class.lunarphase.php:154 +msgid "Waxing gibbous moon" +msgstr "Lune gibbeuse croissante" + +#: inc/class.lunarphase.php:123 +#: inc/class.lunarphase.php:158 +msgid "Full moon" +msgstr "Pleine lune" + +#: inc/class.lunarphase.php:127 +#: inc/class.lunarphase.php:162 +msgid "Waning gibbous moon" +msgstr "Lune gibbeuse décroissante" + +#: inc/class.lunarphase.php:131 +#: inc/class.lunarphase.php:166 +msgid "Last quarter moon" +msgstr "Dernier quartier" + +#: inc/class.lunarphase.php:135 +#: inc/class.lunarphase.php:170 +msgid "Waning crescent moon" +msgstr "Lune décroissante" \ No newline at end of file diff --git a/style.css b/style.css new file mode 100644 index 0000000..2bed568 --- /dev/null +++ b/style.css @@ -0,0 +1,8 @@ +#sidebar .lunarphase ul li.new_moon{background:transparent url(index.php?pf=lunarPhase/img/nm.png) no-repeat left 0.2em;padding-left:2em;} +#sidebar .lunarphase ul li.waxing_crescent_moon{background:transparent url(index.php?pf=lunarPhase/img/wcm1.png) no-repeat left 0.2em;padding-left:2em;} +#sidebar .lunarphase ul li.first_quarter_moon{background:transparent url(index.php?pf=lunarPhase/img/fqm.png) no-repeat left 0.2em;padding-left:2em;} +#sidebar .lunarphase ul li.waxing_gibbous_moon{background:transparent url(index.php?pf=lunarPhase/img/wgm1.png) no-repeat left 0.2em;padding-left:2em;} +#sidebar .lunarphase ul li.full_moon{background:transparent url(index.php?pf=lunarPhase/img/fm.png) no-repeat left 0.2em;padding-left:2em;} +#sidebar .lunarphase ul li.waning_gibbous_moon{background:transparent url(index.php?pf=lunarPhase/img/wgm2.png) no-repeat left 0.2em;padding-left:2em;} +#sidebar .lunarphase ul li.last_quarter_moon{background:transparent url(index.php?pf=lunarPhase/img/tqm.png) no-repeat left 0.2em;padding-left:2em;} +#sidebar .lunarphase ul li.waning_crescent_moon{background:transparent url(index.php?pf=lunarPhase/img/wcm2.png) no-repeat left 0.2em;padding-left:2em;} \ No newline at end of file