release 1.6 for dotclear 2.24

master
Jean-Christian Paul Denis 2022-12-15 22:26:10 +01:00
parent 838d9d6440
commit 62f92cd10e
Signed by: JcDenis
GPG Key ID: 1B5B8C5B90B6C951
11 changed files with 645 additions and 580 deletions

View File

@ -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
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

23
LICENSE
View File

@ -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., <http://fsf.org/>
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}
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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
<signature of Ty Coon>, 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.

View File

@ -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.

17
_admin.php 100644
View File

@ -0,0 +1,17 @@
<?php
/**
* @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_CONTEXT_ADMIN')) {
return null;
}
require __DIR__ . '/_widgets.php';

View File

@ -1,28 +1,33 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of lunarPhase, a plugin for Dotclear.
#
# Copyright (c) 2009-2015 Tomtom
# Contributor: Pierre Van Glabeke
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
if (!defined('DC_RC_PATH')) { return; }
/**
* @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;
}
$this->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'
)
);
'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',
]
);

View File

@ -1,16 +1,50 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of lunarPhase, a plugin for Dotclear.
#
# Copyright (c) 2009-2015 Tomtom
# Contributor: Pierre Van Glabeke
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
if (!defined('DC_RC_PATH')) { return; }
/**
* @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;
}
$__autoload['lunarPhase'] = dirname(__FILE__).'/inc/class.lunarphase.php';
Clearbricks::lib()->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;
}
);

View File

@ -1,203 +1,22 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of lunarPhase, a plugin for Dotclear.
#
# Copyright (c) 2009-2015 Tomtom
# Contributor: Pierre Van Glabeke
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
if (!defined('DC_RC_PATH')) { return; }
$core->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 '<link rel="stylesheet" media="screen" type="text/css" href="'.$url.'" />';
}
/**
* @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 <b>dcWidget</b> dcWidget object
@return <b>string</b> 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 <b>dcWidget</b> dcWidget object
@param lp <b>lunarPhaset</b> lunarPhase object
@return <b>string</b> Live HTML part
*/
public static function getLive($w,$lp)
{
$ul_mask = '<ul>%1$s</ul>';
$li_mask = '<li class="%2$s">%1$s</li>';
$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
'<h3>'.__('In live').'</h3>'.
sprintf($ul_mask,$res,'lunarphase');
}
}
/**
Returns "previsions" part of lunarphase widget
@param w <b>dcWidget</b> dcWidget object
@param lp <b>lunarPhaset</b> lunarPhase object
@return <b>string</b> previsions HTML part
*/
public static function getPrevisions($w,$lp)
{
$ul_mask = '<ul class="%2$s">%1$s</ul>';
$li_mask = '<li class="%2$s" title="%3$s">%1$s</li>';
$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
'<h3>'.__('Previsions').'</h3>'.
sprintf($ul_mask,$res,'lunarphase');
}
}
/**
Returns value passed in argument with a correct format
@param type <b>string</b> Type of convertion
@param value <b>mixed</b> Value to convert
@return <b>mixed</b> 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;
}
}
// Add public header for lunarphase css
dcCore::app()->addBehavior('publicHeadContent', function () {
echo dcUtils::cssLoad(dcCore::app()->blog->url . dcCore::app()->url->getURLFor('lunarphase'));
});

View File

@ -1,44 +1,214 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of lunarPhase, a plugin for Dotclear.
#
# Copyright (c) 2009-2015 Tomtom
# Contributor: Pierre Van Glabeke
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
if (!defined('DC_RC_PATH')) { return; }
/**
* @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;
}
$core->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');
}
}
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 = '<li class="%2$s">%1$s</li>';
$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('<h4>%s</h4><ul>%s</ul>', __('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 = '<li class="%s" title="%s">%s</li>';
$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('<h4>%s</h4><ul class="lunarphase">%s</ul>', __('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,
};
}
}

13
dcstore.xml 100644
View File

@ -0,0 +1,13 @@
<?xml version="1.0"?>
<modules xmlns:da="http://dotaddict.org/da/">
<module id="lunarPhase">
<name>lunarPhase</name>
<version>1.6</version>
<author>Tomtom, Pierre Van Glabeke and Contributors</author>
<desc>Display the moon phases on a widget</desc>
<file>https://github.com/JcDenis/lunarPhase/releases/download/v1.6/plugin-lunarPhase.zip</file>
<da:dcmin>2.24</da:dcmin>
<da:details>https://plugins.dotaddict.org/dc2/details/lunarPhase</da:details>
<da:support>http://forum.dotclear.org/viewtopic.php?pid=332971#p332971</da:support>
</module>
</modules>

View File

@ -1,213 +1,210 @@
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
# This file is part of lunarPhase, a plugin for Dotclear.
#
# Copyright (c) 2009-2015 Tomtom
# Contributor: Pierre Van Glabeke
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# -- END LICENSE BLOCK ------------------------------------
if (!defined('DC_RC_PATH')) {return;}
/**
* @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 lunarPhase
{
# Astronomical constants.
const epoch = 2444238.5; # 1980 January 0.0
# Astronomical constants.
public const epoch = 2444238.5; # 1980 January 0.0
# Constants defining the Sun's apparent orbit.
const elonge = 278.833540; # ecliptic longitude of the Sun at epoch 1980.0
const elongp = 282.596403; # ecliptic longitude of the Sun at perigee
const eccent = 0.016718; # eccentricity of Earth's orbit
const sunsMax = 1.495985e8; # semi-major axis of Earth's orbit, km
const sunAngSiz = 0.533128; # sun's angular size, degrees, at semi-major axis distance
# Constants defining the Sun's apparent orbit.
public const elonge = 278.833540; # ecliptic longitude of the Sun at epoch 1980.0
public const elongp = 282.596403; # ecliptic longitude of the Sun at perigee
public const eccent = 0.016718; # eccentricity of Earth's orbit
public const sunsMax = 1.495985e8; # semi-major axis of Earth's orbit, km
public const sunAngSiz = 0.533128; # sun's angular size, degrees, at semi-major axis distance
# Elements of the Moon's orbit, epoch 1980.0.
const mmLong = 64.975464; # moon's mean longitude at the epoch
const mmLongp = 349.383063; # mean longitude of the perigee at the epoch
const mlNode = 151.950429; # mean longitude of the node at the epoch
const mInc = 5.145396; # inclination of the Moon's orbit
const mEcc = 0.054900; # eccentricity of the Moon's orbit
const mAngSiz = 0.5181; # moon's angular size at distance a from Earth
const msMax = 384401.0; # semi-major axis of Moon's orbit in km
const mParallax = 0.9507; # parallax at distance a from Earth
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'] = 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);
}
}
# 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);
}
}

View File

@ -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"
msgstr "Lune décroissante"