Release 1.3.0

This commit is contained in:
Miraty 2020-10-31 18:54:19 +01:00
commit 4faa9fa26f
21 changed files with 5990 additions and 4166 deletions

50
CHANGELOG.md Normal file
View File

@ -0,0 +1,50 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## Unreleased
### Added
* i18n system
* English l10n
* Changelog
### Changed
* Use lesserphp instead of lessphp
* Move license info and "What's a QR code" at bottom of the page
## 1.2.0 - 2020-03-23
### Added
* Ability to chooses QR code colors
### Changed
* The software is now named LibreQR
* Parameters now uses GET instead of POST
* The OpenSearch plugin now generate QR codes with arguments used when added
## 1.1.0 - 2019-03-29
### Added
* OpenSearch
* WebManifest
### Changed
* Server-side LESS compilation
* Icons are now themed and in multiple dimensions
### Fixed
* Placeholder font
## 1.0.0 - 2019-02-13
Initial release

104
README.md
View File

@ -1,93 +1,101 @@
# ![](themes/dark/icons/32.png) LibreQR # ![](themes/dark/icons/32.png) LibreQR
## Présentation [Lire ceci en français](README_fr.md)
Une interface Web pour générer des codes QR en PHP. A PHP Web interface for generating QR codes.
## Démo ## Demo
Une instance de ce service est disponible à l'adresse [https://qr.antopie.org](https://qr.antopie.org). A LibreQR instance is available at <https://qr.antopie.org>.
## Fonctionnement ## How it works
LibreQR inclus un plugin [OpenSearch](https://developer.mozilla.org/docs/Web/OpenSearch), ce qui permet de l'ajouter comme moteur de recherche dans Firefox et de sauvegarder vos paramètres. LibreQR includes an [OpenSearch](https://developer.mozilla.org/docs/Web/OpenSearch) plugin, which allows to add it as a search engine in Firefox and to save settings.
Vous pouvez ainsi générer un code QR directement depuis la barre de recherche avec les réglages de LibreQR utilisés lors de l'ajout comme moteur de recherche. You can thus generate a QR code directly from your search bar with the LibreQR's settings used at the time of adding as search engine.
Un [WebManifest](https://developer.mozilla.org/docs/Web/Manifest) est également inclus, ce qui permet de mieux l'intégrer au système via Fennec (Firefox Android) ou Chromium. A [WebManifest](https://developer.mozilla.org/docs/Web/Manifest) is also included, which allows better system integration using Fennec (Firefox Android) ou Chromium.
Les codes QR générés sont placés dans le dossier temp/, nommés avec le nombre de caractères aléatoires indiqué dans config.inc.php (32 par défaut), puis supprimés après le temps indiqué dans config.inc.php (7 jours par défaut). QR codes generated are located in the temp/ directory, named with the number of random characters set in config.inc.php (32 by default), and then deleted after the time set in config.inc.php (7 days by default).
See `config.inc.php` for more settings.
## Installation ## Installation
### Générique ### Generic
Je développe directement dans master, donc en production téléchargez plutôt une version stable dans [l'onglet Versions](https://code.antopie.org/miraty/libreqr/releases). Just place this source code in a Web server with PHP.
Placez ce code source dans un serveur Web avec PHP, tout simplement. `wget https://code.antopie.org/miraty/libreqr/archive/1.2.0.zip`
GD extension is required.
`apt install php7.3-gd`
LibreQR need writing rights on the `temp/` directory.
```
chown -R www-data:www-data /var/www/libreqr/temp
chmod -R 600 /var/www/libreqr/temp
```
### YunoHost ### YunoHost
J'ai créé [un paquet](https://code.antopie.org/miraty/qr_ynh/) pour [YunoHost](https://yunohost.org/). There is [a package](https://code.antopie.org/miraty/qr_ynh/) for [YunoHost](https://yunohost.org/).
Vous pouvez l'installer depuis l'interface Web d'administration ou avec cette commande : For historical reasons, LibreQR is technically named `qr` in YunoHost.
You can install it from the WebAdmin or with this command :
``` ```
sudo yunohost app install qr sudo yunohost app install qr
``` ```
## Thèmes ## Themes
### Changer de thème ### Change theme
Dans config.inc.php, donnez à $theme le nom du thème voulu. In config.inc.php, set $theme to the wanted theme.
Par défaut, trois thèmes sont proposés : By default, 3 themes are offered:
* dark, le thème par défaut, sombre. Il est utilisé ici : <https://qr.antopie.org> * dark, the default dark theme. Used here: <https://qr.antopie.org>
* light, thème clair * light, the light theme.
* parinux, un thème bleu, créé pour [Bastet](https://bastet.parinux.org), le CHATON de [Parinux](https://parinux.org). Il est utilisé ici : <https://codeqr.parinux.org> * parinux, a blue theme, made for [Bastet](https://bastet.parinux.org), the [Parinux](https://parinux.org)'s CHATON. Used here: <https://codeqr.parinux.org>
### Créer un thème ### Make a theme
* Copiez themes/dark vers themes/[nom de votre thème] * Copy themes/dark to themes/[new theme's name]
* Complétez theme.php en fonction des couleurs CSS voulues dans l'interface * Fill theme.php according to CSS colors you want
* Modifiez l'image source.png en fonction de votre thème * Change the source.png image according to your theme
* To automatically generate favicons with the rights sizes, use `php themes/resize.php [theme's name]`
* Pour générer automatiquement les icônes aux tailles correctes, utilisez This last step will need [ImageMagick](https://imagemagick.org) and [pngquant](https://pngquant.org) to be installed.
``` ```apt install imagemagick pngquant```
php themes/resize.php [nom de votre thème]
```
Cela nécessitera d'avoir installé [ImageMagick](https://imagemagick.org) et ## Contribute
[pngquant](https://pngquant.org).
## Contribuer If you want to report a bug, you can open an issue at <https://code.antopie.org/miraty/libreqr/issues> after creating an account (prefered method) or contact me in another way.
Si vous souhaitez rapporter un bug, vous pouvez ouvrir un ticket sur <https://code.antopie.org/miraty/libreqr/issues> après vous être créé un compte (méthode préférée) ou me contacter d'une autre manière.
## Contact ## Contact
Si vous voulez me contacter, par exemple pour demander un éclaircissement sur le fonctionnement de LibreQR ou pour signaler un bug, vous pouvez le faire par : If you want to contact me, for instance to report a bug or ask me a question about installing or using LibreQR, you can get my contact details on <https://miraty.antopie.org>.
* Matrix : @miraty:matrix.antopie.org ## Libraries
* courriel : [miraty+libreqr@antopie.org](mailto:miraty+libreqr@antopie.org) (GPG : [B16B 12A8 957B 2EC7 9659 04A6 B82D 15F0 3E67 B2B5](https://miraty.antopie.org/B16B12A8957B2EC7965904A6B82D15F03E67B2B5.asc))
* le Fédiverse : [@Miraty@oc.todon.fr](https://oc.todon.fr/@Miraty)
## Bibliothèques tierces This source code includes:
Ce code source inclus : * [phpqrcode](https://github.com/t0k4rt/phpqrcode) to generate QR codes
* [Ubuntu font for the Web](https://github.com/earaujoassis/ubuntu-fontface)
* [lesserphp](https://github.com/MarcusSchwarz/lesserphp) to compile [Less](http://lesscss.org)
* [phpqrcode](https://github.com/t0k4rt/phpqrcode) pour générer les codes QR ## License
* [La police Ubuntu packagée pour le Web](https://github.com/earaujoassis/ubuntu-fontface)
* [lessphp](http://leafo.net/lessphp) pour compiler le [Less](http://lesscss.org)
## Licence
[AGPLv3+](https://code.antopie.org/miraty/libreqr/src/branch/master/LICENSE) [AGPLv3+](https://code.antopie.org/miraty/libreqr/src/branch/master/LICENSE)
LibreQR est un logiciel libre ; vous pouvez le diffuser et le modifier suivant les termes de la GNU Affero General Public License telle que publiée par la Free Software Foundation ; soit la version 3 de cette licence, soit (à votre convenance) une version ultérieure. LibreQR is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
LibreQR est diffusé dans lespoir quil sera utile, mais SANS AUCUNE GARANTIE ; sans même une garantie implicite de COMMERCIALISATION ou dADÉQUATION À UN USAGE PARTICULIER. Voyez la GNU Affero General Public License pour plus de détails. LibreQR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
Vous devriez avoir reçu une copie de la GNU Affero General Public License avec ce code. Sinon, consultez <https://www.gnu.org/licenses/> You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.

100
README_fr.md Normal file
View File

@ -0,0 +1,100 @@
# ![](themes/dark/icons/32.png) LibreQR
[Read this in english](README.md)
Une interface Web en PHP pour générer des codes QR.
## Démo
Une instance de LibreQR est disponible sur <https://qr.antopie.org>.
## Fonctionnement
LibreQR inclus un plugin [OpenSearch](https://developer.mozilla.org/docs/Web/OpenSearch), ce qui permet de l'ajouter comme moteur de recherche dans Firefox et de sauvegarder vos paramètres.
Vous pouvez ainsi générer un code QR directement depuis la barre de recherche avec les réglages de LibreQR utilisés lors de l'ajout comme moteur de recherche.
Un [WebManifest](https://developer.mozilla.org/docs/Web/Manifest) est également inclus, ce qui permet de mieux l'intégrer au système via Fennec (Firefox Android) ou Chromium.
Les codes QR générés sont placés dans le dossier temp/, nommés avec le nombre de caractères aléatoires indiqué dans config.inc.php (32 par défaut), puis supprimés après le temps indiqué dans config.inc.php (7 jours par défaut).
Voir `config.inc.php` pour plus de paramètres.
## Installation
### Générique
Placez simplement ce code source dans un serveur Web avec PHP.
`wget https://code.antopie.org/miraty/libreqr/archive/1.2.0.zip`
L'extension GD est requise.
`apt install php7.3-gd`
LibreQR a besoin des permissions d'écriture dans le dossier `temp/`.
```
chown -R www-data:www-data /var/www/libreqr/temp
chmod -R 600 /var/www/libreqr/temp
```
### YunoHost
Il y a [un paquet](https://code.antopie.org/miraty/qr_ynh/) pour [YunoHost](https://yunohost.org/).
Pour des raisons historiques, LibreQR est techniquement nommée `qr` dans YunoHost.
Vous pouvez l'installer depuis l'interface Web d'administration ou avec cette commande :
```
sudo yunohost app install qr
```
## Thèmes
### Changer de thème
Dans config.inc.php, donnez à $theme le nom du thème voulu.
Par défaut, trois thèmes sont proposés :
* dark, le thème par défaut, sombre. Il est utilisé ici : <https://qr.antopie.org>
* light, thème clair
* parinux, un thème bleu, créé pour [Bastet](https://bastet.parinux.org), le CHATON de [Parinux](https://parinux.org). Il est utilisé ici : <https://codeqr.parinux.org>
### Créer un thème
* Copiez themes/dark vers themes/[nom de votre thème]
* Complétez theme.php en fonction des couleurs CSS voulues dans l'interface
* Modifiez l'image source.png en fonction de votre thème
* Pour générer automatiquement les icônes aux tailles correctes, utilisez `php themes/resize.php [nom du thème]`
Cette dernière étape nécessite d'avoir installé [ImageMagick](https://imagemagick.org) et [pngquant](https://pngquant.org).
```apt install imagemagick pngquant```
## Contribuer
Si vous souhaitez rapporter un bug, vous pouvez ouvrir un ticket sur <https://code.antopie.org/miraty/libreqr/issues> après vous être créé un compte (méthode préférée) ou me contacter d'une autre manière.
## Contact
Si vous voulez me contacter, par exemple pour signaler un bug ou me poser une question sur l'installation ou l'utilisation de LibreQR, vous trouverez des moyens de me contacter sur <https://miraty.antopie.org>.
## Bibliothèques tierces
Ce code source inclus :
* [phpqrcode](https://github.com/t0k4rt/phpqrcode) pour générer les codes QR
* [La police Ubuntu pour le Web](https://github.com/earaujoassis/ubuntu-fontface)
* [lesserphp](https://github.com/MarcusSchwarz/lesserphp) pour compiler le [Less](http://lesscss.org)
## Licence
[AGPLv3+](https://code.antopie.org/miraty/libreqr/src/branch/master/LICENSE)
LibreQR est un logiciel libre ; vous pouvez le diffuser et le modifier suivant les termes de la GNU Affero General Public License telle que publiée par la Free Software Foundation ; soit la version 3 de cette licence, soit (à votre convenance) une version ultérieure.
LibreQR est diffusé dans lespoir quil sera utile, mais SANS AUCUNE GARANTIE ; sans même une garantie implicite de COMMERCIALISATION ou dADÉQUATION À UN USAGE PARTICULIER. Voyez la GNU Affero General Public License pour plus de détails.
Vous devriez avoir reçu une copie de la GNU Affero General Public License avec ce code. Sinon, consultez <https://www.gnu.org/licenses/>

View File

@ -1,47 +1,31 @@
<?php <?php
// ----- Settings -----
// ----- Paramètres ----- // ----- Paramètres -----
deleteOldQR(60 * 60 * 24 * 7); // Temps en secondes après lequel le code QR sera supprimé lors du chargement d'un page // EN: Time in seconds after which the QR code will be deleted when a page loads.
// Default: 60 * 60 * 24 * 7 (one week)
// FR : Temps en secondes après lequel le code QR sera supprimé lors du chargement d'une page.
// Par défaut : 60 * 60 * 24 * 7 (une semaine)
$timeBeforeDeletion = 60 * 60 * 24 * 7;
$theme = "dark"; // dark, light ou parinux // EN: Theme's name (must be in the themes directory)
// FR : Nom du thème (doit être dans le dossier themes)
$theme = "dark";
$fileNameLenght = 32; // Longueur du nom du fichier du code QR // EN: Language used if those requested by the user are not available
// FR : Langue utilisée si celles demandées par l'utilisateurice ne sont pas disponibles
$locale = "en";
// ----- Trucs nécessaires partout ----- // EN: Should the locales requested by the user be ignored?
// FR : Faut-il ignorer les langues demandées par l'utilisateurice ?
$forceLocale = false;
// Définit l'URL racine // EN: Lenght of the QR code filename
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') // FR : Longueur du nom du fichier du code QR
$protocol = "https"; $fileNameLenght = 32;
else
$protocol = "http";
$instPath = $protocol . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$instPath = preg_replace('#\?.*$#', '', $instPath);
$instPath = preg_replace('#(manifest|opensearch|index).php$#i', '', $instPath);
require "themes/" . $theme . "/theme.php"; // Charge le thème graphique // EN: Will be printed at the bottom of the interface
// FR : Sera affiché en bas de l'interface
function generateRandomString($length) { $customTextEnabled = false;
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $customText = "This LibreQR instance is hosted by <a href='https://foo.bar'>foo</a>.";
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
function deleteOldQR($tempsDeSuppression) {
/*
Cette fonction supprime les fichiers (normalement des images de codes QR)
dans temp/ plus vieux que le temps en seconde passé en argument
*/
$listeCodesQR = new DirectoryIterator("temp");
foreach($listeCodesQR as $listeCodesQR) {
if ($listeCodesQR->getFilename() != "." AND $listeCodesQR->getFilename() != ".." AND $listeCodesQR->getFilename() != ".gitkeep") {
if ((time() - filemtime("temp/" . $listeCodesQR->getFilename())) > $tempsDeSuppression) { // Si le temps actuel (en heure Posix) moins la date de dernière modification de l'image est supérieur à la durée de vie demandée de l'image
unlink("temp/" . $listeCodesQR->getFilename()); // Alors supprimer cette image
}
}
}
}

11
config.yaml.php Normal file
View File

@ -0,0 +1,11 @@
<?php
require "inc.php";
// EN: This file is used to inform users of the settings of your LibreQR instance. If you want to edit these settings, edit config.inc.php.
// FR : Ce fichier est utilisé pour informer les utilisateurices des paramètres de votre instance LibreQR. Si vous voulez modifier ces paramètres, modifiez config.inc.php.
?>
libreqrVersion: "<?= $libreqrVersion ?>"
timeBeforeDeletion: <?= $timeBeforeDeletion . "\n" ?>
theme: "<?= $theme ?>"
locale: "<?= $locale ?>"
forceLocale: "<?= $forceLocale ? 'true' : 'false' ?>"
fileNameLenght: <?= $fileNameLenght . "\n" ?>

View File

@ -3,7 +3,7 @@
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g transform="translate(-400.000000, -247.000000)"> <g transform="translate(-400.000000, -247.000000)">
<g id="69" transform="translate(400.000000, 247.000000)"> <g id="69" transform="translate(400.000000, 247.000000)">
<circle id="Oval-7" stroke="<?= $_GET['clr'] ?>" stroke-width="2" cx="12" cy="12" r="10"></circle> <circle id="Oval-7" stroke="<?= htmlspecialchars($_GET['clr']) ?>" stroke-width="2" cx="12" cy="12" r="10"></circle>
<path d="M12.016,14.544 C12.384,14.544 12.64,14.256 12.704,13.904 L12.768,13.168 C14.544,12.864 16,11.952 16,9.936 L16,9.904 C16,7.904 14.48,6.656 12.24,6.656 C10.768,6.656 9.696,7.184 8.848,7.984 C8.624,8.176 8.528,8.432 8.528,8.672 C8.528,9.152 8.928,9.552 9.424,9.552 C9.648,9.552 9.856,9.456 10.016,9.328 C10.656,8.752 11.344,8.448 12.192,8.448 C13.344,8.448 14.032,9.072 14.032,9.968 L14.032,10 C14.032,11.008 13.2,11.584 11.696,11.728 C11.264,11.776 11.008,12.096 11.072,12.528 L11.232,13.904 C11.28,14.272 11.552,14.544 11.92,14.544 L12.016,14.544 Z M10.784,16.816 L10.784,16.976 C10.784,17.6 11.264,18.08 11.92,18.08 C12.576,18.08 13.056,17.6 13.056,16.976 L13.056,16.816 C13.056,16.192 12.576,15.712 11.92,15.712 C11.264,15.712 10.784,16.192 10.784,16.816 Z" id="?" fill="<?= $_GET['clr'] ?>"></path> <path d="M12.016,14.544 C12.384,14.544 12.64,14.256 12.704,13.904 L12.768,13.168 C14.544,12.864 16,11.952 16,9.936 L16,9.904 C16,7.904 14.48,6.656 12.24,6.656 C10.768,6.656 9.696,7.184 8.848,7.984 C8.624,8.176 8.528,8.432 8.528,8.672 C8.528,9.152 8.928,9.552 9.424,9.552 C9.648,9.552 9.856,9.456 10.016,9.328 C10.656,8.752 11.344,8.448 12.192,8.448 C13.344,8.448 14.032,9.072 14.032,9.968 L14.032,10 C14.032,11.008 13.2,11.584 11.696,11.728 C11.264,11.776 11.008,12.096 11.072,12.528 L11.232,13.904 C11.28,14.272 11.552,14.544 11.92,14.544 L12.016,14.544 Z M10.784,16.816 L10.784,16.976 C10.784,17.6 11.264,18.08 11.92,18.08 C12.576,18.08 13.056,17.6 13.056,16.976 L13.056,16.816 C13.056,16.192 12.576,15.712 11.92,15.712 C11.264,15.712 10.784,16.192 10.784,16.816 Z" id="?" fill="<?= $_GET['clr'] ?>"></path>
</g> </g>
</g> </g>

51
inc.php Normal file
View File

@ -0,0 +1,51 @@
<?php // ----- This file is included everywhere -----
require "config.inc.php";
$libreqrVersion = "1.3.0";
// Defines the locale to be used
if ($forceLocale == false) {
$clientLocales = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$clientLocales = preg_replace("#[A-Z0-9]|q=|;|-|\.#", "", $clientLocales);
$clientLocales = explode(',', $clientLocales);
$availableLocales = array('fr', 'en', 'template');
foreach ($clientLocales as $clientLocale) {
if (in_array($clientLocale, $availableLocales)) {
$locale = $clientLocale;
break;
}
}
}
require "locales/" . $locale . ".php";
// Defines the root URL
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')
$protocol = "https";
else
$protocol = "http";
$rootPath = $protocol . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$rootPath = preg_replace('#\?.*$#', '', $rootPath);
$rootPath = preg_replace('#(manifest|opensearch|index).php$#i', '', $rootPath);
require "themes/" . $theme . "/theme.php"; // Load theme
// Used to generate the filename of the QR code
function generateRandomString($length) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
// Deletes images in temp/ older than the specified time in seconds
$files = array_diff(scandir("temp"), array('..', '.', '.gitkeep'));
foreach($files as $file) {
// If the current time (in Posix time) minus the date of last modification of the file is higher than specified time
if ((time() - filemtime("temp/" . $file)) > $timeBeforeDeletion) {
unlink("temp/" . $file); // Deletes this image
}
}

159
index.php
View File

@ -1,33 +1,23 @@
<?php require "config.inc.php"; ?> <?php require "inc.php"; ?>
<!-- <!--
_ _ _ ___ ____ _ _ _ ___ ____
| | (_| |__ _ __ ___ / _ \| _ \ | | (_| |__ _ __ ___ / _ \| _ \
| | | | '_ \| '__/ _ | | | | |_) | | | | | '_ \| '__/ _ | | | | |_) |
| |___| | |_) | | | __| |_| | _ < | |___| | |_) | | | __| |_| | _ <
|_____|_|_.__/|_| \___|\__\_|_| \_\ |_____|_|_.__/|_| \___|\__\_|_| \_\
A PHP Web interface for generating QR codes
LibreQR version 1.2.0 Source code : https://code.antopie.org/miraty/libreqr
Créé par Miraty et diffusé sous AGPLv3+
Code source : https://code.antopie.org/miraty/libreqr
Ce fichier fait partie de LibreQR. This file is part of LibreQR.
LibreQR est un logiciel libre ; vous pouvez le redistribuer ou le modifier LibreQR is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
suivant les termes de la GNU Affero General Public License
telle que publiée par la Free Software Foundation ; soit la version 3
de la licence, soit (à votre gré) toute version ultérieure.
LibreQR est distribué dans l'espoir qu'il sera utile, LibreQR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
mais SANS AUCUNE GARANTIE ; sans même la garantie tacite de
QUALITÉ MARCHANDE ou d'ADÉQUATION à UN BUT PARTICULIER.
Consultez la GNU Affero General Public License pour plus de détails.
Vous devez avoir reçu une copie de la GNU Affero General Public License You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
en même temps que LibreQR ; si ce n'est pas le cas,
consultez <https://www.gnu.org/licenses/>.
--> -->
<?php <?php
function badQuery() { // Check if browser must be redirected function badQuery() { // Check if browser must be redirected
@ -93,36 +83,35 @@ if (badQuery()) {
} }
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="fr"> <html lang="<?= $locale ?>">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Générateur de codes QR</title> <title>LibreQR · <?= $loc['subtitle'] ?></title>
<meta name="description" content="Générez des codes QR librement. Choisissez le contenu, la taille, la couleur..."> <meta name="description" content="<?= $loc['description'] ?>">
<meta name="theme-color" content="<?php echo $variablesTheme['bg']; ?>"> <meta name="theme-color" content="<?php echo $variablesTheme['bg']; ?>">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="manifest" href="manifest.php"> <link rel="manifest" href="manifest.php">
<link rel="search" type="application/opensearchdescription+xml" title="Générer un code QR" href="opensearch.php&#63;redondancy=<?= $_GET['redondancy'] ?>&amp;margin=<?= $_GET['margin'] ?>&amp;size=<?= $_GET['size'] ?>&amp;bgColor=<?= urlencode($_GET['bgColor']) ?>&amp;mainColor=<?= urlencode($_GET['mainColor']) ?>"> <link rel="search" type="application/opensearchdescription+xml" title="<?= $loc['opensearch_actionName'] ?>" href="opensearch.php&#63;redondancy=<?= $_GET['redondancy'] ?>&amp;margin=<?= $_GET['margin'] ?>&amp;size=<?= $_GET['size'] ?>&amp;bgColor=<?= urlencode($_GET['bgColor']) ?>&amp;mainColor=<?= urlencode($_GET['mainColor']) ?>">
<?php <?php
// If style.min.css exists // If style.min.css exists
if (file_exists("style.min.css")) if (file_exists("temp/style.min.css"))
// And if it's older than theme.php or config.inc.php (so not up to date) // And if it's older than theme.php or config.inc.php (so not up to date)
if (filemtime("themes/" . $theme . "/theme.php") > filemtime("style.min.css") OR filemtime("config.inc.php") > filemtime("style.min.css")) if (filemtime("themes/" . $theme . "/theme.php") > filemtime("temp/style.min.css") OR filemtime("config.inc.php") > filemtime("temp/style.min.css"))
// Then delete it // Then delete it
unlink("style.min.css"); unlink("temp/style.min.css");
require "lessphp/lessc.inc.php"; require "lesserphp/lessc.inc.php";
$less = new lessc; $less = new lessc;
$less->setVariables($variablesTheme); // Rends ces couleurs utilisables dans style.less $less->setVariables($variablesTheme); // Make these colors available in style.less
$less->setFormatter("compressed"); $less->setFormatter("compressed");
$less->checkedCompile("style.less", "style.min.css"); // Compile, minimise et met en cache style.less dans style.min.css $less->checkedCompile("style.less", "temp/style.min.css"); // Compile, minimise and cache style.less into style.min.css
?> ?>
<link type="text/css" rel="stylesheet" href="style.min.css"> <link type="text/css" rel="stylesheet" href="temp/style.min.css">
<link type="text/css" rel="stylesheet" href="ubuntu/ubuntu.min.css"> <link type="text/css" rel="stylesheet" href="ubuntu/ubuntu.min.css">
<?php <?php
foreach($themeDimensionsIcons as $dimFav) { // Indique toutes les dimensions d'icones foreach($themeDimensionsIcons as $dimFav) { // Set all icons dimensions
echo ' <link rel="icon" type="image/png" href="themes/' . $theme . '/icons/' . $dimFav . '.png" sizes="' . $dimFav . 'x' . $dimFav . '">' . "\n"; echo ' <link rel="icon" type="image/png" href="themes/' . $theme . '/icons/' . $dimFav . '.png" sizes="' . $dimFav . 'x' . $dimFav . '">' . "\n";
} ?> } ?>
@ -130,14 +119,14 @@ if (badQuery()) {
<body> <body>
<div class="center"> <main>
<header> <header>
<a id="lienTitres" href="./"> <a id="linkTitles" href="./">
<img id="logo" src="themes/<?php echo $theme; ?>/icons/128.png" alt="Code QR stylisé"> <img alt="" id="logo" src="themes/<?php echo $theme; ?>/icons/128.png">
<div id="titres"> <div id="titles">
<h1>LibreQR</h1> <h1>LibreQR</h1>
<h2>Générateur de codes QR</h2> <h2><?= $loc['subtitle'] ?></h2>
</div> </div>
</a> </a>
</header> </header>
@ -147,24 +136,15 @@ if (badQuery()) {
<div id="firstWrapper"> <div id="firstWrapper">
<div class="param"> <div class="param">
<label for="txt">Texte à encoder</label> <label for="txt"><?= $loc['label_content'] ?></label>
<span class="conteneurAide"> <span class="helpContainer">
<span class="boutonAide" tabindex="0"><img id="helpImg" src="help.svg.php?clr=<?= urlencode($variablesTheme["text"]) ?>" alt="Aide"></span> <span class="helpButton" tabindex="0"><img class="helpImg" src="help.svg.php?clr=<?= urlencode($variablesTheme["text"]) ?>" alt="<?= $loc['alt_help'] ?>"></span>
<span class="contenuAide"> <span class="helpContent">
Vous pouvez encoder ce que vous voulez sous forme de texte.<br> <?= $loc['help_content'] ?>
Les logiciels qui décodent ces codes QR pourraient proposer de les ouvrir avec un logiciel dédié, en fonction de leur <a href="https://fr.wikipedia.org/wiki/Sch%C3%A9ma_d%27URI">schéma d'URI</a>.<br><br>
Par exemple, pour ouvrir une page Web :<br>
https://www.domaine.tld/<br><br>
Pour envoyer un mail :<br>
mailto:contact@domaine.tld<br><br>
Pour partager des coordonnées géographique :<br>
geo:48.867564,2.364057<br><br>
Pour appeler un numéro de téléphone :<br>
tel:0639981871
</span> </span>
</span> </span>
<br> <br>
<textarea rows="8" required="" id="txt" placeholder="Entrez le texte à encoder dans le code QR" name="txt"><?php <textarea rows="8" required="" id="txt" placeholder="<?= $loc['placeholder'] ?>" name="txt"><?php
if (isset($_GET['txt'])) { if (isset($_GET['txt'])) {
echo htmlspecialchars($_GET['txt']); echo htmlspecialchars($_GET['txt']);
@ -176,31 +156,31 @@ if (badQuery()) {
<div id="menusDeroulants"> <div id="menusDeroulants">
<div class="param"> <div class="param">
<label for="redondancy">Taux de redondance</label> <label for="redondancy"><?= $loc['label_redondancy'] ?></label>
<span class="conteneurAide"> <span class="helpContainer">
<span class="boutonAide" tabindex="0"><img id="helpImg" src="help.svg.php?clr=<?= urlencode($variablesTheme["text"]) ?>" alt="Aide"></span> <span class="helpButton" tabindex="0"><img class="helpImg" src="help.svg.php?clr=<?= urlencode($variablesTheme["text"]) ?>" alt="<?= $loc['alt_help'] ?>"></span>
<span class="contenuAide">La redondance est le "doublement" des informations dans le code QR afin de corriger les erreurs lors du décodage. Un taux plus élevé produira un code QR plus grand, mais aura plus de chance d'être décodé correctement.</span> <span class="helpContent"><?= $loc['help_redondancy'] ?></span>
</span> </span>
<br> <br>
<select id="redondancy" name="redondancy"> <select id="redondancy" name="redondancy">
<option <?php if (isset($_GET['redondancy']) AND ($_GET['redondancy'] == "L")) {echo 'selected="" ';} ?>value="L">L - 7% de redondance</option> <option <?php if (isset($_GET['redondancy']) AND ($_GET['redondancy'] == "L")) {echo 'selected="" ';} ?>value="L">L - 7%</option>
<option <?php if (isset($_GET['redondancy']) AND ($_GET['redondancy'] == "M")) {echo 'selected="" ';} ?>value="M">M - 15% de redondance</option> <option <?php if (isset($_GET['redondancy']) AND ($_GET['redondancy'] == "M")) {echo 'selected="" ';} ?>value="M">M - 15%</option>
<option <?php if (isset($_GET['redondancy']) AND ($_GET['redondancy'] == "Q")) {echo 'selected="" ';} ?>value="Q">Q - 25% de redondance</option> <option <?php if (isset($_GET['redondancy']) AND ($_GET['redondancy'] == "Q")) {echo 'selected="" ';} ?>value="Q">Q - 25%</option>
<option <?php if ((isset($_GET['redondancy']) AND ($_GET['redondancy'] == "H")) OR (!isset($_GET['redondancy']) OR empty($_GET['redondancy']))) {echo 'selected="" ';} ?>value="H">H - 30% de redondance</option> <option <?php if ((isset($_GET['redondancy']) AND ($_GET['redondancy'] == "H")) OR (!isset($_GET['redondancy']) OR empty($_GET['redondancy']))) {echo 'selected="" ';} ?>value="H">H - 30%</option>
</select> </select>
</div> </div>
<div class="param"> <div class="param">
<label for="margin">Taille de la marge</label> <label for="margin"><?= $loc['label_margin'] ?></label>
<span class="conteneurAide"> <span class="helpContainer">
<span class="boutonAide" tabindex="0"><img id="helpImg" src="help.svg.php?clr=<?= urlencode($variablesTheme["text"]) ?>" alt="Aide"></span> <span class="helpButton" tabindex="0"><img class="helpImg" src="help.svg.php?clr=<?= urlencode($variablesTheme["text"]) ?>" alt="<?= $loc['alt_help'] ?>"></span>
<span class="contenuAide">Nombre de pixels des bandes blanches autour du code QR.</span> <span class="helpContent"><?= $loc['help_margin'] ?></span>
</span> </span>
<br> <br>
<select id="margin" name="margin"> <select id="margin" name="margin">
<option <?php if (isset($_GET['margin']) AND ($_GET['margin'] == "0")) {echo 'selected="" ';} ?>value="0">0</option> <option <?php if (isset($_GET['margin']) AND ($_GET['margin'] == "0")) {echo 'selected="" ';} ?>value="0">0</option>
<option <?php if (isset($_GET['margin']) AND ($_GET['margin'] == "1")) {echo 'selected="" ';} ?>value="1">1</option> <option <?php if (isset($_GET['margin']) AND ($_GET['margin'] == "1")) {echo 'selected="" ';} ?>value="1">1</option>
<option <?php if ((isset($_GET['margin']) AND ($_GET['margin'] == "2")) OR (!isset($_GET['margin']) OR empty($_GET['margin']))) {echo 'selected="" ';} ?>value="2">2 - par défaut</option> <option <?php if ((isset($_GET['margin']) AND ($_GET['margin'] == "2")) OR (!isset($_GET['margin']) OR empty($_GET['margin']))) {echo 'selected="" ';} ?>value="2">2 - <?= $loc['value_default'] ?></option>
<option <?php if (isset($_GET['margin']) AND ($_GET['margin'] == "3")) {echo 'selected="" ';} ?>value="3">3</option> <option <?php if (isset($_GET['margin']) AND ($_GET['margin'] == "3")) {echo 'selected="" ';} ?>value="3">3</option>
<option <?php if (isset($_GET['margin']) AND ($_GET['margin'] == "4")) {echo 'selected="" ';} ?>value="4">4</option> <option <?php if (isset($_GET['margin']) AND ($_GET['margin'] == "4")) {echo 'selected="" ';} ?>value="4">4</option>
<option <?php if (isset($_GET['margin']) AND ($_GET['margin'] == "5")) {echo 'selected="" ';} ?>value="5">5</option> <option <?php if (isset($_GET['margin']) AND ($_GET['margin'] == "5")) {echo 'selected="" ';} ?>value="5">5</option>
@ -210,17 +190,17 @@ if (badQuery()) {
</div> </div>
<div class="param"> <div class="param">
<label for="size">Taille de l'image</label> <label for="size"><?= $loc['label_size'] ?></label>
<span class="conteneurAide"> <span class="helpContainer">
<span class="boutonAide" tabindex="0"><img id="helpImg" src="help.svg.php?clr=<?= urlencode($variablesTheme["text"]) ?>" alt="Aide"></span> <span class="helpButton" tabindex="0"><img class="helpImg" src="help.svg.php?clr=<?= urlencode($variablesTheme["text"]) ?>" alt="<?= $loc['alt_help'] ?>"></span>
<span class="contenuAide">Par combien les dimensions de l'image seront-elles multipliées ?</span> <span class="helpContent"><?= $loc['help_size'] ?></span>
</span> </span>
<br> <br>
<select id="size" name="size"> <select id="size" name="size">
<option <?php if (isset($_GET['size']) AND ($_GET['size'] == 1)) {echo 'selected="" ';} ?>value="1">1</option> <option <?php if (isset($_GET['size']) AND ($_GET['size'] == 1)) {echo 'selected="" ';} ?>value="1">1</option>
<option <?php if (isset($_GET['size']) AND ($_GET['size'] == 2)) {echo 'selected="" ';} ?>value="2">2</option> <option <?php if (isset($_GET['size']) AND ($_GET['size'] == 2)) {echo 'selected="" ';} ?>value="2">2</option>
<option <?php if (isset($_GET['size']) AND ($_GET['size'] == 3)) {echo 'selected="" ';} ?>value="3">3</option> <option <?php if (isset($_GET['size']) AND ($_GET['size'] == 3)) {echo 'selected="" ';} ?>value="3">3</option>
<option <?php if ((isset($_GET['size']) AND ($_GET['size'] == 4)) OR (!isset($_GET['size']) OR empty($_GET['size']))) {echo 'selected="" ';} ?>value="4">4 - par défaut</option> <option <?php if ((isset($_GET['size']) AND ($_GET['size'] == 4)) OR (!isset($_GET['size']) OR empty($_GET['size']))) {echo 'selected="" ';} ?>value="4">4 - <?= $loc['value_default'] ?></option>
<option <?php if (isset($_GET['size']) AND ($_GET['size'] == 5)) {echo 'selected="" ';} ?>value="5">5</option> <option <?php if (isset($_GET['size']) AND ($_GET['size'] == 5)) {echo 'selected="" ';} ?>value="5">5</option>
<option <?php if (isset($_GET['size']) AND ($_GET['size'] == 6)) {echo 'selected="" ';} ?>value="6">6</option> <option <?php if (isset($_GET['size']) AND ($_GET['size'] == 6)) {echo 'selected="" ';} ?>value="6">6</option>
<option <?php if (isset($_GET['size']) AND ($_GET['size'] == 8)) {echo 'selected="" ';} ?>value="8">8</option> <option <?php if (isset($_GET['size']) AND ($_GET['size'] == 8)) {echo 'selected="" ';} ?>value="8">8</option>
@ -237,22 +217,22 @@ if (badQuery()) {
<div id="colors"> <div id="colors">
<div class="param"> <div class="param">
<label for="bgColor">Couleur de fond</label> <label for="bgColor"><?= $loc['label_bgColor'] ?></label>
<div class="conteneurInputColor"> <div class="inputColorContainer">
<input type="color" name="bgColor" id="bgColor" value="<?php if (!empty($_GET['bgColor'])) {echo htmlspecialchars($_GET['bgColor']);} else {echo "#FFFFFF";} ?>"> <input type="color" name="bgColor" id="bgColor" value="<?php if (!empty($_GET['bgColor'])) {echo htmlspecialchars($_GET['bgColor']);} else {echo "#FFFFFF";} ?>">
</div> </div>
</div> </div>
<div class="param"> <div class="param">
<label for="mainColor">Couleur de premier plan</label> <label for="mainColor"><?= $loc['label_mainColor'] ?></label>
<div class="conteneurInputColor"> <div class="inputColorContainer">
<input type="color" name="mainColor" id="mainColor" value="<?php if (!empty($_GET['mainColor'])) {echo htmlspecialchars($_GET['mainColor']);} else {echo "#000000";} ?>"> <input type="color" name="mainColor" id="mainColor" value="<?php if (!empty($_GET['mainColor'])) {echo htmlspecialchars($_GET['mainColor']);} else {echo "#000000";} ?>">
</div> </div>
</div> </div>
</div> </div>
<div class="centrer"> <div class="centered">
<input class="bouton" type="submit" value="Générer" /> <input class="button" type="submit" value="<?= $loc['button_create'] ?>" />
</div> </div>
</form> </form>
@ -267,34 +247,37 @@ if (badQuery()) {
$cheminImage = "temp/" . generateRandomString($fileNameLenght) . ".png"; $cheminImage = "temp/" . generateRandomString($fileNameLenght) . ".png";
QRcode::png($_GET['txt'], $cheminImage, $_GET['redondancy'], $_GET['size'], $_GET['margin'], false, hexdec($_GET['bgColor']), hexdec($_GET['mainColor'])); QRcode::png($_GET['txt'], $cheminImage, $_GET['redondancy'], $_GET['size'], $_GET['margin'], false, hexdec($_GET['bgColor']), hexdec($_GET['mainColor']));
?> ?>
<div class="centrer"> <div class="centered">
<a href="<?php echo $cheminImage; ?>" class="bouton" download="<?php echo htmlspecialchars($_GET['txt']); ?>.png">Télécharger ce code QR</a> <a href="<?php echo $cheminImage; ?>" class="button" download="<?php echo htmlspecialchars($_GET['txt']); ?>.png"><?= $loc['button_download'] ?></a>
</div> </div>
<div class="centrer" id="showOnlyQR"> <div class="centered" id="showOnlyQR">
<a title="Cliquez pour afficher uniquement ce code QR" href="<?php echo $cheminImage; ?>"><img alt='Un code QR contenant "<?php echo htmlspecialchars($_GET['txt']); ?>"' id="qrCode" src="<?php echo $cheminImage; ?>"/></a> <a title="<?= $loc['title_showOnlyQR'] ?>" href="<?php echo $cheminImage; ?>"><img alt='<?= $loc['alt_QR_before'] ?><?php echo htmlspecialchars($_GET['txt']); ?><?= $loc['alt_QR_after'] ?>' id="qrCode" src="<?php echo $cheminImage; ?>"/></a>
</div> </div>
<?php <?php
} }
} }
?> ?>
</div> <footer>
<div id="metaTexts">
<section id="info" class="metaText"> <section id="info" class="metaText">
<h3>Qu'est-ce qu'un code QR ?</h3> <?= $loc['metaText_qr'] ?>
Un code QR est un code-barres en 2 dimensions dans lequel est inscrit en binaire du texte. Il peut être décodé avec un appareil muni d'un capteur photo et d'un logiciel adéquat. </section>
<a href="https://fr.wikipedia.org/wiki/Code_QR">Code QR sur Wikipédia</a>
<?php if ($customTextEnabled) { ?>
<section class="metaText">
<?= $customText ?>
</section>
<?php } ?>
<section class="metaText">
<?= $loc['metaText_legal'] ?>
</section> </section>
<footer class="metaText">
LibreQR 1.2.0 est un logiciel libre dont le <a href="https://code.antopie.org/miraty/libreqr/">code source</a> est disponible
selon les termes de l'<abbr title="GNU Affero General Public License version 3 ou toute version ultérieure"><a href="LICENSE.html">AGPLv3</a>+</abbr>.
</footer> </footer>
</div> </main>
</body> </body>
</html> </html>

5
lessphp/LICENSE → lesserphp/LICENSE Executable file → Normal file
View File

@ -1,4 +1,4 @@
For ease of distribution, lessphp is under a dual license. For ease of distribution, lessphp 0.5.1 is under a dual license.
You are free to pick which one suits your needs. You are free to pick which one suits your needs.
@ -9,7 +9,8 @@ MIT LICENSE
Copyright (c) 2014 Leaf Corcoran, http://leafo.net/lessphp Copyright (c) 2013 - 2015 Leaf Corcoran, http://leafo.net/lessphp
Copyright (c) 2016 - Marcus Schwarz, https://www.maswaba.de
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the

13
lessphp/README.md → lesserphp/README.md Executable file → Normal file
View File

@ -1,9 +1,10 @@
[![Build Status](https://travis-ci.org/leafo/lessphp.svg?branch=master)](https://travis-ci.org/leafo/lessphp) [![Build Status](https://travis-ci.org/MarcusSchwarz/lesserphp.svg)](https://travis-ci.org/MarcusSchwarz/lesserphp)
# lessphp v0.5.0 # lesserphp v0.5.4
### <http://leafo.net/lessphp> ### <http://github.com/MarcusSchwarz/lesserphp>
`lessphp` is a compiler for LESS written in PHP. The documentation is great, `lesserphp` is a compiler for LESS written in PHP. It is based on lessphp bei leafo.
The documentation is great,
so check it out: <http://leafo.net/lessphp/docs/>. so check it out: <http://leafo.net/lessphp/docs/>.
Here's a quick tutorial: Here's a quick tutorial:
@ -12,7 +13,7 @@ Here's a quick tutorial:
The only file required is `lessc.inc.php`, so copy that to your include directory. The only file required is `lessc.inc.php`, so copy that to your include directory.
The typical flow of **lessphp** is to create a new instance of `lessc`, The typical flow of **lesserphp** is to create a new instance of `lessc`,
configure it how you like, then tell it to compile something using one built in configure it how you like, then tell it to compile something using one built in
compile methods. compile methods.
@ -48,7 +49,7 @@ If there any problem compiling your code, an exception is thrown with a helpful
<?php <?php
try { try {
$less->compile("invalid LESS } {"); $less->compile("invalid LESS } {");
} catch (exception $e) { } catch (\Exception $e) {
echo "fatal error: " . $e->getMessage(); echo "fatal error: " . $e->getMessage();
} }
``` ```

1400
lesserphp/docs/docs.md Normal file

File diff suppressed because it is too large Load Diff

4019
lesserphp/lessc.inc.php Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

51
locales/en.php Normal file
View File

@ -0,0 +1,51 @@
<?php
$loc = array(
'subtitle' => "QR codes generator",
'description' => "Generate QR codes freely. Choose content, size, colors...",
'label_content' => "Text to encode",
'label_redondancy' => "Redondancy rate",
'label_margin' => "Margin size",
'label_size' => "Image size",
'label_bgColor' => "Background color",
'label_mainColor' => "Foreground color",
'placeholder' => "Enter the text to encode in the QR code",
'value_default' => "default",
'help_content' => "
You can only encode whatever text you want.<br>
Softwares which decode these QR codes could suggest to open them with dedicated software, depending on their <a href='https://en.wikipedia.org/wiki/List_of_URI_schemes'>URI scheme</a>.<br><br>
For instance, to open a webpage:<br>
https://www.domain.tld/<br><br>
To send an email:<br>
mailto:contact@domain.tld<br><br>
To share geographic coordinates:<br>
geo:48.867564,2.364057<br><br>
To call a phone number:<br>
tel:+33639981871
",
'help_redondancy' => "Redundancy is the duplication of information in the QR code to correct errors during decoding. A higher rate will produce a bigger QR code, but will have a better chance of being decoded correctly.",
'help_margin' => "Number of pixels in the white bands around the QR code.",
'help_size' => "By how much will the dimensions of the image be multiplied?",
'button_create' => "Generate",
'button_download' => "Download this QR code",
'title_showOnlyQR' => "Show this QR code only",
'alt_help' => "Help",
'alt_QR_before' => 'QR code meaning "',
'alt_QR_after' => '"',
'metaText_qr' => "
<h3>What's a QR code?</h3>
A QR code is a 2 dimensions barcode in which a text is written in binary. It can be decoded with a device equipped with a photo sensor and an adequate software.
<a href='https://en.wikipedia.org/wiki/QR_code'>QR code on Wikipedia</a>
",
'metaText_legal' => "LibreQR " . $libreqrVersion . " is a free software whose <a href='https://code.antopie.org/miraty/libreqr/'>source code</a> is available under the terms of the <abbr title='GNU Affero General Public License version 3 or any later version'><a href='LICENSE.html'>AGPLv3</a>+</abbr>.",
'opensearch_description' => "Generate QR codes from your search or address bar",
'opensearch_actionName' => "Generate QR codes from your search or address bar",
);

51
locales/fr.php Normal file
View File

@ -0,0 +1,51 @@
<?php
$loc = array(
'subtitle' => "Générateur de codes QR",
'description' => "Générez des codes QR librement. Choisissez le contenu, la taille, les couleurs...",
'label_content' => "Texte à encoder",
'label_redondancy' => "Taux de redondance",
'label_margin' => "Taille de la marge",
'label_size' => "Taille de l'image",
'label_bgColor' => "Couleur de fond",
'label_mainColor' => "Couleur de premier plan",
'placeholder' => "Entrez le texte à encoder dans le code QR",
'value_default' => "par défaut",
'help_content' => "
Vous pouvez encoder ce que vous voulez sous forme de texte.<br>
Les logiciels qui décodent ces codes QR pourraient proposer de les ouvrir avec un logiciel dédié, en fonction de leur <a href='https://fr.wikipedia.org/wiki/Sch%C3%A9ma_d%27URI'>schéma d'URI</a>.<br><br>
Par exemple, pour ouvrir une page Web :<br>
https://www.domaine.tld/<br><br>
Pour envoyer un mail :<br>
mailto:contact@domaine.tld<br><br>
Pour partager des coordonnées géographique :<br>
geo:48.867564,2.364057<br><br>
Pour appeler un numéro de téléphone :<br>
tel:+33639981871
",
'help_redondancy' => "La redondance est la duplication des informations dans le code QR afin de corriger les erreurs lors du décodage. Un taux plus élevé produira un code QR plus grand, mais aura plus de chance d'être décodé correctement.",
'help_margin' => "Nombre de pixels des bandes blanches autour du code QR.",
'help_size' => "Par combien les dimensions de l'image seront-elles multipliées ?",
'button_create' => "Générer",
'button_download' => "Télécharger ce code QR",
'title_showOnlyQR' => "Afficher uniquement ce code QR",
'alt_help' => "Aide",
'alt_QR_before' => "Code QR signifiant « ",
'alt_QR_after' => " »",
'metaText_qr' => "
<h3>Qu'est-ce qu'un code QR ?</h3>
Un code QR est un code-barres en 2 dimensions dans lequel du texte est inscrit en binaire. Il peut être décodé avec un appareil muni d'un capteur photo et d'un logiciel adéquat.
<a href='https://fr.wikipedia.org/wiki/Code_QR'>Code QR sur Wikipédia</a>
",
'metaText_legal' => "LibreQR " . $libreqrVersion . " est un logiciel libre dont le <a href='https://code.antopie.org/miraty/libreqr/'>code source</a> est disponible selon les termes de l'<abbr title='GNU Affero General Public License version 3 ou toute version ultérieure'><a href='LICENSE.html'>AGPLv3</a>+</abbr>.",
'opensearch_description' => "Générez des codes QR depuis votre barre de recherche ou d'adresse",
'opensearch_actionName' => "Générez des codes QR depuis votre barre de recherche ou d'adresse",
);

36
locales/template.php Normal file
View File

@ -0,0 +1,36 @@
<?php
$loc = array(
'subtitle' => "subtitle",
'description' => "description",
'label_content' => "label_content",
'label_redondancy' => "label_redondancy",
'label_margin' => "label_margin",
'label_size' => "label_size",
'label_bgColor' => "label_bgColor",
'label_mainColor' => "label_mainColor",
'placeholder' => "placeholder",
'value_default' => "value_default",
'help_content' => "help_content",
'help_redondancy' => "help_redondancy",
'help_margin' => "help_margin",
'help_size' => "help_size",
'button_create' => "button_create",
'button_download' => "button_download",
'title_showOnlyQR' => "title_showOnlyQR",
'alt_help' => "alt_help",
'alt_QR_before' => "alt_QR_before",
'alt_QR_after' => "alt_QR_after",
'metaText_qr' => "metaText_qr",
'metaText_legal' => "metaText_legal",
'opensearch_description' => "opensearch_description",
'opensearch_actionName' => "opensearch_actionName",
);

View File

@ -1,28 +1,28 @@
<?php require "config.inc.php"; ?> <?php require "inc.php"; ?>
{ {
"dir": "ltr", "dir": "ltr",
"lang": "fr", "lang": "<?= $locale ?>",
"name": "LibreQR", "name": "LibreQR",
"short_name": "LibreQR", "short_name": "LibreQR",
"description": "Générer un code QR", "description": "<?= $loc['subtitle'] ?>",
"start_url": "<?php echo $instPath; ?>", "start_url": "<?= $instPath; ?>",
"scope": "<?php echo $instPath; ?>", "scope": "<?= $instPath; ?>",
"display": "standalone", "display": "standalone",
"theme_color": "<?php echo $variablesTheme["bg"]; ?>", "theme_color": "<?= $variablesTheme["bg"]; ?>",
"background_color": "<?php echo $variablesTheme["bg"]; ?>", "background_color": "<?= $variablesTheme["bg"]; ?>",
"orientation": "portrait", "orientation": "portrait",
"icons": "icons":
[ [
<?php for ($i = 0; $i < (count($themeDimensionsIcons) - 1); $i++) { ?> <?php for ($i = 0; $i < (count($themeDimensionsIcons) - 1); $i++) { ?>
{ {
"src": "themes/<?php echo $theme; ?>/icons/<?php echo $themeDimensionsIcons[$i]; ?>.png", "src": "themes/<?= $theme; ?>/icons/<?= $themeDimensionsIcons[$i]; ?>.png",
"sizes": "<?php echo $themeDimensionsIcons[$i]; ?>x<?php echo $themeDimensionsIcons[$i]; ?>", "sizes": "<?= $themeDimensionsIcons[$i]; ?>x<?= $themeDimensionsIcons[$i]; ?>",
"type": "image/png" "type": "image/png"
}, },
<?php } ?> <?php } ?>
{ {
"src": "themes/<?php echo $theme; ?>/icons/<?php echo $themeDimensionsIcons[$i]; ?>.png", "src": "themes/<?= $theme; ?>/icons/<?= $themeDimensionsIcons[$i]; ?>.png",
"sizes": "<?php echo $themeDimensionsIcons[$i]; ?>x<?php echo $themeDimensionsIcons[$i]; ?>", "sizes": "<?= $themeDimensionsIcons[$i]; ?>x<?= $themeDimensionsIcons[$i]; ?>",
"type": "image/png" "type": "image/png"
} }
] ]

View File

@ -1,8 +1,8 @@
<?php require "config.inc.php"; ?> <?php require "inc.php"; ?>
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"> <OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>Générer un code QR</ShortName> <ShortName>LibreQR</ShortName>
<Description>Générez des codes QR depuis votre barre de recherche ou d'adresse</Description> <Description><?= $loc['opensearch_actionName'] ?></Description>
<?php <?php
foreach($themeDimensionsIcons as $dimIcon) { foreach($themeDimensionsIcons as $dimIcon) {
echo ' <Image height="' . $dimIcon . '" width="' . $dimIcon . '" type="image/png">' . $instPath . 'themes/' . $theme . '/icons/' . $dimIcon . '.png</Image>' . "\n"; echo ' <Image height="' . $dimIcon . '" width="' . $dimIcon . '" type="image/png">' . $instPath . 'themes/' . $theme . '/icons/' . $dimIcon . '.png</Image>' . "\n";

View File

@ -33,6 +33,10 @@ a {
} }
} }
p {
margin: 10px;
}
#firstWrapper { #firstWrapper {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@ -47,27 +51,27 @@ a {
max-width: 480px; max-width: 480px;
} }
.centrer { .centered {
text-align: center; text-align: center;
} }
.bouton { .button {
padding: 3px 10px 3px 10px; padding: 3px 10px 3px 10px;
text-decoration: none; text-decoration: none;
} }
form { form {
display: block; flex-grow: 1;
margin-bottom: 30px; margin-bottom: 30px;
} }
.center { main {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
width: 814px; width: 814px;
height: 99%;
} }
body { body {
@ -76,16 +80,11 @@ body {
color: @text; color: @text;
font-weight: normal; font-weight: normal;
font-size: 20px; font-size: 20px;
height: 99%;
& h1 {
color: @text;
text-decoration: none;
}
} }
label { html {
font-size: 20px; height: 97%;
} }
header { header {
@ -100,7 +99,7 @@ header {
height: 64px; height: 64px;
} }
#titres { #titles {
margin-left: 20px; margin-left: 20px;
} }
@ -117,7 +116,7 @@ h2 {
font-size: 22px; font-size: 22px;
} }
#lienTitres { #linkTitles {
text-align: left; text-align: left;
justify-content: center; justify-content: center;
text-decoration: none; text-decoration: none;
@ -129,11 +128,6 @@ h2 {
margin-top: 30px; margin-top: 30px;
} }
#titre {
text-align: center;
justify-content: center;
}
.param { .param {
padding: 10px; padding: 10px;
padding-left: 0px; padding-left: 0px;
@ -142,7 +136,7 @@ h2 {
margin-right: 0px; margin-right: 0px;
} }
.conteneurInputColor { .inputColorContainer {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: center; justify-content: center;
@ -174,18 +168,16 @@ label[for=txt] {
.metaText { .metaText {
color: @secondaryText; color: @secondaryText;
text-align: left;
transition: color 0.12s cubic-bezier(0.42, 0.0, 1.0, 1.0); transition: color 0.12s cubic-bezier(0.42, 0.0, 1.0, 1.0);
position: fixed; padding: 6px;
width: 400px;
& a:link { & a, a:visited {
transition: color 0.12s cubic-bezier(0.42, 0.0, 1.0, 1.0); transition: color 0.12s cubic-bezier(0.42, 0.0, 1.0, 1.0);
color: @secondaryText; color: @secondaryText;
text-decoration: underline; text-decoration: underline;
} }
&:hover, &:hover a:link { &:hover, &:hover a {
color: @text; color: @text;
} }
@ -193,8 +185,12 @@ label[for=txt] {
footer { footer {
font-size: 14px; font-size: 14px;
bottom: 20px; padding-top: 20px;
left: 20px; text-align: left;
}
header, footer {
flex-shrink: 0;
} }
#info { #info {
@ -212,7 +208,7 @@ footer {
/* Inputs */ /* Inputs */
#redondancy, #margin, #txt, #size, input[type=color], input[type=submit], .bouton { #redondancy, #margin, #txt, #size, input[type=color], input[type=submit], .button {
border: 2px @border solid; border: 2px @border solid;
border-radius: 10px; border-radius: 10px;
font-size: 20px; font-size: 20px;
@ -271,24 +267,30 @@ input[type=color] {
border: 2px @border solid; border: 2px @border solid;
} }
/* Infobulle */ /* Help message */
#helpImg { .helpImg {
width: 20px; width: 22px;
height: 20px; height: 22px;
margin-bottom: -3px; margin-bottom: -3px;
margin-left: 5px; display: inline-block;
} }
.boutonAide { .helpButton {
height: 0px; height: 22px;
width: 0px; width: 22px;
color: @secondaryText; color: @secondaryText;
cursor: help; cursor: help;
font-size: 0.8em; font-size: 0.8em;
display: inline-block;
} }
.conteneurAide .contenuAide { .helpContainer {
display: inline-block;
margin-left: 5px;
}
.helpContent {
position: absolute; position: absolute;
transform: scale(0) rotate(-12deg); transform: scale(0) rotate(-12deg);
color: @text; color: @text;
@ -312,55 +314,16 @@ input[type=color] {
} }
} }
.conteneurAide:hover .contenuAide, .conteneurAide:focus-within .contenuAide { .helpContainer:hover .helpContent, .helpContainer:focus-within .helpContent {
transform: scale(1) rotate(0); transform: scale(1) rotate(0);
opacity: 1; opacity: 1;
} }
/* Media queries */ /* Media queries */
@media (max-width: 1400px) {
.metaText {
width: 250px;
}
}
@media (max-width: 1050px) {
#metaTexts {
display: flex;
flex-direction: row;
}
.metaText {
width: 100%;
position: static;
font-size: 20px;
}
#info {
color: @text;
margin-bottom: 20px;
padding-top: 30px;
font-size: 20px;
& a:link {
color: @text;
}
}
}
@media (max-width: 850px) { @media (max-width: 850px) {
#metaTexts { main {
flex-direction: column;
width: 480px;
justify-content: center;
margin-left: auto;
margin-right: auto;
}
.center {
width: auto; width: auto;
} }
@ -378,11 +341,7 @@ input[type=color] {
} }
@media (max-width: 500px) { // Version mobile @media (max-width: 500px) { // Mobile version
#metaTexts {
width: auto;
}
#colors { #colors {
flex-direction: column; flex-direction: column;

1
style.min.css vendored
View File

@ -1 +0,0 @@
*{font-family:"Ubuntu", sans-serif;scrollbar-color:white #2a2a2a;scrollbar-width:auto;}a{color:white;text-decoration:underline;}a:hover{text-decoration:none;}#firstWrapper{display:flex;flex-direction:row;}#menusDeroulants{text-align:center;margin-left:20px;}#qrCode{max-width:480px;}.centrer{text-align:center;}.bouton{padding:3px 10px 3px 10px;text-decoration:none;}form{display:block;margin-bottom:30px;}.center{display:flex;flex-direction:column;justify-content:center;margin-left:auto;margin-right:auto;width:814px;}body{margin:18px;background-color:#2a2a2a;color:white;font-weight:normal;font-size:20px;}body h1{color:white;text-decoration:none;}label{font-size:20px;}header{text-align:center;padding:0px;margin:0px;height:64px;}#logo{width:64px;height:64px;}#titres{margin-left:20px;}h1,h2,h3,h4,h5,h6{margin:0px;font-weight:normal;}h1{font-size:33px;}h2{font-size:22px;}#lienTitres{text-align:left;justify-content:center;text-decoration:none;display:flex;flex-direction:row;}#showOnlyQR{margin-top:30px;}#titre{text-align:center;justify-content:center;}.param{padding:10px;padding-left:0px;margin-left:0px;padding-right:0px;margin-right:0px;}.conteneurInputColor{display:flex;flex-direction:row;justify-content:center;}::selection{color:#2a2a2a;background-color:white;}label[for=txt]{padding-left:22px;}#colors{display:flex;flex-direction:row;justify-content:space-between;text-align:center;}#colors .param{text-align:center;display:flex;justify-content:center;flex-direction:column;width:100%;}.metaText{color:#868686;text-align:left;transition:color 0.12s cubic-bezier(0.42,0.0,1.0,1.0);position:fixed;width:400px;}.metaText a:link{transition:color 0.12s cubic-bezier(0.42,0.0,1.0,1.0);color:#868686;text-decoration:underline;}.metaText:hover,.metaText:hover a:link{color:white;}footer{font-size:14px;bottom:20px;left:20px;}#info{font-size:16px;bottom:20px;right:20px;margin:0px;}#info h3{font-size:20px;font-weight:normal;padding-bottom:10px;}#redondancy,#margin,#txt,#size,input[type=color],input[type=submit],.bouton{border:2px #5f5f5f solid;border-radius:10px;font-size:20px;padding-left:10px;font-weight:normal;color:white;transition:border 0.1s linear;background-color:#31363b;margin-top:8px;}#redondancy:hover,#margin:hover,#txt:hover,#size:hover,input[type=color]:hover,input[type=submit]:hover,.bouton:hover{border:2px #808080 solid;}#redondancy:focus,#margin:focus,#txt:focus,#size:focus,input[type=color]:focus,input[type=submit]:focus,.bouton:focus{border:2px white solid;outline:none;}#redondancy,#size,#margin{background-color:#31363b;width:250px;height:40px;}#txt{background-color:#232629;color:white;padding:10px;margin:10px;width:500px;scrollbar-color:white #232629;scrollbar-width:auto;}input[type=submit]{font-size:28px;padding:10px;padding-left:14px;padding-right:14px;}#txt::placeholder{color:#868686;opacity:1;font-family:"Ubuntu", sans-serif;font-weight:normal;font-size:1em;}input[type=color]{height:60px;width:84px;padding:5px;border:2px #5f5f5f solid;}#helpImg{width:20px;height:20px;margin-bottom:-3px;margin-left:5px;}.boutonAide{height:0px;width:0px;color:#868686;cursor:help;font-size:0.8em;}.conteneurAide .contenuAide{position:absolute;transform:scale(0) rotate(-12deg);color:white;background:#151616;padding:15px;border-radius:10px;box-shadow:0 0 10px rgba(0,0,0,0.5);margin-top:23px;margin-left:-35px;transition:all .25s;opacity:0;max-width:500px;font-size:20px;text-align:left;}@media (max-width: 500px){.conteneurAide .contenuAide{position:fixed;margin:5px;left:0px;top:0px;}}.conteneurAide:hover .contenuAide,.conteneurAide:focus-within .contenuAide{transform:scale(1) rotate(0);opacity:1;}@media (max-width: 1400px){.metaText{width:250px;}}@media (max-width: 1050px){#metaTexts{display:flex;flex-direction:row;}.metaText{width:100%;position:static;font-size:20px;}#info{color:white;margin-bottom:20px;padding-top:30px;font-size:20px;}#info a:link{color:white;}}@media (max-width: 850px){#metaTexts{flex-direction:column;width:480px;justify-content:center;margin-left:auto;margin-right:auto;}.center{width:auto;}#firstWrapper{flex-direction:column;}body{margin:10px;}#txt{width:92%;}}@media (max-width: 500px){#metaTexts{width:auto;}#colors{flex-direction:column;}h1{font-size:28px;padding-top:6px;}#txt{width:85%;}#qrCode{max-width:94%;}}@media (max-width: 415px){h1{padding:0px;}}

View File

@ -11,5 +11,5 @@ $variablesTheme = array(
"borderHover" => "#808080", "borderHover" => "#808080",
"borderFocus" => "white", "borderFocus" => "white",
"text" => "white", "text" => "white",
"secondaryText" => "#868686" "secondaryText" => "#bababa"
); // Définit les couleurs du thème ); // Définit les couleurs du thème