From 62f92cd10e386484f841b9a3787bcf1fe1475a34 Mon Sep 17 00:00:00 2001 From: Jean-Christian Denis Date: Thu, 15 Dec 2022 22:26:10 +0100 Subject: [PATCH] release 1.6 for dotclear 2.24 --- CHANGELOG.md | 27 +-- LICENSE | 23 ++- README.md | 46 ++++- _admin.php | 17 ++ _define.php | 55 +++--- _prepend.php | 60 ++++-- _public.php | 217 ++------------------ _widgets.php | 248 +++++++++++++++++++---- dcstore.xml | 13 ++ inc/class.lunarphase.php | 413 +++++++++++++++++++-------------------- locales/fr/main.po | 106 ++++------ 11 files changed, 645 insertions(+), 580 deletions(-) create mode 100644 _admin.php create mode 100644 dcstore.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index bb1823e..925bfd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,18 @@ -v1.5 (23/04/2015) Pierre Van Glabeke : -modification url support +1.6 - 2022.12.15 +- update to dotclear 2.24 -v1.4 (06/02/2015) Pierre Van Glabeke : -modifications localisation +1.5 - 2015.04.23 - Pierre Van Glabeke : +- modification url support -v1.3 (14/12/2014) Pierre Van Glabeke : -compatibilité dc2.7 +1.4 - 2015.02.06 - Pierre Van Glabeke : +- modifications localisation -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 +1.3 - 2014.12.14 - Pierre Van Glabeke : +- compatibilité dc2.7 + +1.2 2014.02.17 : +- 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/LICENSE b/LICENSE index 8cdb845..d511905 100644 --- a/LICENSE +++ b/LICENSE @@ -1,12 +1,12 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc., + Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - Preamble + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public @@ -56,7 +56,7 @@ patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. - GNU GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains @@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - NO WARRANTY + NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN @@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - END OF TERMS AND CONDITIONS + END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Programs + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it @@ -290,8 +290,8 @@ to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - {description} - Copyright (C) {year} {fullname} + + Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -329,7 +329,7 @@ necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. - {signature of Ty Coon}, 1 April 1989 + , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into @@ -337,4 +337,3 @@ proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. - diff --git a/README.md b/README.md index 317b263..a2d6e33 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,44 @@ -# lunarPhase -Afficher les phases lunaire et autres données +# README + +[![Release](https://img.shields.io/github/v/release/JcDenis/lunarPhase)](https://github.com/JcDenis/lunarPhase/releases) +[![Date](https://img.shields.io/github/release-date/JcDenis/lunarPhase)](https://github.com/JcDenis/lunarPhase/releases) +[![Issues](https://img.shields.io/github/issues/JcDenis/lunarPhase)](https://github.com/JcDenis/lunarPhase/issues) +[![Dotclear](https://img.shields.io/badge/dotclear-v2.24-blue.svg)](https://fr.dotclear.org/download) +[![Dotaddict](https://img.shields.io/badge/dotaddict-official-green.svg)](https://plugins.dotaddict.org/dc2/details/lunarPhase) +[![License](https://img.shields.io/github/license/JcDenis/lunarPhase)](https://github.com/JcDenis/lunarPhase/blob/master/LICENSE) + +## WHAT IS LUNARPHASE ? + +_lunarPhase_ is a plugin for the open-source +web publishing software called Dotclear. + +It shows lunar phases on a widget. + +## REQUIREMENTS + + _lunarPhase_ requires: + + * content admin permissions to manage widgets + * Dotclear 2.24 + +## USAGE + +First install _lunarPhase_, manualy from a zip package or from +Dotaddict repository. (See Dotclear's documentation to know how do this) + +You should add widget to show lunar phases on your blog. + +## LINKS + + * License : [GNU GPL v2](https://www.gnu.org/licenses/old-licenses/lgpl-2.0.html) + * Source & contribution : [GitHub Page](https://github.com/JcDenis/lunarPhase) + * Packages & details : [Dotaddict Page](https://plugins.dotaddict.org/dc2/details/lunarPhase) + * Discuss and help : [Dotclear Forum](http://forum.dotclear.org/viewtopic.php?pid=332971#p332971) + +## CONTRIBUTORS + + * Tomtom (author) + * Pierre Van Glabeke + * Jean-Christian Denis + + You are welcome to contribute to this code. \ No newline at end of file diff --git a/_admin.php b/_admin.php new file mode 100644 index 0000000..5651eab --- /dev/null +++ b/_admin.php @@ -0,0 +1,17 @@ +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://forum.dotclear.org/viewtopic.php?pid=332971#p332971', - 'details' => 'http://plugins.dotaddict.org/dc2/details/lunarPhase' - ) -); \ No newline at end of file + 'lunarPhase', + 'Display the moon phases on a widget', + 'Tomtom, Pierre Van Glabeke and Contributors', + '1.6', + [ + 'requires' => [['core', '2.24']], + 'permissions' => dcCore::app()->auth->makePermissions([ + dcAuth::PERMISSION_USAGE, + dcAuth::PERMISSION_CONTENT_ADMIN, + ]), + 'type' => 'plugin', + 'support' => 'http://forum.dotclear.org/viewtopic.php?pid=332971#p332971', + 'details' => 'https://plugins.dotaddict.org/dc2/details/' . basename(__DIR__), + 'repository' => 'https://raw.githubusercontent.com/JcDenis/' . basename(__DIR__) . '/master/dcstore.xml', + ] +); diff --git a/_prepend.php b/_prepend.php index 99ee36c..0cfee3f 100644 --- a/_prepend.php +++ b/_prepend.php @@ -1,16 +1,50 @@ autoload(['lunarPhase' => __DIR__ . '/inc/class.lunarphase.php']); -require dirname(__FILE__).'/_widgets.php'; +// Register lunarphase CSS URL +dcCore::app()->url->register( + 'lunarphase', + 'lunarphase.css', + '^lunarphase\.css', + function ($args) { + $phases = [ + 'new_moon' => 'nm', + 'waxing_crescent_moon' => 'wcm1', + 'first_quarter_moon' => 'fqm', + 'waxing_gibbous_moon' => 'wgm1', + 'full_moon' => 'fm', + 'waning_gibbous_moon' => 'wgm2', + 'last_quarter_moon' => 'tqm', + 'waning_crescent_moon' => 'wcm2', + ]; + + header('Content-Type: text/css; charset=UTF-8'); + echo "/* lunarphase widget style */\n"; + + foreach ($phases as $phase => $image) { + echo + sprintf( + '#sidebar .lunarphase ul li.%s{background:transparent url(%s) no-repeat left 0.2em;padding-left:2em;}', + $phase, + dcCore::app()->blog->getPF(basename(__dir__) . '/img/' . $image . '.png') + ) . "\n"; + } + + exit; + } +); diff --git a/_public.php b/_public.php index b87d0f0..d9dff90 100644 --- a/_public.php +++ b/_public.php @@ -1,203 +1,22 @@ 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 ''; - } +/** + * @brief lunarPhase, a plugin for Dotclear 2 + * + * @package Dotclear + * @subpackage Plugin + * + * @author Tomtom, Pierre Van Glabeke and Contributors + * + * @copyright Jean-Crhistian Denis + * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html + */ +if (!defined('DC_RC_PATH')) { + return null; } -class lunarPhasePublic -{ - /** - Displays lunarphase widget - - @param w dcWidget dcWidget object - @return string HTML code of widget - */ - public static function widget($w) - { - global $core; +require __DIR__ . '/_widgets.php'; - 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 = '
    %1$s
