From 3b34d0137e672387909494967123983d45db1ffd Mon Sep 17 00:00:00 2001 From: Ludovic CHEVALIER Date: Wed, 12 Mar 2014 10:05:19 +0100 Subject: [PATCH] [PLUGINS] ~formidable 1.3.6 --> 1.9.1 --- www/plugins/facteur/classes/facteur.php | 101 +- www/plugins/facteur/emails/texte.html | 2 +- www/plugins/facteur/facteur_fonctions.php | 98 ++ www/plugins/facteur/facteur_pipelines.php | 33 + www/plugins/facteur/inc/envoyer_mail.php | 38 +- www/plugins/facteur/lang/facteur.xml | 30 +- www/plugins/facteur/lang/facteur_de.php | 34 +- www/plugins/facteur/lang/facteur_en.php | 19 +- www/plugins/facteur/lang/facteur_es.php | 23 +- www/plugins/facteur/lang/facteur_fa.php | 79 ++ www/plugins/facteur/lang/facteur_fr.php | 51 +- www/plugins/facteur/lang/facteur_fr_tu.php | 79 ++ www/plugins/facteur/lang/facteur_nl.php | 79 ++ www/plugins/facteur/lang/facteur_sk.php | 7 +- www/plugins/facteur/lang/paquet-facteur.xml | 23 +- .../facteur/lang/paquet-facteur_de.php | 16 + .../facteur/lang/paquet-facteur_fr.php | 2 +- .../facteur/lang/paquet-facteur_fr_tu.php | 16 + .../facteur/lang/paquet-facteur_nl.php | 16 + .../facteur/lang/paquet-facteur_ru.php | 16 + .../facteur/lib/markdownify/LICENSE_LGPL.txt | 504 +++++++ .../facteur/lib/markdownify/markdownify.php | 1192 +++++++++++++++++ .../lib/markdownify/markdownify_extra.php | 489 +++++++ .../lib/markdownify/parsehtml/parsehtml.php | 618 +++++++++ www/plugins/facteur/paquet.xml | 3 +- .../phpmailer-php5/class.phpmailer.php | 8 +- www/plugins/facteur/svn.revision | 12 +- .../action/editer_formulaire.php | 4 +- .../action/exporter_analyse_reponses.php | 11 +- .../action/exporter_formulaires_reponses.php | 2 +- .../action/vider_formulaire.php | 37 + .../formidable_1_0/base/formidable_tables.php | 6 +- .../formidable_administrations.php | 6 + .../formidable_autorisations.php | 61 +- .../formidable_1_0/formidable_pipelines.php | 26 +- .../configurer_formidable_analyse.html | 15 + .../formulaires/formidable.html | 7 +- .../formidable_1_0/formulaires/formidable.php | 19 +- .../formulaires/importer_formulaire.html | 1 + .../formulaire-reponses-supprimer-24.png | Bin 0 -> 1423 bytes www/plugins/formidable_1_0/inc/formidable.php | 5 +- .../formidable_1_0/lang/formidable.xml | 13 +- .../formidable_1_0/lang/formidable_de.php | 43 - .../formidable_1_0/lang/formidable_en.php | 8 +- .../formidable_1_0/lang/formidable_es.php | 3 - .../formidable_1_0/lang/formidable_fr.php | 94 +- .../formidable_1_0/lang/formidable_it.php | 47 +- .../formidable_1_0/lang/formidable_sk.php | 14 +- .../formidable_1_0/lang/paquet-formidable.xml | 4 + .../lang/paquet-formidable_fr.php | 18 +- .../modeles/formulaire_analyse.html | 9 +- www/plugins/formidable_1_0/paquet.xml | 16 +- .../squelettes/contenu/formulaire_edit.html | 40 +- .../prive/squelettes/contenu/formulaires.html | 9 +- .../prive/squelettes/extra/formulaire.html | 4 +- .../squelettes/extra/formulaire_edit.html | 2 +- .../extra/formulaires_reponses.html | 16 +- .../squelettes/hierarchie/formulaire.html | 4 +- .../hierarchie/formulaire_edit.html | 6 +- .../squelettes/navigation/formulaire.html | 2 +- .../squelettes/navigation/formulaires.html | 2 - .../saisies-analyses/selection.html | 2 +- www/plugins/formidable_1_0/svn.revision | 12 +- www/plugins/formidable_1_0/todo.txt | 1 - www/plugins/formidable_1_0/traiter/email.php | 21 +- www/plugins/formidable_1_0/traiter/email.yaml | 7 + .../formidable_1_0/traiter/enregistrement.php | 4 +- .../traiter/enregistrement.yaml | 13 + .../formulaires/construire_formulaire.html | 108 +- www/plugins/saisies/inc/saisies.php | 105 +- www/plugins/saisies/inc/saisies_afficher.php | 12 +- www/plugins/saisies/inc/saisies_lister.php | 27 +- .../saisies/inclure/generer_saisies.html | 4 +- www/plugins/saisies/javascript/saisies.js | 10 +- www/plugins/saisies/lang/paquet-saisies.xml | 25 +- .../saisies/lang/paquet-saisies_ar.php | 18 + .../saisies/lang/paquet-saisies_fr.php | 2 +- .../saisies/lang/paquet-saisies_fr_tu.php | 19 + .../saisies/lang/paquet-saisies_nl.php | 17 + www/plugins/saisies/lang/saisies.xml | 33 +- www/plugins/saisies/lang/saisies_ca.php | 101 +- www/plugins/saisies/lang/saisies_de.php | 10 +- www/plugins/saisies/lang/saisies_en.php | 18 +- www/plugins/saisies/lang/saisies_es.php | 79 +- www/plugins/saisies/lang/saisies_fa.php | 53 +- www/plugins/saisies/lang/saisies_fr.php | 91 +- www/plugins/saisies/lang/saisies_fr_tu.php | 154 ++- www/plugins/saisies/lang/saisies_it.php | 49 +- www/plugins/saisies/lang/saisies_nl.php | 190 +++ www/plugins/saisies/lang/saisies_ru.php | 208 ++- www/plugins/saisies/lang/saisies_sk.php | 25 +- www/plugins/saisies/paquet.xml | 4 +- www/plugins/saisies/plugin.xml | 8 +- .../saisies/saisies-vues/checkbox.html | 7 +- www/plugins/saisies/saisies-vues/mot.html | 3 + www/plugins/saisies/saisies-vues/oui_non.html | 2 +- .../saisies/saisies-vues/selection.html | 2 +- www/plugins/saisies/saisies/_base.html | 2 +- .../saisies/saisies/articles_originaux.html | 2 +- www/plugins/saisies/saisies/auteurs.html | 5 +- www/plugins/saisies/saisies/auteurs.yaml | 14 + www/plugins/saisies/saisies/case.html | 5 +- www/plugins/saisies/saisies/case.yaml | 14 + www/plugins/saisies/saisies/checkbox.html | 21 +- www/plugins/saisies/saisies/checkbox.yaml | 26 + .../saisies/saisies/choisir_objet.html | 2 +- www/plugins/saisies/saisies/date.yaml | 14 + .../saisies/saisies/date_jour_mois_annee.html | 9 +- .../saisies/saisies/destinataires.html | 22 +- .../saisies/saisies/destinataires.yaml | 21 + www/plugins/saisies/saisies/explication.yaml | 14 + www/plugins/saisies/saisies/fieldset.yaml | 14 + www/plugins/saisies/saisies/groupe_mots.html | 9 +- www/plugins/saisies/saisies/input.html | 2 +- www/plugins/saisies/saisies/input.yaml | 40 +- www/plugins/saisies/saisies/mot.html | 23 +- www/plugins/saisies/saisies/mot.yaml | 131 ++ www/plugins/saisies/saisies/oui_non.html | 8 +- www/plugins/saisies/saisies/oui_non.yaml | 14 + www/plugins/saisies/saisies/pays.html | 2 +- www/plugins/saisies/saisies/police.html | 2 +- .../position_construire_formulaire.html | 2 +- www/plugins/saisies/saisies/radio.html | 4 +- www/plugins/saisies/saisies/radio.yaml | 14 + www/plugins/saisies/saisies/secteur.html | 2 +- .../saisies/saisies/selecteur_article.yaml | 14 + .../saisies/saisies/selecteur_document.html | 2 +- .../saisies/saisies/selecteur_langue.html | 2 +- .../saisies/saisies/selecteur_rubrique.yaml | 14 + .../saisies/selecteur_rubrique_article.yaml | 14 + .../saisies/saisies/selecteur_site.html | 2 +- www/plugins/saisies/saisies/selection.html | 2 +- www/plugins/saisies/saisies/selection.yaml | 16 +- .../saisies/saisies/selection_multiple.html | 2 +- .../saisies/saisies/selection_multiple.yaml | 14 + .../saisies/saisies/selection_par_groupe.html | 2 +- .../saisies/saisies/statuts_auteurs.html | 2 +- www/plugins/saisies/saisies/textarea.html | 2 +- www/plugins/saisies/saisies/textarea.yaml | 14 + www/plugins/saisies/saisies/true_false.html | 8 +- www/plugins/saisies/saisies_pipelines.php | 19 +- www/plugins/saisies/svn.revision | 8 +- 142 files changed, 5104 insertions(+), 1057 deletions(-) create mode 100644 www/plugins/facteur/facteur_pipelines.php create mode 100644 www/plugins/facteur/lang/facteur_fa.php create mode 100644 www/plugins/facteur/lang/facteur_fr_tu.php create mode 100644 www/plugins/facteur/lang/facteur_nl.php create mode 100755 www/plugins/facteur/lang/paquet-facteur_de.php create mode 100644 www/plugins/facteur/lang/paquet-facteur_fr_tu.php create mode 100644 www/plugins/facteur/lang/paquet-facteur_nl.php create mode 100644 www/plugins/facteur/lang/paquet-facteur_ru.php create mode 100644 www/plugins/facteur/lib/markdownify/LICENSE_LGPL.txt create mode 100644 www/plugins/facteur/lib/markdownify/markdownify.php create mode 100644 www/plugins/facteur/lib/markdownify/markdownify_extra.php create mode 100644 www/plugins/facteur/lib/markdownify/parsehtml/parsehtml.php create mode 100644 www/plugins/formidable_1_0/action/vider_formulaire.php create mode 100644 www/plugins/formidable_1_0/images/formulaire-reponses-supprimer-24.png create mode 100644 www/plugins/formidable_1_0/lang/paquet-formidable.xml create mode 100644 www/plugins/saisies/lang/paquet-saisies_ar.php create mode 100644 www/plugins/saisies/lang/paquet-saisies_fr_tu.php create mode 100644 www/plugins/saisies/lang/paquet-saisies_nl.php create mode 100644 www/plugins/saisies/lang/saisies_nl.php create mode 100644 www/plugins/saisies/saisies-vues/mot.html create mode 100644 www/plugins/saisies/saisies/mot.yaml diff --git a/www/plugins/facteur/classes/facteur.php b/www/plugins/facteur/classes/facteur.php index ca3edab2..daedf1e2 100755 --- a/www/plugins/facteur/classes/facteur.php +++ b/www/plugins/facteur/classes/facteur.php @@ -89,13 +89,15 @@ class Facteur extends PHPMailer { $this->AddCustomHeader("Errors-To: ".$this->Sender); } - if (!empty($options['cc'])) { - $this->AddCC( $options['cc'] ); - } - if (!empty($options['bcc'])) { - $this->AddBCC( $options['bcc'] ); + if (!defined('_TEST_EMAIL_DEST')){ + if (!empty($options['cc'])) { + $this->AddCC( $options['cc'] ); + } + if (!empty($options['bcc'])) { + $this->AddBCC( $options['bcc'] ); + } } - + if (isset($options['smtp']) AND $options['smtp'] == 'oui') { $this->Mailer = 'smtp'; $this->Host = $options['smtp_host']; @@ -141,94 +143,15 @@ class Facteur extends PHPMailer { } /* - * Transforme du HTML en texte brut, mais proprement, c'est-à-dire en essayant - * de garder les titrages, les listes, etc + * Transforme du HTML en texte brut, mais proprement + * utilise le filtre facteur_mail_html2text + * @uses facteur_mail_html2text() * * @param string $html Le HTML à transformer * @return string Retourne un texte brut formaté correctement */ function html2text($html){ - // On remplace tous les sauts de lignes par un espace - $html = str_replace("\n", ' ', $html); - - // Supprimer tous les liens internes - $texte = preg_replace("/\]*>(.*?)<\/a>/ims", "\\2", $html); - - // Supprime feuille style - $texte = preg_replace(";]*>[^<]*;i", "", $texte); - - // Remplace tous les liens - $texte = preg_replace("/\]*href=['\"](.*?)['\"][^>]*>(.*?)<\/a>/ims", "\\2 (\\1)", $texte); - - // Les titres - $texte = preg_replace(";]*>;i", "\n= ", $texte); - $texte = str_replace("", " =\n\n", $texte); - $texte = preg_replace(";]*>;i", "\n== ", $texte); - $texte = str_replace("", " ==\n\n", $texte); - $texte = preg_replace(";]*>;i", "\n=== ", $texte); - $texte = str_replace("", " ===\n\n", $texte); - - // Une fin de liste - $texte = preg_replace(";;i", "\n\n", $texte); - - // Une saut de ligne *après* le paragraphe - $texte = preg_replace(";]*>;i", "\n", $texte); - $texte = preg_replace(";

;i", "\n\n", $texte); - // Les sauts de ligne interne - $texte = preg_replace(";]*>;i", "\n", $texte); - - //$texte = str_replace('
\'-\'', "\n".'-', $texte); - $texte = preg_replace (';]*>;i', "\n".'- ', $texte); - - - // accentuation du gras - // texte -> **texte** - $texte = preg_replace (';]*>;i','**' ,$texte); - $texte = str_replace ('','**' ,$texte); - - // accentuation du gras - // texte -> **texte** - $texte = preg_replace (';]*>;i','**' ,$texte); - $texte = str_replace ('','**' ,$texte); - - - // accentuation de l'italique - // texte -> *texte* - $texte = preg_replace (';]*>;i','/' ,$texte); - $texte = str_replace ('','*' ,$texte); - - // accentuation de l'italique - // texte -> *texte* - $texte = preg_replace (';]*>;i','/' ,$texte); - $texte = str_replace ('','*' ,$texte); - - $texte = str_replace('œ', 'oe', $texte); - $texte = str_replace(" ", " ", $texte); - $texte = filtrer_entites($texte); - - // On supprime toutes les balises restantes - $texte = supprimer_tags($texte); - - $texte = str_replace("\x0B", "", $texte); - $texte = str_replace("\t", "", $texte) ; - $texte = preg_replace(";[ ]{3,};", "", $texte); - - // espace en debut de ligne - $texte = preg_replace("/(\r\n|\n|\r)[ ]+/", "\n", $texte); - - //marche po - // Bring down number of empty lines to 4 max - $texte = preg_replace("/(\r\n|\n|\r){3,}/m", "\n\n", $texte); - - //saut de lignes en debut de texte - $texte = preg_replace("/^(\r\n|\n|\r)*/", "\n\n", $texte); - //saut de lignes en debut ou fin de texte - $texte = preg_replace("/(\r\n|\n|\r)*$/", "\n\n", $texte); - - // Faire des lignes de 75 caracteres maximum - //$texte = wordwrap($texte); - - return $texte; + return facteur_mail_html2text($html); } /** diff --git a/www/plugins/facteur/emails/texte.html b/www/plugins/facteur/emails/texte.html index cb7fccf4..e8ed065b 100644 --- a/www/plugins/facteur/emails/texte.html +++ b/www/plugins/facteur/emails/texte.html @@ -89,7 +89,7 @@ style="color:#A39F9A !important;font-family: Verdana, Geneva, sans-serif; !important;font-size:90% !important;font-weight:normal !important;font-style:normal !important;text-decoration:none !important;vertical-align:top !important;text-align:left !important;">

- — Envoyé par
#NOM_SITE_SPIP + — #SET{site,#NOM_SITE_SPIP}<:facteur:email_envoye_par{site=#GET{site}}:>
diff --git a/www/plugins/facteur/facteur_fonctions.php b/www/plugins/facteur/facteur_fonctions.php index 3abf19a9..9c09ca43 100755 --- a/www/plugins/facteur/facteur_fonctions.php +++ b/www/plugins/facteur/facteur_fonctions.php @@ -286,4 +286,102 @@ function facteur_nl2br_si_pas_autobr($texte){ return (_AUTOBR?$texte:nl2br($texte)); } +/** + * Transformer un mail HTML en mail Texte proprement : + * - les tableaux de mise en page sont utilisés pour structurer le mail texte + * - le reste du HTML est markdownifie car c'est un format texte lisible et conventionnel + * + * @param string $html + * @return string + */ +function facteur_mail_html2text($html){ + // nettoyer les balises de mise en page html + $html = preg_replace(",,Uims","
",$html); + $html = preg_replace(",,Uims","@@@hr@@@",$html); + $html = preg_replace(",]*>,Uims","\n\n",$html); + + // commentaires html et conditionnels + $html = preg_replace(",,Uims","\n",$html); + $html = preg_replace(",,Uims","\n",$html); + + $html = preg_replace(",<(/?)(div|tr|caption)([^>]*>),Uims","<\\1p>",$html); + $html = preg_replace(",(

\s*)+,ims","

",$html); + $html = preg_replace(",
\s*

,ims","

",$html); + $html = preg_replace(",

\s*
,ims","

",$html); + $html = preg_replace(",(

\s*(@@@hr@@@)?\s*)+,ims","

\\2",$html); + $html = preg_replace(",(

\s*

),ims","",$html); + + // succession @@@hr@@@
et
@@@hr@@@ + $html = preg_replace(",@@@hr@@@\s*(<[^>]*>\s*)?]*>,ims","@@@hr@@@\n",$html); + $html = preg_replace(",]*>\s*(<[^>]*>\s*)?@@@hr@@@,ims","\n@@@hr@@@",$html); + + $html = preg_replace(",]*spip_cadre[^>]*>(.*),Uims","\n\\1\n",$html); + + // vider le contenu de qqunes : + $html = preg_replace(",]*>.*,Uims","\n",$html); + + // Liens : + // Nettoyage des liens des notes de bas de page + $html = preg_replace("@([0-9]+)@", "\\3", $html); + // Supprimer tous les liens internes + $html = preg_replace("/\]*>(.*?)<\/a>/ims","\\2", $html); + // Remplace tous les liens + preg_match_all("/\]*>(.*?)<\/a>/ims", $html,$matches,PREG_SET_ORDER); + $prelinks = $postlinks = array(); + foreach ($matches as $k => $match){ + $link = "@@@link$k@@@"; + $url = str_replace("&","&",$match[1]); + if ($match[2]==$match[1] OR $match[2]==$url){ + // si le texte est l'url : + $prelinks[$match[0]] = "$link"; + } + else { + // texte + url + $prelinks[$match[0]] = $match[2] . " ($link)"; + } + $postlinks[$link] = $url; + } + $html = str_replace(array_keys($prelinks), array_values($prelinks),$html); + + // les images par leur alt ? + // au moins les puces + $html = preg_replace(',]*alt="-"[^>]*>,Uims','-',$html); + // les autres + $html = preg_replace(',]*alt=[\'"]([^\'"]*)[\'"][^>]*>,Uims',"\\1",$html); + // on vire celles sans alt + $html = preg_replace(",]*>,Uims","\n",$html); + + // espaces + $html = str_replace(" "," ",$html); + $html = preg_replace(",

\s+,ims","

",$html); + + #return $html; + include_spip("lib/markdownify/markdownify"); + $parser = new Markdownify('inline',false,false); + $texte = $parser->parseString($html); + + $texte = str_replace(array_keys($postlinks), array_values($postlinks),$texte); + + + // trim et sauts de ligne en trop ou pas assez + $texte = trim($texte); + $texte = str_replace("
\n","\n",$texte); + $texte = preg_replace(",(@@@hr@@@\s*)+\Z,ims","",$texte); + $texte = preg_replace(",(@@@hr@@@\s*\n)+,ims","\n\n\n".str_pad("-",75,"-")."\n\n\n",$texte); + $texte = preg_replace(",(\n#+\s),ims","\n\n\\1",$texte); + $texte = preg_replace(",(\n\s*)(\n\s*)+(\n)+,ims","\n\n\n",$texte); + + + //

et

restants + $texte = str_replace(array("

","

"),array("",""),$texte); + + // entites restantes ? (dans du code...) + include_spip('inc/charsets'); + $texte = unicode2charset($texte); + $texte = str_replace(array(''', '"'),array("'",'"'), $texte); + + + // Faire des lignes de 75 caracteres maximum + return trim(wordwrap($texte)); +} ?> diff --git a/www/plugins/facteur/facteur_pipelines.php b/www/plugins/facteur/facteur_pipelines.php new file mode 100644 index 00000000..2bdbdce4 --- /dev/null +++ b/www/plugins/facteur/facteur_pipelines.php @@ -0,0 +1,33 @@ + 0)){ + $ajout = '

'._T('facteur:message_identite_email').'

'; + $flux['data'] = preg_replace(",(
  • ]*class=[\"']editer editer_email_webmaster.*>)(.* \ No newline at end of file diff --git a/www/plugins/facteur/inc/envoyer_mail.php b/www/plugins/facteur/inc/envoyer_mail.php index ef29058b..261c7c15 100644 --- a/www/plugins/facteur/inc/envoyer_mail.php +++ b/www/plugins/facteur/inc/envoyer_mail.php @@ -63,7 +63,39 @@ function inc_envoyer_mail($destinataire, $sujet, $corps, $from = "", $headers = $message_html = $corps; } else { - $message_texte = nettoyer_caracteres_mail($corps); + // Autodetection : tester si le mail est en HTML + if (strpos($headers,"Content-Type:")===false + AND strpos($corps,"<")!==false // eviter les tests suivants si possible + AND $ttrim = trim($corps) + AND substr($ttrim,0,1)=="<" + AND substr($ttrim,-1,1)==">" + AND stripos($ttrim,"")!==false){ + + if(!strlen($sujet)){ + // dans ce cas on ruse un peu : extraire le sujet du title + if (preg_match(",(.*),Uims",$corps,$m)) + $sujet = $m[1]; + else { + // fallback, on prend le body si on le trouve + if (preg_match(",]*>(.*),Uims",$corps,$m)) + $ttrim = $m[1]; + + // et on extrait la premiere ligne de vrai texte... + // nettoyer le html et les retours chariots + $ttrim = textebrut($ttrim); + $ttrim = str_replace("\r\n", "\r", $ttrim); + $ttrim = str_replace("\r", "\n", $ttrim); + // decouper + $ttrim = explode("\n",trim($ttrim)); + // extraire la premiere ligne de texte brut + $sujet = array_shift($ttrim); + } + } + $message_html = $corps; + } + // c'est vraiment un message texte + else + $message_texte = nettoyer_caracteres_mail($corps); } $headers = array_map('trim',explode("\n",$headers)); } @@ -74,6 +106,10 @@ function inc_envoyer_mail($destinataire, $sujet, $corps, $from = "", $headers = if ($message_texte AND ! $message_html){ $message_html = recuperer_fond("emails/texte",array('texte'=>$message_texte,'sujet'=>$sujet)); } + // si le mail est en HTML sans alternative, la generer + if ($message_html AND !$message_texte){ + $message_texte = facteur_mail_html2text($message_html); + } // mode TEST : forcer l'email if (defined('_TEST_EMAIL_DEST')) { diff --git a/www/plugins/facteur/lang/facteur.xml b/www/plugins/facteur/lang/facteur.xml index dd30a596..ceab0c38 100644 --- a/www/plugins/facteur/lang/facteur.xml +++ b/www/plugins/facteur/lang/facteur.xml @@ -1,13 +1,31 @@ - - + + + + + + + + + - - + + + + + + + + + + + + + + - - + diff --git a/www/plugins/facteur/lang/facteur_de.php b/www/plugins/facteur/lang/facteur_de.php index 47bd0558..21158e74 100644 --- a/www/plugins/facteur/lang/facteur_de.php +++ b/www/plugins/facteur/lang/facteur_de.php @@ -7,12 +7,9 @@ if (!defined('_ECRIRE_INC_VERSION')) return; $GLOBALS[$GLOBALS['idx_lang']] = array( - // Z - 'Z' => 'ZZzZZzzz', - // C - 'config_info_enregistree' => 'Die Konfiguration des Briedträgers wurde gespeichert', - 'configuration_adresse_envoi' => 'Absendeadresse einstellen', + 'config_info_enregistree' => 'Die Konfiguration des Briefträgers wurde gespeichert.', + 'configuration_adresse_envoi' => 'Absenderadresse einstellen', 'configuration_facteur' => 'Briefträger', 'configuration_mailer' => 'Konfiguration des Mailers', 'configuration_smtp' => 'Auswahl der Versandmethode', @@ -20,27 +17,27 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'corps_email_de_test' => 'Das ist ein Versandtest mit Sondärzeichen: Bär Größe Maß accentué', // E - 'email_test_envoye' => 'Die Testmail wurde fehlerfrei versand. Falls sie nicht richtig ankommt, - bearbeiten sie ihre Serverkonfiguration oder kontaktieren sie den Administrator.', + 'email_envoye_par' => 'Absender @site@', + 'email_test_envoye' => 'Die Testmail wurde fehlerfrei verschickt. Falls sie nicht richtig ankommt, bearbeiten sie ihre Serverkonfiguration oder kontaktieren sie den Administrator.', 'erreur' => 'Fehler', - 'erreur_dans_log' => ' : consultez le fichier log pour plus de détails', # NEW - 'erreur_generale' => 'Mehrere Konfigurationsfehler. Bitte Inhalt des Formulars korrigieren.', - 'erreur_invalid_host' => 'Servername inkorrekt', - 'erreur_invalid_port' => 'Portnummer inkorrekt', + 'erreur_dans_log' => ' : mehr Details in der Logdatei', + 'erreur_generale' => 'Konfigurationsfehler. Bitte Inhalt des Formulars korrigieren.', + 'erreur_invalid_host' => 'falscher Servername', + 'erreur_invalid_port' => 'falsche Portnummer', // F 'facteur_adresse_envoi_email' => 'E-Mail :', 'facteur_adresse_envoi_nom' => 'Name:', - 'facteur_bcc' => 'Copie Cachée (BCC) :', # NEW - 'facteur_cc' => 'Copie (CC) :', # NEW - 'facteur_copies' => 'Copies :', # NEW - 'facteur_copies_descriptif' => 'Un email sera envoyé en copie aux adresses définies. Une seule adresse en copie et/ou une seule adresse en copie cachée.', # NEW + 'facteur_bcc' => 'Blindkopie (BCC) :', + 'facteur_cc' => 'Kopie (CC) :', + 'facteur_copies' => 'Kopien:', + 'facteur_copies_descriptif' => 'Eine Kopie der E-Mails wird an die angegebenen Adressen geschickt. Geben sie eine Adresse als Empfänger der Kopie bzw. Blindkopie an.', 'facteur_filtre_accents' => 'Sonderzeichen in HTML-Entitäten umwandeln (z.B. für Hotmail).', - 'facteur_filtre_css' => 'Stile zwischen und zu "inline" Stilen umwandeln, sinnvoll für Webmail die interne Stile externen vorzieht.', + 'facteur_filtre_css' => 'Stile zwischen und zu "inline" Stilen umwandeln, sinnvoll für Webmail die inline-Stile externen vorzieht.', 'facteur_filtre_images' => 'Verlinkte Bilder in E-Mail einbetten', 'facteur_filtre_iso_8859' => 'Nach ISO-8859-1 umwandeln', 'facteur_filtres' => 'Filter', - 'facteur_filtres_descriptif' => 'Beim Versand können mehrere Filter eingesetzt werden.', + 'facteur_filtres_descriptif' => 'Beim Versand können die Mails durch mehrere Filter behandelt werden.', 'facteur_smtp_auth' => 'Autorisierung erforderlich:', 'facteur_smtp_auth_non' => 'nein', 'facteur_smtp_auth_oui' => 'ja', @@ -55,6 +52,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'facteur_smtp_sender_descriptif' => 'Legt im Kopf der Mail die Empfängeradresse für Fehlermeldungen fest (bzw. den Return-Path), bestimmt ebenfalls die Absenderadresse bei Versand per SMTP.', 'facteur_smtp_username' => 'Benutzername:', + // M + 'message_identite_email' => 'Die Konfiguration des Plugins Briefträger (facteur) überschreibt diese Adresse für den Mailversand.', + // N 'note_test_configuration' => 'Eine Mail wird an die Absendeadresse geschickt (oder an den Webmaster).', diff --git a/www/plugins/facteur/lang/facteur_en.php b/www/plugins/facteur/lang/facteur_en.php index 2358b1fc..3c9c75a1 100755 --- a/www/plugins/facteur/lang/facteur_en.php +++ b/www/plugins/facteur/lang/facteur_en.php @@ -7,19 +7,17 @@ if (!defined('_ECRIRE_INC_VERSION')) return; $GLOBALS[$GLOBALS['idx_lang']] = array( - // Z - 'Z' => 'ZZzZZzzz', - // C - 'config_info_enregistree' => 'Postman\'s configuration is now saved', - 'configuration_adresse_envoi' => 'Sender\'s address configuration', + 'config_info_enregistree' => 'Postman’s configuration is now saved', + 'configuration_adresse_envoi' => 'Sender’s address configuration', 'configuration_facteur' => 'Postman', - 'configuration_mailer' => 'Mailer\'s configuration', + 'configuration_mailer' => 'Mailer’s configuration', 'configuration_smtp' => 'Choose your mailer', - 'configuration_smtp_descriptif' => 'If you\'re not sure about the settings, leave them set to "PHP mail".', + 'configuration_smtp_descriptif' => 'If you’re not sure about the settings, leave them set to "PHP mail".', 'corps_email_de_test' => 'This is a test email', // E + 'email_envoye_par' => 'Sent by @site@', 'email_test_envoye' => 'The test email was successfully sent. If you do not receive it correctly, check the configuration of your server or contact a server administrator.', 'erreur' => 'Error', 'erreur_dans_log' => ': check the log file for more details', @@ -51,9 +49,12 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'facteur_smtp_secure_ssl' => 'SSL', 'facteur_smtp_secure_tls' => 'TLS', 'facteur_smtp_sender' => 'Return-Path (optional)', - 'facteur_smtp_sender_descriptif' => 'Define the Return-Path in the mail header, useful for error feedback, also in SMTP mode it defines the sender\'s email.', + 'facteur_smtp_sender_descriptif' => 'Define the Return-Path in the mail header, useful for error feedback, also in SMTP mode it defines the sender’s email.', 'facteur_smtp_username' => 'Username:', + // M + 'message_identite_email' => 'The configuration of the plugin "factor" preset this email address for sending emails.', + // N 'note_test_configuration' => 'A test email will be sent to the "sender".', @@ -66,7 +67,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( // U 'utiliser_mail' => 'Use mail function from PHP', - 'utiliser_reglages_site' => 'Use the site\'s settings: the email address is the webmaster\'s one and the name of the website is the name of the sender', + 'utiliser_reglages_site' => 'Use the site’s settings: the email address is the webmaster’s one and the name of the website is the name of the sender', 'utiliser_smtp' => 'Use SMTP', // V diff --git a/www/plugins/facteur/lang/facteur_es.php b/www/plugins/facteur/lang/facteur_es.php index 4f7f936e..3cef7c9f 100644 --- a/www/plugins/facteur/lang/facteur_es.php +++ b/www/plugins/facteur/lang/facteur_es.php @@ -7,22 +7,20 @@ if (!defined('_ECRIRE_INC_VERSION')) return; $GLOBALS[$GLOBALS['idx_lang']] = array( - // Z - 'Z' => 'ZZzZZzzz', - // C - 'config_info_enregistree' => 'La configuración del factor se ha registrado correctamente', + 'config_info_enregistree' => 'La configuración del cartero fue guardada correctamente', 'configuration_adresse_envoi' => 'Configuración de la dirección de envío', - 'configuration_facteur' => 'Factor', + 'configuration_facteur' => 'Cartero', 'configuration_mailer' => 'Configuración del "mailer"', 'configuration_smtp' => 'Elección del método de envío del correo electrónico', - 'configuration_smtp_descriptif' => 'Si no está seguro, elija la función de correo electrónico de PHP.', + 'configuration_smtp_descriptif' => 'Si no estás seguro, elige la función de correo electrónico de PHP.', 'corps_email_de_test' => 'Éste es un mensaje de prueba acentuado', // E - 'email_test_envoye' => 'El correo electrónico de prueba se ha enviado correctamente. Si lo recibe, verifique la configuración de su servidor o contacte con un administrador del servicio. ', + 'email_envoye_par' => 'Enviado por @site@', + 'email_test_envoye' => 'El correo electrónico de prueba se ha enviado correctamente. Si no lo recibes, verifica la configuración de tu servidor o contacta a un administrador del servicio. ', 'erreur' => 'Error', - 'erreur_dans_log' => ': consulte el archivo de registro para obtener más detalles', + 'erreur_dans_log' => ': consulta el archivo de registro (log) para más detalles', 'erreur_generale' => 'Hay uno o más errores de configuración. Por favor, compruebe el contenido del formulario. ', 'erreur_invalid_host' => 'Este nombre de host es incorrecto', 'erreur_invalid_port' => 'Este número de puerto es incorrecto', @@ -39,8 +37,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'facteur_filtre_images' => 'Incorporar las imágenes de referencia en los correos electrónicos', 'facteur_filtre_iso_8859' => 'Convertir en ISO-8859-1', 'facteur_filtres' => 'Filtros', - 'facteur_filtres_descriptif' => 'Los filtros pueden aplicarse en los correos electrónicos en el momento del envío.', - 'facteur_smtp_auth' => 'Requiere autentificación:', + 'facteur_filtres_descriptif' => 'Filtros pueden aplicarse a los correos electrónicos al ser enviados.', + 'facteur_smtp_auth' => 'Requiere autenticación:', 'facteur_smtp_auth_non' => 'no', 'facteur_smtp_auth_oui' => 'sí', 'facteur_smtp_host' => 'Host:', @@ -54,6 +52,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'facteur_smtp_sender_descriptif' => 'Indica en el encabezado del correo electrónico la dirección de correo electrónico de rebote de errores (o "Return-Path"), y en caso de un envío a través del método SMTP indica, también, la dirección del remitente.', 'facteur_smtp_username' => 'Nombre de usuario:', + // M + 'message_identite_email' => 'La configuración del plugin "cartero" sobrecarga esta dirección de correo para el envío de correos.', + // N 'note_test_configuration' => 'Un correo electrónico se enviará a la dirección de envío definida (o aquélla del webmaster).', @@ -61,7 +62,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'personnaliser' => 'Personalizar esta configuración', // T - 'tester' => 'Testar', + 'tester' => 'Probar', 'tester_la_configuration' => 'Testar la configuración', // U diff --git a/www/plugins/facteur/lang/facteur_fa.php b/www/plugins/facteur/lang/facteur_fa.php new file mode 100644 index 00000000..45866b6c --- /dev/null +++ b/www/plugins/facteur/lang/facteur_fa.php @@ -0,0 +1,79 @@ + 'پيكربندي پستجي ثبت شده است.', + 'configuration_adresse_envoi' => 'پيكربندي نشاني نامه ', + 'configuration_facteur' => 'پستچي', + 'configuration_mailer' => 'پيكربندي نامه‌ رسان', + 'configuration_smtp' => 'انتخاب روش ارسال نامه', + 'configuration_smtp_descriptif' => 'اگر در مورد تنظيمات مطمئن نيستيد، بگذاريد «پي.اچ.پي ميل» تنظيم كند. ', + 'corps_email_de_test' => 'اين يك ايميل آزمايشي است.', + + // E + 'email_envoye_par' => 'ارسال شده توسط @site@', + 'email_test_envoye' => 'ايميل آزمايشي با موفقيت ارسال شد. اگر آن را درست دريافت نكرده‌ايد، پيكربندي سرور خود را تعديل كنيد، يا با ادمين سرور تماس بگيريد. ', + 'erreur' => 'خطا', + 'erreur_dans_log' => 'براي جزئيات بيشتر فايل لاگ را چك كنيد:', + 'erreur_generale' => 'يك يا چند خطار در پيكربندي وجود دارد. لطفاض محتويات فرم را چك كنيد.', + 'erreur_invalid_host' => 'نام اين هاست معتبر نيست', + 'erreur_invalid_port' => 'شماره اين پورت درست نيست.', + + // F + 'facteur_adresse_envoi_email' => 'ايميل: ', + 'facteur_adresse_envoi_nom' => 'نام:‌', + 'facteur_bcc' => 'كپي مخفي (بي.سي.سي): ', + 'facteur_cc' => 'كپي غيرمخفي (سي.سي): ', + 'facteur_copies' => 'كپي‌ها:‌', + 'facteur_copies_descriptif' => 'يك ايميل به نشاني مشخص شده ارسال خواهد شد. يك كپي غير مخفي و/يا يك كپي مخفي.', + 'facteur_filtre_accents' => 'تبديل اكسان‌ها به اچ.تي.ام.ال (براي هاتميل مفيد است)', + 'facteur_filtre_css' => 'تبديل استايل‌هاي مطالب بين و به استايل‌هاي درخط، مفيد براي وب‌ميل‌ها، زيرا استايل‌هاي درخط بر استايل‌هاي بيروني اولويت مي‌يابند.', + 'facteur_filtre_images' => 'گنجاندن تصويرهاي ارسالي در داخل ايميل‌ها', + 'facteur_filtre_iso_8859' => 'تبديل به ISO-8859-1', + 'facteur_filtres' => 'فيلترها', + 'facteur_filtres_descriptif' => 'فيلتر‌ها مي‌توانند پيش از ارسال ايميل‌ها مورد استفاده قرار بگيرند. ', + 'facteur_smtp_auth' => 'مستلزم تأييد است: ', + 'facteur_smtp_auth_non' => 'نه', + 'facteur_smtp_auth_oui' => 'بله', + 'facteur_smtp_host' => 'هاست: ', + 'facteur_smtp_password' => 'گذر واژه:', + 'facteur_smtp_port' => 'پورت:‌', + 'facteur_smtp_secure' => 'ارتباط امن:‌', + 'facteur_smtp_secure_non' => 'نه', + 'facteur_smtp_secure_ssl' => 'اس.اس.ال', + 'facteur_smtp_secure_tls' => 'تي.ال.اس', + 'facteur_smtp_sender' => 'برگشت خطاها (دلبخواه)', + 'facteur_smtp_sender_descriptif' => 'تعيين مسير برگشت در بالاي ايميل مفيد براي خطاي فيدبك، همچنين در حالت اس.ام.تي.پي (پروتكل انتقال ساده نامه) فرستنده نامه را مشخص مي‌كمند. ', + 'facteur_smtp_username' => 'نام كاربر:‌', + + // M + 'message_identite_email' => 'پيكربندي پلاگين «پستچي» نشاني اين ايميل را براي ارسال ايميل‌ها تنظيم مي‌كند', + + // N + 'note_test_configuration' => 'يك ايميل به نشاني مرسوله تعيين شده (يا به نشاني وب مستر) ارسال خواهد شد', + + // P + 'personnaliser' => 'شخصي سازي اين تنظيمات ', + + // T + 'tester' => 'آزمايش كردن', + 'tester_la_configuration' => 'آزمايش پيكربندي ', + + // U + 'utiliser_mail' => 'ار كاركرد نامه پي.اچ.پي استفاده كنيد', + 'utiliser_reglages_site' => 'استفاده از تنظيمات سايت اسپيپ: نام وب سايت نام فرستنده خواهد بود و نشاني ايميل نشاني ايميل وب مستر خواهد بود. ', + 'utiliser_smtp' => 'از اس.ام.تي.پي (پروتكل ارسال ساده نامه)‌ اسفتاده كنيد', + + // V + 'valider' => 'معتبر كردن', + 'version_html' => 'نسخه اچ.تي.ام.ال', + 'version_texte' => 'نسخه متني.' +); + +?> diff --git a/www/plugins/facteur/lang/facteur_fr.php b/www/plugins/facteur/lang/facteur_fr.php index c085653f..5610ec6e 100755 --- a/www/plugins/facteur/lang/facteur_fr.php +++ b/www/plugins/facteur/lang/facteur_fr.php @@ -5,55 +5,56 @@ if (!defined('_ECRIRE_INC_VERSION')) return; $GLOBALS[$GLOBALS['idx_lang']] = array( - // Z - 'Z' => 'ZZzZZzzz', - // C 'config_info_enregistree' => 'La configuration du facteur a bien été enregistrée', - 'configuration_adresse_envoi' => 'Configuration de l\'adresse d\'envoi', + 'configuration_adresse_envoi' => 'Configuration de l’adresse d’envoi', 'configuration_facteur' => 'Facteur', 'configuration_mailer' => 'Configuration du mailer', - 'configuration_smtp' => 'Choix de la méthode d\'envoi de mail', - 'configuration_smtp_descriptif' => 'Si vous n\'êtes pas sûrs, choisissez la fonction mail de PHP.', + 'configuration_smtp' => 'Choix de la méthode d’envoi de mail', + 'configuration_smtp_descriptif' => 'Si vous n’êtes pas sûrs, choisissez la fonction mail de PHP.', 'corps_email_de_test' => 'Ceci est un email de test accentué', // E - 'email_test_envoye' => 'L\'email de test a correctement été envoyé. Si vous ne le recevez pas correctement, vérifiez la configuration de votre serveur ou contactez un administrateur du serveur.', + 'email_envoye_par' => 'Envoyé par @site@', + 'email_test_envoye' => 'L’email de test a correctement été envoyé. Si vous ne le recevez pas correctement, vérifiez la configuration de votre serveur ou contactez un administrateur du serveur.', 'erreur' => 'Erreur', - 'erreur_dans_log' => ' : consultez le fichier log pour plus de détails', + 'erreur_dans_log' => ' : consultez le fichier log pour plus de détails', 'erreur_generale' => 'Il y a une ou plusieurs erreurs de configuration. Veuillez vérifier le contenu du formulaire.', - 'erreur_invalid_host' => 'Ce nom d\'hôte n\'est pas correct', - 'erreur_invalid_port' => 'Ce numéro de port n\'est pas correct', + 'erreur_invalid_host' => 'Ce nom d’hôte n’est pas correct', + 'erreur_invalid_port' => 'Ce numéro de port n’est pas correct', // F - 'facteur_adresse_envoi_email' => 'Email :', - 'facteur_adresse_envoi_nom' => 'Nom :', - 'facteur_bcc' => 'Copie Cachée (BCC) :', - 'facteur_cc' => 'Copie (CC) :', - 'facteur_copies' => 'Copies :', + 'facteur_adresse_envoi_email' => 'Email :', + 'facteur_adresse_envoi_nom' => 'Nom :', + 'facteur_bcc' => 'Copie Cachée (BCC) :', + 'facteur_cc' => 'Copie (CC) :', + 'facteur_copies' => 'Copies :', 'facteur_copies_descriptif' => 'Un email sera envoyé en copie aux adresses définies. Une seule adresse en copie et/ou une seule adresse en copie cachée.', 'facteur_filtre_accents' => 'Transformer les accents en leur entités html (utile pour Hotmail notamment).', 'facteur_filtre_css' => 'Transformer les styles contenus entre et en des styles "en ligne", utile pour les webmails car les styles en ligne ont la priorité sur les styles externes.', 'facteur_filtre_images' => 'Embarquer les images référencées dans les emails', 'facteur_filtre_iso_8859' => 'Convertir en ISO-8859-1', 'facteur_filtres' => 'Filtres', - 'facteur_filtres_descriptif' => 'Des filtres peuvent être appliqués aux emails au moment de l\'envoi.', - 'facteur_smtp_auth' => 'Requiert une authentification :', + 'facteur_filtres_descriptif' => 'Des filtres peuvent être appliqués aux emails au moment de l’envoi.', + 'facteur_smtp_auth' => 'Requiert une authentification :', 'facteur_smtp_auth_non' => 'non', 'facteur_smtp_auth_oui' => 'oui', - 'facteur_smtp_host' => 'Hôte :', - 'facteur_smtp_password' => 'Mot de passe :', - 'facteur_smtp_port' => 'Port :', - 'facteur_smtp_secure' => 'Connexion sécurisée :', + 'facteur_smtp_host' => 'Hôte :', + 'facteur_smtp_password' => 'Mot de passe :', + 'facteur_smtp_port' => 'Port :', + 'facteur_smtp_secure' => 'Connexion sécurisée :', 'facteur_smtp_secure_non' => 'non', 'facteur_smtp_secure_ssl' => 'SSL', 'facteur_smtp_secure_tls' => 'TLS', 'facteur_smtp_sender' => 'Retour des erreurs (optionnel)', - 'facteur_smtp_sender_descriptif' => 'Définit dans l\'entête du mail l\'adresse email de retour des erreurs (ou Return-Path), et lors d\'un envoi via la méthode SMTP cela définit aussi l\'adresse de l\'envoyeur.', - 'facteur_smtp_username' => 'Nom d\'utilisateur :', + 'facteur_smtp_sender_descriptif' => 'Définit dans l’entête du mail l’adresse email de retour des erreurs (ou Return-Path), et lors d’un envoi via la méthode SMTP cela définit aussi l’adresse de l’envoyeur.', + 'facteur_smtp_username' => 'Nom d’utilisateur :', + + // M + 'message_identite_email' => 'La configuration du plugin "facteur" surcharge cette adresse email pour l’envoi de courriels.', // N - 'note_test_configuration' => 'Un email sera envoyé à l\'adresse d\'envoi définie (ou celle du webmaster).', + 'note_test_configuration' => 'Un email sera envoyé à l’adresse d’envoi définie (ou celle du webmaster).', // P 'personnaliser' => 'Personnaliser ces réglages', @@ -64,7 +65,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( // U 'utiliser_mail' => 'Utiliser la fonction mail de PHP', - 'utiliser_reglages_site' => 'Utiliser les réglages du site SPIP : le nom affiché sera le nom du site SPIP et l\'adresse email sera celle du webmaster', + 'utiliser_reglages_site' => 'Utiliser les réglages du site SPIP : le nom affiché sera le nom du site SPIP et l’adresse email sera celle du webmaster', 'utiliser_smtp' => 'Utiliser SMTP', // V diff --git a/www/plugins/facteur/lang/facteur_fr_tu.php b/www/plugins/facteur/lang/facteur_fr_tu.php new file mode 100644 index 00000000..eae3378f --- /dev/null +++ b/www/plugins/facteur/lang/facteur_fr_tu.php @@ -0,0 +1,79 @@ + 'La configuration du facteur a bien été enregistrée', + 'configuration_adresse_envoi' => 'Configuration de l’adresse d’envoi', + 'configuration_facteur' => 'Facteur', + 'configuration_mailer' => 'Configuration du mailer', + 'configuration_smtp' => 'Choix de la méthode d’envoi de mail', + 'configuration_smtp_descriptif' => 'Si tu n’es pas sûr, choisis la fonction mail de PHP.', + 'corps_email_de_test' => 'Ceci est un email de test accentué', + + // E + 'email_envoye_par' => 'Envoyé par @site@', + 'email_test_envoye' => 'L’email de test a correctement été envoyé. Si tu ne le reçois pas correctement, vérifie la configuration de ton serveur ou contacte un administrateur du serveur.', + 'erreur' => 'Erreur', + 'erreur_dans_log' => ' : consulte le fichier log pour plus de détails', + 'erreur_generale' => 'Il y a une ou plusieurs erreurs de configuration. Vérifie le contenu du formulaire.', + 'erreur_invalid_host' => 'Ce nom d’hôte n’est pas correct', + 'erreur_invalid_port' => 'Ce numéro de port n’est pas correct', + + // F + 'facteur_adresse_envoi_email' => 'Email :', + 'facteur_adresse_envoi_nom' => 'Nom :', + 'facteur_bcc' => 'Copie Cachée (BCC) :', + 'facteur_cc' => 'Copie (CC) :', + 'facteur_copies' => 'Copies :', + 'facteur_copies_descriptif' => 'Un email sera envoyé en copie aux adresses définies. Une seule adresse en copie et/ou une seule adresse en copie cachée.', + 'facteur_filtre_accents' => 'Transformer les accents en leur entités html (utile pour Hotmail notamment).', + 'facteur_filtre_css' => 'Transformer les styles contenus entre et en des styles "en ligne", utile pour les webmails car les styles en ligne ont la priorité sur les styles externes.', + 'facteur_filtre_images' => 'Embarquer les images référencées dans les emails', + 'facteur_filtre_iso_8859' => 'Convertir en ISO-8859-1', + 'facteur_filtres' => 'Filtres', + 'facteur_filtres_descriptif' => 'Des filtres peuvent être appliqués aux emails au moment de l’envoi.', + 'facteur_smtp_auth' => 'Requiert une authentification :', + 'facteur_smtp_auth_non' => 'non', + 'facteur_smtp_auth_oui' => 'oui', + 'facteur_smtp_host' => 'Hôte :', + 'facteur_smtp_password' => 'Mot de passe :', + 'facteur_smtp_port' => 'Port :', + 'facteur_smtp_secure' => 'Connexion sécurisée :', + 'facteur_smtp_secure_non' => 'non', + 'facteur_smtp_secure_ssl' => 'SSL', + 'facteur_smtp_secure_tls' => 'TLS', + 'facteur_smtp_sender' => 'Retour des erreurs (optionnel)', + 'facteur_smtp_sender_descriptif' => 'Définit dans l’entête du mail l’adresse email de retour des erreurs (ou Return-Path), et lors d’un envoi via la méthode SMTP cela définit aussi l’adresse de l’envoyeur.', + 'facteur_smtp_username' => 'Nom d’utilisateur :', + + // M + 'message_identite_email' => 'La configuration du plugin "facteur" surcharge cette adresse email pour l’envoi de courriels.', + + // N + 'note_test_configuration' => 'Un email sera envoyé à l’adresse d’envoi définie (ou celle du webmaster).', + + // P + 'personnaliser' => 'Personnaliser ces réglages', + + // T + 'tester' => 'Tester', + 'tester_la_configuration' => 'Tester la configuration', + + // U + 'utiliser_mail' => 'Utiliser la fonction mail de PHP', + 'utiliser_reglages_site' => 'Utiliser les réglages du site SPIP : le nom affiché sera le nom du site SPIP et l’adresse email sera celle du webmaster', + 'utiliser_smtp' => 'Utiliser SMTP', + + // V + 'valider' => 'Valider', + 'version_html' => 'Version HTML.', + 'version_texte' => 'Version texte.' +); + +?> diff --git a/www/plugins/facteur/lang/facteur_nl.php b/www/plugins/facteur/lang/facteur_nl.php new file mode 100644 index 00000000..1d2c1305 --- /dev/null +++ b/www/plugins/facteur/lang/facteur_nl.php @@ -0,0 +1,79 @@ + 'De configuratie is opgeslagen', + 'configuration_adresse_envoi' => 'Configuratie van het verzendadres', + 'configuration_facteur' => 'Postbode', + 'configuration_mailer' => 'Configuratie van de mailer', + 'configuration_smtp' => 'Verzendwijze', + 'configuration_smtp_descriptif' => 'Kies, wanneer je twijfelt voor de functie PHP mail.', + 'corps_email_de_test' => 'Dit is een geaccentueerd testbericht', + + // E + 'email_envoye_par' => 'Verzonden door @site@', + 'email_test_envoye' => 'Het testbericht is verzonden. Ontvang je het niet juist, controleer dan de configuratie van de server.', + 'erreur' => 'Fout', + 'erreur_dans_log' => ': meer details in het logbestand', + 'erreur_generale' => 'Een of meerdere fouten in de configuratie. Controleer de inhoud van dit formulier.', + 'erreur_invalid_host' => 'Deze hostnaam is onjuist', + 'erreur_invalid_port' => 'Dit poortnummer is onjuist', + + // F + 'facteur_adresse_envoi_email' => 'Email:', + 'facteur_adresse_envoi_nom' => 'Naam:', + 'facteur_bcc' => 'Verborgen (BCC) :', + 'facteur_cc' => 'Kopie (CC) :', + 'facteur_copies' => 'Kopieën:', + 'facteur_copies_descriptif' => 'Deze adressen worden in kopie van de email gezet. Niet meer dan één adres in kopie en/of in verborgen kopie.', + 'facteur_filtre_accents' => 'Zet tekens met accenten om in hun html-code (met name voor Hotmail).', + 'facteur_filtre_css' => 'Zet de stijlen binnen <head> en </head> om in "inline" stijlen, wat zinvol is voor webmails.', + 'facteur_filtre_images' => 'Voeg afbeeldingen in', + 'facteur_filtre_iso_8859' => 'Omzetten in ISO-8859-1', + 'facteur_filtres' => 'Filters', + 'facteur_filtres_descriptif' => 'Bij het verzenden kunnen bepaalde filters worden toegepast.', + 'facteur_smtp_auth' => 'Vereist authentificatie:', + 'facteur_smtp_auth_non' => 'nee', + 'facteur_smtp_auth_oui' => 'ja', + 'facteur_smtp_host' => 'Host:', + 'facteur_smtp_password' => 'Wachtwoord:', + 'facteur_smtp_port' => 'Poort:', + 'facteur_smtp_secure' => 'Beveiligde verbinding:', + 'facteur_smtp_secure_non' => 'nee', + 'facteur_smtp_secure_ssl' => 'SSL', + 'facteur_smtp_secure_tls' => 'TLS', + 'facteur_smtp_sender' => 'Return-Path (optioneel)', + 'facteur_smtp_sender_descriptif' => 'Geef het Return-Path voor de mail aan, bv voor feedback. In SMTP bepaalt het het emailadres van de verzender.', + 'facteur_smtp_username' => 'Naam van de gebruiker:', + + // M + 'message_identite_email' => 'De configuratie van plugin "facteur" laadt dit e-mailadres voor het verzenden van mails.', + + // N + 'note_test_configuration' => 'Een mail wordt naar het aangegeven adres (of naar de webmaster) verzonden.', + + // P + 'personnaliser' => 'Personaliseren', + + // T + 'tester' => 'Testen', + 'tester_la_configuration' => 'Configuratietest', + + // U + 'utiliser_mail' => 'Gebruik de PHP mail functie', + 'utiliser_reglages_site' => 'Gebruik de instellingen van SPIP: de getoonde naam is die van de site en het adres dat van de webmaster', + 'utiliser_smtp' => 'Gebruik SMTP', + + // V + 'valider' => 'Bevestigen', + 'version_html' => 'HTML-versie.', + 'version_texte' => 'Tekstversie.' +); + +?> diff --git a/www/plugins/facteur/lang/facteur_sk.php b/www/plugins/facteur/lang/facteur_sk.php index b2928598..3e35b133 100644 --- a/www/plugins/facteur/lang/facteur_sk.php +++ b/www/plugins/facteur/lang/facteur_sk.php @@ -7,9 +7,6 @@ if (!defined('_ECRIRE_INC_VERSION')) return; $GLOBALS[$GLOBALS['idx_lang']] = array( - // Z - 'Z' => 'ZZzZZzzz', - // C 'config_info_enregistree' => 'Nastavenia PoÅ¡tára sa uložili správne', 'configuration_adresse_envoi' => 'Nastavenie adresy odosielateľa', @@ -20,6 +17,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'corps_email_de_test' => 'Toto je testovací e-mail s diakritikou', // E + 'email_envoye_par' => 'Odoslané z @site@', 'email_test_envoye' => 'Testovací e-mail bol úspeÅ¡ne odoslaný. Ak ho nedostanete, skontrolujte nastavenia svojho servera alebo sa obráťte na administrátora servera.', 'erreur' => 'Chyba', 'erreur_dans_log' => ' : viac podrobností nájdete v súbore log', @@ -54,6 +52,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'facteur_smtp_sender_descriptif' => 'Zadané v hlavičke návratnej e-mailovej adresy pri chybe (alebo Return-Path) a pri jej odoslaní metódou SMTP je aj adresou odosielateľa.', 'facteur_smtp_username' => 'Používateľské meno:', + // M + 'message_identite_email' => 'Nastavenia zásuvného modulu "PoÅ¡tár" predvolili túto e-mailovú adresu na posielanie e-mailov.', + // N 'note_test_configuration' => 'E-mail bude odoslaný na uvedenú adresu (alebo webmasterovi).', diff --git a/www/plugins/facteur/lang/paquet-facteur.xml b/www/plugins/facteur/lang/paquet-facteur.xml index 17c67238..0902008c 100644 --- a/www/plugins/facteur/lang/paquet-facteur.xml +++ b/www/plugins/facteur/lang/paquet-facteur.xml @@ -1,10 +1,23 @@ - - - + - - + + + + + + + + + + + + + + + + + diff --git a/www/plugins/facteur/lang/paquet-facteur_de.php b/www/plugins/facteur/lang/paquet-facteur_de.php new file mode 100755 index 00000000..1ccd0773 --- /dev/null +++ b/www/plugins/facteur/lang/paquet-facteur_de.php @@ -0,0 +1,16 @@ + 'Der Briefträger befördert Emails im HTML-Format, im Nur-Text-Format oder in beiden, egal ob per SMTP oder nicht.', + 'facteur_nom' => 'Briefräger', + 'facteur_slogan' => 'Er befördert ihre Emails' +); + +?> diff --git a/www/plugins/facteur/lang/paquet-facteur_fr.php b/www/plugins/facteur/lang/paquet-facteur_fr.php index 332b6a39..72225acd 100644 --- a/www/plugins/facteur/lang/paquet-facteur_fr.php +++ b/www/plugins/facteur/lang/paquet-facteur_fr.php @@ -6,7 +6,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return; $GLOBALS[$GLOBALS['idx_lang']] = array( // F - 'facteur_description' => 'Facteur s\'occupe de la distribution des courriels au format HTML, texte ou mixte ; via SMTP ou non', + 'facteur_description' => 'Facteur s’occupe de la distribution des courriels au format HTML, texte ou mixte ; via SMTP ou non', 'facteur_nom' => 'Facteur', 'facteur_slogan' => 'Il distribue vos courriels' ); diff --git a/www/plugins/facteur/lang/paquet-facteur_fr_tu.php b/www/plugins/facteur/lang/paquet-facteur_fr_tu.php new file mode 100644 index 00000000..5e1b76a3 --- /dev/null +++ b/www/plugins/facteur/lang/paquet-facteur_fr_tu.php @@ -0,0 +1,16 @@ + 'Facteur s’occupe de la distribution des courriels au format HTML, texte ou mixte ; via SMTP ou non', + 'facteur_nom' => 'Facteur', + 'facteur_slogan' => 'Il distribue tes courriels' +); + +?> diff --git a/www/plugins/facteur/lang/paquet-facteur_nl.php b/www/plugins/facteur/lang/paquet-facteur_nl.php new file mode 100644 index 00000000..724cb174 --- /dev/null +++ b/www/plugins/facteur/lang/paquet-facteur_nl.php @@ -0,0 +1,16 @@ + 'Postbode (Facteur) houdt zich bezig met de distributie van email in HTML, tekst of gemengd formaat; al dan niet via SMTP', + 'facteur_nom' => 'Postbode', + 'facteur_slogan' => 'Hij verzendt uw mail' +); + +?> diff --git a/www/plugins/facteur/lang/paquet-facteur_ru.php b/www/plugins/facteur/lang/paquet-facteur_ru.php new file mode 100644 index 00000000..3c675e73 --- /dev/null +++ b/www/plugins/facteur/lang/paquet-facteur_ru.php @@ -0,0 +1,16 @@ + 'Плагин отправляет письма в текстовом, HTML или смешанном формате; при помощи SMTP или функции mail', + 'facteur_nom' => 'Почтальон (Facteur)', + 'facteur_slogan' => 'Он отправляет письма' +); + +?> diff --git a/www/plugins/facteur/lib/markdownify/LICENSE_LGPL.txt b/www/plugins/facteur/lib/markdownify/LICENSE_LGPL.txt new file mode 100644 index 00000000..5ab7695a --- /dev/null +++ b/www/plugins/facteur/lib/markdownify/LICENSE_LGPL.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 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. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes 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 + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest 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. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/www/plugins/facteur/lib/markdownify/markdownify.php b/www/plugins/facteur/lib/markdownify/markdownify.php new file mode 100644 index 00000000..6dd29f80 --- /dev/null +++ b/www/plugins/facteur/lib/markdownify/markdownify.php @@ -0,0 +1,1192 @@ +, ) + * @license LGPL, see LICENSE_LGPL.txt and the summary below + * @copyright (C) 2007 Milian Wolff + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * HTML Parser, see http://sf.net/projects/parseHTML + */ +require_once dirname(__FILE__) . '/parsehtml/parsehtml.php'; + +/** + * default configuration + */ +define('MDFY_LINKS_EACH_PARAGRAPH', false); +define('MDFY_BODYWIDTH', false); +define('MDFY_KEEPHTML', true); + +/** + * HTML to Markdown converter class + */ +class Markdownify { + /** + * html parser object + * + * @var parseHTML + */ + var $parser; + /** + * markdown output + * + * @var string + */ + var $output; + /** + * stack with tags which where not converted to html + * + * @var array + */ + var $notConverted = array(); + /** + * skip conversion to markdown + * + * @var bool + */ + var $skipConversion = false; + /* options */ + /** + * keep html tags which cannot be converted to markdown + * + * @var bool + */ + var $keepHTML = false; + /** + * wrap output, set to 0 to skip wrapping + * + * @var int + */ + var $bodyWidth = 0; + /** + * minimum body width + * + * @var int + */ + var $minBodyWidth = 25; + /** + * display links after each paragraph + * + * @var bool + */ + var $linksAfterEachParagraph = false; + /** + * constructor, set options, setup parser + * + * @param bool $linksAfterEachParagraph wether or not to flush stacked links after each paragraph + * defaults to false + * @param int $bodyWidth wether or not to wrap the output to the given width + * defaults to false + * @param bool $keepHTML wether to keep non markdownable HTML or to discard it + * defaults to true (HTML will be kept) + * @return void + */ + function Markdownify($linksAfterEachParagraph = MDFY_LINKS_EACH_PARAGRAPH, $bodyWidth = MDFY_BODYWIDTH, $keepHTML = MDFY_KEEPHTML) { + $this->linksAfterEachParagraph = $linksAfterEachParagraph; + $this->keepHTML = $keepHTML; + + if ($bodyWidth > $this->minBodyWidth) { + $this->bodyWidth = intval($bodyWidth); + } else { + $this->bodyWidth = false; + } + + $this->parser = new parseHTML; + $this->parser->noTagsInCode = true; + + # we don't have to do this every time + $search = array(); + $replace = array(); + foreach ($this->escapeInText as $s => $r) { + array_push($search, '#(?escapeInText = array( + 'search' => $search, + 'replace' => $replace + ); + } + /** + * parse a HTML string + * + * @param string $html + * @return string markdown formatted + */ + function parseString($html) { + $this->parser->html = $html; + $this->parse(); + return $this->output; + } + /** + * tags with elements which can be handled by markdown + * + * @var array + */ + var $isMarkdownable = array( + 'p' => array(), + 'ul' => array(), + 'ol' => array(), + 'li' => array(), + 'br' => array(), + 'blockquote' => array(), + 'code' => array(), + 'pre' => array(), + 'a' => array( + 'href' => 'required', + 'title' => 'optional', + ), + 'strong' => array(), + 'b' => array(), + 'em' => array(), + 'i' => array(), + 'img' => array( + 'src' => 'required', + 'alt' => 'optional', + 'title' => 'optional', + ), + 'h1' => array(), + 'h2' => array(), + 'h3' => array(), + 'h4' => array(), + 'h5' => array(), + 'h6' => array(), + 'hr' => array(), + ); + /** + * html tags to be ignored (contents will be parsed) + * + * @var array + */ + var $ignore = array( + 'html', + 'body', + ); + /** + * html tags to be dropped (contents will not be parsed!) + * + * @var array + */ + var $drop = array( + 'script', + 'head', + 'style', + 'form', + 'area', + 'object', + 'param', + 'iframe', + ); + /** + * Markdown indents which could be wrapped + * @note: use strings in regex format + * + * @var array + */ + var $wrappableIndents = array( + '\* ', # ul + '\d. ', # ol + '\d\d. ', # ol + '> ', # blockquote + '', # p + ); + /** + * list of chars which have to be escaped in normal text + * @note: use strings in regex format + * + * @var array + * + * TODO: what's with block chars / sequences at the beginning of a block? + */ + var $escapeInText = array( + '([-*_])([ ]{0,2}\1){2,}' => '\\\\$0|', # hr + '\*\*([^*\s]+)\*\*' => '\*\*$1\*\*', # strong + '\*([^*\s]+)\*' => '\*$1\*', # em + '__(?! |_)(.+)(?!<_| )__' => '\_\_$1\_\_', # em + '_(?! |_)(.+)(?!<_| )_' => '\_$1\_', # em + '`(.+)`' => '\`$1\`', # code + '\[(.+)\](\s*\()' => '\[$1\]$2', # links: [text] (url) => [text\] (url) + '\[(.+)\](\s*)\[(.*)\]' => '\[$1\]$2\[$3\]', # links: [text][id] => [text\][id\] + ); + /** + * wether last processed node was a block tag or not + * + * @var bool + */ + var $lastWasBlockTag = false; + /** + * name of last closed tag + * + * @var string + */ + var $lastClosedTag = ''; + /** + * iterate through the nodes and decide what we + * shall do with the current node + * + * @param void + * @return void + */ + function parse() { + $this->output = ''; + # drop tags + $this->parser->html = preg_replace('#<('.implode('|', $this->drop).')[^>]*>.*#sU', '', $this->parser->html); + while ($this->parser->nextNode()) { + switch ($this->parser->nodeType) { + case 'doctype': + break; + case 'pi': + case 'comment': + if ($this->keepHTML) { + $this->flushLinebreaks(); + $this->out($this->parser->node); + $this->setLineBreaks(2); + } + # else drop + break; + case 'text': + $this->handleText(); + break; + case 'tag': + if (in_array($this->parser->tagName, $this->ignore)) { + break; + } + if ($this->parser->isStartTag) { + $this->flushLinebreaks(); + } + if ($this->skipConversion) { + $this->isMarkdownable(); # update notConverted + $this->handleTagToText(); + continue; + } + if (!$this->parser->keepWhitespace && $this->parser->isBlockElement && $this->parser->isStartTag) { + $this->parser->html = ltrim($this->parser->html); + } + if ($this->isMarkdownable()) { + if ($this->parser->isBlockElement && $this->parser->isStartTag && !$this->lastWasBlockTag && !empty($this->output)) { + if (!empty($this->buffer)) { + $str =& $this->buffer[count($this->buffer) -1]; + } else { + $str =& $this->output; + } + if (substr($str, -strlen($this->indent)-1) != "\n".$this->indent) { + $str .= "\n".$this->indent; + } + } + $func = 'handleTag_'.$this->parser->tagName; + $this->$func(); + if ($this->linksAfterEachParagraph && $this->parser->isBlockElement && !$this->parser->isStartTag && empty($this->parser->openTags)) { + $this->flushStacked(); + } + if (!$this->parser->isStartTag) { + $this->lastClosedTag = $this->parser->tagName; + } + } else { + $this->handleTagToText(); + $this->lastClosedTag = ''; + } + break; + default: + trigger_error('invalid node type', E_USER_ERROR); + break; + } + $this->lastWasBlockTag = $this->parser->nodeType == 'tag' && $this->parser->isStartTag && $this->parser->isBlockElement; + } + if (!empty($this->buffer)) { + trigger_error('buffer was not flushed, this is a bug. please report!', E_USER_WARNING); + while (!empty($this->buffer)) { + $this->out($this->unbuffer()); + } + } + ### cleanup + $this->output = rtrim(str_replace('&', '&', str_replace('<', '<', str_replace('>', '>', $this->output)))); + # end parsing, flush stacked tags + $this->flushStacked(); + $this->stack = array(); + } + /** + * check if current tag can be converted to Markdown + * + * @param void + * @return bool + */ + function isMarkdownable() { + if (!isset($this->isMarkdownable[$this->parser->tagName])) { + # simply not markdownable + return false; + } + if ($this->parser->isStartTag) { + $return = true; + if ($this->keepHTML) { + $diff = array_diff(array_keys($this->parser->tagAttributes), array_keys($this->isMarkdownable[$this->parser->tagName])); + if (!empty($diff)) { + # non markdownable attributes given + $return = false; + } + } + if ($return) { + foreach ($this->isMarkdownable[$this->parser->tagName] as $attr => $type) { + if ($type == 'required' && !isset($this->parser->tagAttributes[$attr])) { + # required markdown attribute not given + $return = false; + break; + } + } + } + if (!$return) { + array_push($this->notConverted, $this->parser->tagName.'::'.implode('/', $this->parser->openTags)); + } + return $return; + } else { + if (!empty($this->notConverted) && end($this->notConverted) === $this->parser->tagName.'::'.implode('/', $this->parser->openTags)) { + array_pop($this->notConverted); + return false; + } + return true; + } + } + /** + * output all stacked tags + * + * @param void + * @return void + */ + function flushStacked() { + # links + foreach ($this->stack as $tag => $a) { + if (!empty($a)) { + call_user_func(array(&$this, 'flushStacked_'.$tag)); + } + } + } + /** + * output link references (e.g. [1]: http://example.com "title"); + * + * @param void + * @return void + */ + function flushStacked_a() { + $out = false; + foreach ($this->stack['a'] as $k => $tag) { + if (!isset($tag['unstacked'])) { + if (!$out) { + $out = true; + $this->out("\n\n", true); + } else { + $this->out("\n", true); + } + $this->out(' ['.$tag['linkID'].']: '.$tag['href'].(isset($tag['title']) ? ' "'.$tag['title'].'"' : ''), true); + $tag['unstacked'] = true; + $this->stack['a'][$k] = $tag; + } + } + } + /** + * flush enqued linebreaks + * + * @param void + * @return void + */ + function flushLinebreaks() { + if ($this->lineBreaks && !empty($this->output)) { + $this->out(str_repeat("\n".$this->indent, $this->lineBreaks), true); + } + $this->lineBreaks = 0; + } + /** + * handle non Markdownable tags + * + * @param void + * @return void + */ + function handleTagToText() { + if (!$this->keepHTML) { + if (!$this->parser->isStartTag && $this->parser->isBlockElement) { + $this->setLineBreaks(2); + } + } else { + # dont convert to markdown inside this tag + /** TODO: markdown extra **/ + if (!$this->parser->isEmptyTag) { + if ($this->parser->isStartTag) { + if (!$this->skipConversion) { + $this->skipConversion = $this->parser->tagName.'::'.implode('/', $this->parser->openTags); + } + } else { + if ($this->skipConversion == $this->parser->tagName.'::'.implode('/', $this->parser->openTags)) { + $this->skipConversion = false; + } + } + } + + if ($this->parser->isBlockElement) { + if ($this->parser->isStartTag) { + if (in_array($this->parent(), array('ins', 'del'))) { + # looks like ins or del are block elements now + $this->out("\n", true); + $this->indent(' '); + } + if ($this->parser->tagName != 'pre') { + $this->out($this->parser->node."\n".$this->indent); + if (!$this->parser->isEmptyTag) { + $this->indent(' '); + } else { + $this->setLineBreaks(1); + } + $this->parser->html = ltrim($this->parser->html); + } else { + # don't indent inside
     tags
    +            $this->out($this->parser->node);
    +            static $indent;
    +            $indent =  $this->indent;
    +            $this->indent = '';
    +          }
    +        } else {
    +          if (!$this->parser->keepWhitespace) {
    +            $this->output = rtrim($this->output);
    +          }
    +          if ($this->parser->tagName != 'pre') {
    +            $this->indent('  ');
    +            $this->out("\n".$this->indent.$this->parser->node);
    +          } else {
    +            # reset indentation
    +            $this->out($this->parser->node);
    +            static $indent;
    +            $this->indent = $indent;
    +          }
    +
    +          if (in_array($this->parent(), array('ins', 'del'))) {
    +            # ins or del was block element
    +            $this->out("\n");
    +            $this->indent('  ');
    +          }
    +          if ($this->parser->tagName == 'li') {
    +            $this->setLineBreaks(1);
    +          } else {
    +            $this->setLineBreaks(2);
    +          }
    +        }
    +      } else {
    +        $this->out($this->parser->node);
    +      }
    +      if (in_array($this->parser->tagName, array('code', 'pre'))) {
    +        if ($this->parser->isStartTag) {
    +          $this->buffer();
    +        } else {
    +          # add stuff so cleanup just reverses this
    +          $this->out(str_replace('<', '&lt;', str_replace('>', '&gt;', $this->unbuffer())));
    +        }
    +      }
    +    }
    +  }
    +  /**
    +   * handle plain text
    +   *
    +   * @param void
    +   * @return void
    +   */
    +  function handleText() {
    +    if ($this->hasParent('pre') && strpos($this->parser->node, "\n") !== false) {
    +      $this->parser->node = str_replace("\n", "\n".$this->indent, $this->parser->node);
    +    }
    +    if (!$this->hasParent('code') && !$this->hasParent('pre')) {
    +      # entity decode
    +      $this->parser->node = $this->decode($this->parser->node);
    +      if (!$this->skipConversion) {
    +        # escape some chars in normal Text
    +        $this->parser->node = preg_replace($this->escapeInText['search'], $this->escapeInText['replace'], $this->parser->node);
    +      }
    +    } else {
    +      $this->parser->node = str_replace(array('"', '&apos'), array('"', '\''), $this->parser->node);
    +    }
    +    $this->out($this->parser->node);
    +    $this->lastClosedTag = '';
    +  }
    +  /**
    +   * handle  and  tags
    +   *
    +   * @param void
    +   * @return void
    +   */
    +  function handleTag_em() {
    +    $this->out('*', true);
    +  }
    +  function handleTag_i() {
    +    $this->handleTag_em();
    +  }
    +  /**
    +   * handle  and  tags
    +   *
    +   * @param void
    +   * @return void
    +   */
    +  function handleTag_strong() {
    +    $this->out('**', true);
    +  }
    +  function handleTag_b() {
    +    $this->handleTag_strong();
    +  }
    +  /**
    +   * handle 

    tags + * + * @param void + * @return void + */ + function handleTag_h1() { + $this->handleHeader(1); + } + /** + * handle

    tags + * + * @param void + * @return void + */ + function handleTag_h2() { + $this->handleHeader(2); + } + /** + * handle

    tags + * + * @param void + * @return void + */ + function handleTag_h3() { + $this->handleHeader(3); + } + /** + * handle

    tags + * + * @param void + * @return void + */ + function handleTag_h4() { + $this->handleHeader(4); + } + /** + * handle

    tags + * + * @param void + * @return void + */ + function handleTag_h5() { + $this->handleHeader(5); + } + /** + * handle
    tags + * + * @param void + * @return void + */ + function handleTag_h6() { + $this->handleHeader(6); + } + /** + * number of line breaks before next inline output + */ + var $lineBreaks = 0; + /** + * handle header tags (

    -

    ) + * + * @param int $level 1-6 + * @return void + */ + function handleHeader($level) { + if ($this->parser->isStartTag) { + $this->out(str_repeat('#', $level).' ', true); + } else { + $this->setLineBreaks(2); + } + } + /** + * handle

    tags + * + * @param void + * @return void + */ + function handleTag_p() { + if (!$this->parser->isStartTag) { + $this->setLineBreaks(2); + } + } + /** + * handle tags + * + * @param void + * @return void + */ + function handleTag_a() { + if ($this->parser->isStartTag) { + $this->buffer(); + if (isset($this->parser->tagAttributes['title'])) { + $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']); + } else { + $this->parser->tagAttributes['title'] = null; + } + $this->parser->tagAttributes['href'] = $this->decode(trim($this->parser->tagAttributes['href'])); + $this->stack(); + } else { + $tag = $this->unstack(); + $buffer = $this->unbuffer(); + + if (empty($tag['href']) && empty($tag['title'])) { + # empty links... testcase mania, who would possibly do anything like that?! + $this->out('['.$buffer.']()', true); + return; + } + + if ($buffer == $tag['href'] && empty($tag['title'])) { + # + $this->out('<'.$buffer.'>', true); + return; + } + + $bufferDecoded = $this->decode(trim($buffer)); + if (substr($tag['href'], 0, 7) == 'mailto:' && 'mailto:'.$bufferDecoded == $tag['href']) { + if (is_null($tag['title'])) { + # + $this->out('<'.$bufferDecoded.'>', true); + return; + } + # [mail@example.com][1] + # ... + # [1]: mailto:mail@example.com Title + $tag['href'] = 'mailto:'.$bufferDecoded; + } + if ($this->linksAfterEachParagraph!=='inline'){ + # [This link][id] + foreach ($this->stack['a'] as $tag2) { + if ($tag2['href'] == $tag['href'] && $tag2['title'] === $tag['title']) { + $tag['linkID'] = $tag2['linkID']; + break; + } + } + if (!isset($tag['linkID'])) { + $tag['linkID'] = count($this->stack['a']) + 1; + array_push($this->stack['a'], $tag); + } + + $this->out('['.trim($buffer).']['.$tag['linkID'].']', true); + } + else { + # [This link|title](url) + if ($tag['title']) + $buffer.="|".$tag['title']; + $this->out('['.trim($buffer).']('.$tag['href'].')', true); + } + } + } + /** + * handle tags + * + * @param void + * @return void + */ + function handleTag_img() { + if (!$this->parser->isStartTag) { + return; # just to be sure this is really an empty tag... + } + + if (isset($this->parser->tagAttributes['title'])) { + $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']); + } else { + $this->parser->tagAttributes['title'] = null; + } + if (isset($this->parser->tagAttributes['alt'])) { + $this->parser->tagAttributes['alt'] = $this->decode($this->parser->tagAttributes['alt']); + } else { + $this->parser->tagAttributes['alt'] = null; + } + + if (empty($this->parser->tagAttributes['src'])) { + # support for "empty" images... dunno if this is really needed + # but there are some testcases which do that... + if (!empty($this->parser->tagAttributes['title'])) { + $this->parser->tagAttributes['title'] = ' '.$this->parser->tagAttributes['title'].' '; + } + $this->out('!['.$this->parser->tagAttributes['alt'].']('.$this->parser->tagAttributes['title'].')', true); + return; + } else { + $this->parser->tagAttributes['src'] = $this->decode($this->parser->tagAttributes['src']); + } + + # [This link][id] + $link_id = false; + if (!empty($this->stack['a'])) { + foreach ($this->stack['a'] as $tag) { + if ($tag['href'] == $this->parser->tagAttributes['src'] + && $tag['title'] === $this->parser->tagAttributes['title']) { + $link_id = $tag['linkID']; + break; + } + } + } else { + $this->stack['a'] = array(); + } + if (!$link_id) { + $link_id = count($this->stack['a']) + 1; + $tag = array( + 'href' => $this->parser->tagAttributes['src'], + 'linkID' => $link_id, + 'title' => $this->parser->tagAttributes['title'] + ); + array_push($this->stack['a'], $tag); + } + + $this->out('!['.$this->parser->tagAttributes['alt'].']['.$link_id.']', true); + } + /** + * handle tags + * + * @param void + * @return void + */ + function handleTag_code() { + if ($this->hasParent('pre')) { + # ignore code blocks inside

    +      return;
    +    }
    +    if ($this->parser->isStartTag) {
    +      $this->buffer();
    +    } else {
    +      $buffer = $this->unbuffer();
    +      # use as many backticks as needed
    +      preg_match_all('#`+#', $buffer, $matches);
    +      if (!empty($matches[0])) {
    +        rsort($matches[0]);
    +
    +        $ticks = '`';
    +        while (true) {
    +          if (!in_array($ticks, $matches[0])) {
    +            break;
    +          }
    +          $ticks .= '`';
    +        }
    +      } else {
    +        $ticks = '`';
    +      }
    +      if ($buffer[0] == '`' || substr($buffer, -1) == '`') {
    +        $buffer = ' '.$buffer.' ';
    +      }
    +      $this->out($ticks.$buffer.$ticks, true);
    +    }
    +  }
    +  /**
    +   * handle 
     tags
    +   *
    +   * @param void
    +   * @return void
    +   */
    +  function handleTag_pre() {
    +    if ($this->keepHTML && $this->parser->isStartTag) {
    +      # check if a simple  follows
    +      if (!preg_match('#^\s*#Us', $this->parser->html)) {
    +        # this is no standard markdown code block
    +        $this->handleTagToText();
    +        return;
    +      }
    +    }
    +    $this->indent('    ');
    +    if (!$this->parser->isStartTag) {
    +      $this->setLineBreaks(2);
    +    } else {
    +      $this->parser->html = ltrim($this->parser->html);
    +    }
    +  }
    +  /**
    +   * handle 
    tags + * + * @param void + * @return void + */ + function handleTag_blockquote() { + $this->indent('> '); + } + /** + * handle