'; - $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 = '
      %1$s
    '; - $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 +// Add public header for lunarphase css +dcCore::app()->addBehavior('publicHeadContent', function () { + echo dcUtils::cssLoad(dcCore::app()->blog->url . dcCore::app()->url->getURLFor('lunarphase')); +}); diff --git a/_widgets.php b/_widgets.php index 0ffb6ae..d5156fc 100644 --- a/_widgets.php +++ b/_widgets.php @@ -1,44 +1,214 @@ addBehavior('initWidgets',array('lunarPhaseWidgets','initWidgets')); +dcCore::app()->addBehavior('initWidgets', ['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 + public static function initWidgets($w) + { + $w->create( + 'lunarphase', + __('LunarPhase: moon phases'), + ['lunarPhaseWidgets','widget'], + null, + __('Display the moon phases') + ) + ->addTitle(__('Moon phases')) + ->setting('phase', __('Display actual phase of moon'), 1, 'check') + ->setting('illumination', __('Display actual illumination of moon'), 1, 'check') + ->setting('age', __('Display actual age of moon'), 1, 'check') + ->setting('dist_to_earth', __('Display actual distance between moon and earth'), 1, 'check') + ->setting('dist_to_sun', __('Display actual distance between moon and sun'), 1, 'check') + ->setting('moon_angle', __('Display actual angle of moon'), 1, 'check') + ->setting('sun_angle', __('Display actual angle of sun'), 1, 'check') + ->setting('parallax', __('Display actual parallax of moon'), 1, 'check') + ->setting('previsions', __('Display all previsions for the next moon phases'), 1, 'check') + ->addHomeOnly() + ->addContentOnly() + ->addClass() + ->addOffline(); + } + + public static function widget($w) + { + if ($w->offline) { + return; + } + + if (!$w->checkHomeOnly(dcCore::app()->url->type)) { + return; + } + + $lp = new lunarPhase(); + + return $w->renderDiv( + $w->content_only, + 'lunarphase ' . $w->class, + '', + ($w->title ? $w->renderTitle(html::escapeHTML($w->title)) : '') . + self::getLive($w, $lp) . + self::getPrevisions($w, $lp) + ); + } + + /** + * Returns "live" part of lunarphase widget + * + * @param dcWidget $w dcWidget object + * @param lunarPhase $lp lunarPhase object + * @return string Live HTML part + */ + public static function getLive($w, $lp) + { + $li = '
  • %1$s
  • '; + $live = $lp->getLive(); + $res = ''; + + # Phase + if ($w->phase) { + $res .= sprintf($li, $live['name'], $live['id']); + } + # Illumination + if ($w->illumination) { + $res .= sprintf( + $li, + sprintf( + __('Illumination: %s%%'), + self::formatValue('percent', $live['illumination']) + ), + 'illumination' + ); + } + # Moon's age + if ($w->age) { + $res .= sprintf( + $li, + sprintf( + __('Age of moon: %s days'), + self::formatValue('int', $live['age']) + ), + 'age' + ); + } + # Distance from earth + if ($w->dist_to_earth) { + $res .= sprintf( + $li, + sprintf( + __('Distance to earth: %s km'), + self::formatValue('int', $live['dist_to_earth']) + ), + 'dist_to_earth' + ); + } + # Distance from sun + if ($w->dist_to_sun) { + $res .= sprintf( + $li, + sprintf( + __('Distance to sun: %s km'), + self::formatValue('int', $live['dist_to_sun']) + ), + 'dist_to_sun' + ); + } + # Moon's angle + if ($w->moon_angle) { + $res .= sprintf( + $li, + sprintf( + __('Angle of moon: %s deg'), + self::formatValue('deg', $live['moon_angle']) + ), + 'moon_angle' + ); + } + # Sun's angle + if ($w->sun_angle) { + $res .= sprintf( + $li, + sprintf( + __('Angle of sun: %s deg'), + self::formatValue('deg', $live['sun_angle']) + ), + 'sun_angle' + ); + } + # Parallax + if ($w->parallax) { + $res .= sprintf( + $li, + sprintf( + __('Parallax: %s deg'), + self::formatValue('deg', $live['parallax']) + ), + 'parallax' + ); + } + + return strlen($res) > 0 ? + sprintf('

    %s

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

    %s

      %s
    ', __('Previsions'), $res) + : ''; + } + + /** + * Returns value passed in argument with a correct format + * + * @param string $type Type of convertion + * @param mixed $value Value to convert + * @return mixed Converted value + */ + public static function formatValue($type, $value) + { + $res = ''; + $format = dcCore::app()->blog->settings->system->date_format . ' - '; + $format .= dcCore::app()->blog->settings->system->time_format; + $tz = dcCore::app()->blog->settings->system->blog_timezone; + + return match ($type) { + 'int' => number_format($value, 0), + 'float' => number_format($value, 2), + 'percent' => number_format($value * 100, 0), + 'date' => dt::str($format, $value, $tz), + 'deg' => number_format(($value * (180.0 / M_PI)), 2), + default => $value, + }; + } +} diff --git a/dcstore.xml b/dcstore.xml new file mode 100644 index 0000000..ddf78fb --- /dev/null +++ b/dcstore.xml @@ -0,0 +1,13 @@ + + + + lunarPhase + 1.6 + Tomtom, Pierre Van Glabeke and Contributors + Display the moon phases on a widget + https://github.com/JcDenis/lunarPhase/releases/download/v1.6/plugin-lunarPhase.zip + 2.24 + https://plugins.dotaddict.org/dc2/details/lunarPhase + http://forum.dotclear.org/viewtopic.php?pid=332971#p332971 + + diff --git a/inc/class.lunarphase.php b/inc/class.lunarphase.php index 1e59a47..977315b 100644 --- a/inc/class.lunarphase.php +++ b/inc/class.lunarphase.php @@ -1,213 +1,210 @@ 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 + # Elements of the Moon's orbit, epoch 1980.0. + public const mmLong = 64.975464; # moon's mean longitude at the epoch + public const mmLongp = 349.383063; # mean longitude of the perigee at the epoch + public const mlNode = 151.950429; # mean longitude of the node at the epoch + public const mInc = 5.145396; # inclination of the Moon's orbit + public const mEcc = 0.054900; # eccentricity of the Moon's orbit + public const mAngSiz = 0.5181; # moon's angular size at distance a from Earth + public const msMax = 384401.0; # semi-major axis of Moon's orbit in km + public const mParallax = 0.9507; # parallax at distance a from Earth + public const synodic = 29.53058868; # synodic month (new Moon to new Moon) + + protected $live; + protected $previsions; + + public function __construct() + { + $this->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'] = [ + 'name' => __('Waxing crescent moon'), + 'date' => $start + $ts_synodic / 8, + ]; + $this->previsions['first_quarter_moon'] = [ + 'name' => __('First quarter moon'), + 'date' => $start + $ts_synodic / 4, + ]; + $this->previsions['waxing_gibbous_moon'] = [ + 'name' => __('Waxing gibbous moon'), + 'date' => $start + $ts_synodic * 3 / 8, + ]; + $this->previsions['full_moon'] = [ + 'name' => __('Full moon'), + 'date' => $start + $ts_synodic / 2, + ]; + $this->previsions['waning_gibbous_moon'] = [ + 'name' => __('Waning gibbous moon'), + 'date' => $start + $ts_synodic * 5 / 8, + ]; + $this->previsions['last_quarter_moon'] = [ + 'name' => __('Last quarter moon'), + 'date' => $start + $ts_synodic * 3 / 4, + ]; + $this->previsions['waning_crescent_moon'] = [ + 'name' => __('Waning crescent moon'), + 'date' => $start + $ts_synodic * 7 / 8, + ]; + $this->previsions['new_moon'] = [ + '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((int) $delta) > $EPSILON) { + $delta = $e - $ecc * sin($e) - $m; + $e -= $delta / (1 - $ecc * cos($e)); + } + + return ($e); + } +} diff --git a/locales/fr/main.po b/locales/fr/main.po index fd4fec7..6b88301 100644 --- a/locales/fr/main.po +++ b/locales/fr/main.po @@ -1,133 +1,99 @@ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" -"Project-Id-Version: lunarPhase 1.1-RC2\n" +"Project-Id-Version: lunarPhase 1.6\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2010-09-30T22:49:45+00:00\n" -"Last-Translator: Thomas Bouron\n" +"PO-Revision-Date: 2022-12-15T21:10:10+00:00\n" +"Last-Translator: Jean-Crhistian Denis\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "LunarPhase: moon phases" +msgstr "LunarPhase : phases de la Lune" 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 "Illumination: %s%%" +msgstr "Illumination : %s%%" + +msgid "Age of moon: %s days" +msgstr "Age de la Lune : %s jours" + +msgid "Distance to earth: %s km" +msgstr "Distance à la Terre : %s km" + +msgid "Distance to sun: %s km" +msgstr "Distance au Soleil : %s km" + +msgid "Angle of moon: %s deg" +msgstr "Angle de la Lune : %s deg" + +msgid "Angle of sun: %s deg" +msgstr "Angle du Soleil : %s deg" + +msgid "Parallax: %s deg" +msgstr "Parallaxe : %s deg" + +msgid "In live" +msgstr "En direct" + +msgid "Previsions" +msgstr "Prévisions" + 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 +msgstr "Lune décroissante" +