function abs_url($texte, $base = '') { if ($GLOBALS['mode_abs_url'] == 'url') { return url_absolue($texte, $base); } else { return liens_absolus($texte, $base); } }
/** * Encode du HTML pour transmission XML * notamment dans les flux RSS * * http://doc.spip.org/@texte_backend * * @param $texte * @return mixed */ function texte_backend($texte) { static $apostrophe = array("’", "'"); # n'allouer qu'une fois // si on a des liens ou des images, les passer en absolu $texte = liens_absolus($texte); // echapper les tags > < $texte = preg_replace(',&(gt|lt);,S', '&\\1;', $texte); // importer les é $texte = filtrer_entites($texte); // " -> " et tout ce genre de choses $u = $GLOBALS['meta']['pcre_u']; $texte = str_replace(" ", " ", $texte); $texte = preg_replace('/\\s{2,}/S' . $u, " ", $texte); // ne pas echapper les sinqle quotes car certains outils de syndication gerent mal $texte = entites_html($texte, false, false); // mais bien echapper les double quotes ! $texte = str_replace('"', '"', $texte); // verifier le charset $texte = charset2unicode($texte); // Caracteres problematiques en iso-latin 1 if ($GLOBALS['meta']['charset'] == 'iso-8859-1') { $texte = str_replace(chr(156), 'œ', $texte); $texte = str_replace(chr(140), 'Œ', $texte); $texte = str_replace(chr(159), 'Ÿ', $texte); } // l'apostrophe curly pose probleme a certains lecteure de RSS // et le caractere apostrophe alourdit les squelettes avec PHP // ==> on les remplace par l'entite HTML return str_replace($apostrophe, "'", $texte); }
function inserer_article_syndique($data, $now_id_syndic, $statut, $url_site, $url_syndic, $resume, $documents, &$faits) { // Creer le lien s'il est nouveau - cle=(id_syndic,url) // On coupe a 255 caracteres pour eviter tout doublon // sur une URL de plus de 255 qui exloserait la base de donnees $le_lien = substr($data['url'], 0, 255); // si true, un lien deja syndique arrivant par une autre source est ignore // par defaut [false], chaque source a sa liste de liens, eventuellement // les memes define('_SYNDICATION_URL_UNIQUE', false); // Si false, on ne met pas a jour un lien deja syndique avec ses nouvelles // donnees ; par defaut [true] : on met a jour si le contenu a change // Attention si on modifie a la main un article syndique, les modifs sont // ecrasees lors de la syndication suivante define('_SYNDICATION_CORRECTION', true); // Chercher les liens de meme cle // S'il y a plusieurs liens qui repondent, il faut choisir le plus proche // (ie meme titre et pas deja fait), le mettre a jour et ignorer les autres $n = 0; $s = sql_select("id_syndic_article,titre,id_syndic,statut", "spip_syndic_articles", "url=" . sql_quote($le_lien) . (_SYNDICATION_URL_UNIQUE ? '' : " AND id_syndic={$now_id_syndic}") . " AND " . sql_in('id_syndic_article', $faits, 'NOT'), "", "maj DESC"); while ($a = sql_fetch($s)) { $id = $a['id_syndic_article']; $id_syndic = $a['id_syndic']; if ($a['titre'] == $data['titre']) { $id_syndic_article = $id; break; } $n++; } // S'il y en avait qu'un, le prendre quel que soit le titre if ($n == 1) { $id_syndic_article = $id; } elseif (!isset($id_syndic_article)) { $champs = array('id_syndic' => $now_id_syndic, 'url' => $le_lien, 'date' => date("Y-m-d H:i:s", $data['date'] ? $data['date'] : $data['lastbuilddate']), 'statut' => $statut); // Envoyer aux plugins $champs = pipeline('pre_insertion', array('args' => array('table' => 'spip_syndic_articles'), 'data' => $champs)); $ajout = $id_syndic_article = sql_insertq('spip_syndic_articles', $champs); if (!$ajout) { return; } pipeline('post_insertion', array('args' => array('table' => 'spip_syndic_articles', 'id_objet' => $id_syndic_article), 'data' => $champs)); } $faits[] = $id_syndic_article; // Si le lien n'est pas nouveau, plusieurs options : if (!$ajout) { // 1. Lien existant : on corrige ou pas ? if (!_SYNDICATION_CORRECTION) { return; } // 2. Le lien existait deja, lie a un autre spip_syndic if (_SYNDICATION_URL_UNIQUE and $id_syndic != $now_id_syndic) { return; } } // Descriptif, en mode resume ou mode 'full text' // on prend en priorite data['descriptif'] si on est en mode resume, // et data['content'] si on est en mode "full syndication" if ($resume != 'non') { // mode "resume" $desc = strlen($data['descriptif']) ? $data['descriptif'] : $data['content']; $desc = couper(trim_more(textebrut($desc)), 300); } else { // mode "full syndication" // choisir le contenu pertinent // & refaire les liens relatifs $desc = strlen($data['content']) ? $data['content'] : $data['descriptif']; $desc = liens_absolus($desc, $url_syndic); } // tags & enclosures (preparer spip_syndic_articles.tags) $tags = $data['enclosures'] ? $data['enclosures'] : ''; # eviter les doublons (cle = url+titre) et passer d'un tableau a une chaine if ($data['tags']) { $vus = array(); foreach ($data['tags'] as $tag) { $cle = supprimer_tags($tag) . extraire_attribut($tag, 'href'); $vus[$cle] = $tag; } $tags .= ($tags ? ', ' : '') . join(', ', $vus); } // Mise a jour du contenu (titre,auteurs,description,date?,source...) $vals = array('titre' => $data['titre'], 'lesauteurs' => $data['lesauteurs'], 'descriptif' => $desc, 'lang' => substr($data['lang'], 0, 10), 'source' => substr($data['source'], 0, 255), 'url_source' => substr($data['url_source'], 0, 255), 'tags' => $tags); // Mettre a jour la date si lastbuilddate if ($data['lastbuilddate']) { $vals['date'] = date("Y-m-d H:i:s", $data['lastbuilddate']); } sql_updateq('spip_syndic_articles', $vals, "id_syndic_article={$id_syndic_article}"); // Point d'entree post_syndication pipeline('post_syndication', array('args' => array('table' => 'spip_syndic_articles', 'id_objet' => $id_syndic_article, 'url' => $le_lien, 'id_syndic' => $now_id_syndic, 'ajout' => $ajout), 'data' => $data)); return $ajout; }
/** * CP-20110320 * Version liens_absolus compatible DATA URL SHEME * @return string */ function spiplistes_liens_absolus ($texte, $base='') { static $url_sheme = 'data:image/png;base64'; static $hide_sheme = '<__HIDEME__ '; $switch_me = false; if (preg_match_all( // masque = tout ',(?P<masque>' // tag, 'img' uniquement . '<(?P<tag>img)[[:space:]]+[^<>]*' // src ? data url sheme ? .'(?P<attr>src=["\']?'.$url_sheme.')' // tout ce qui suit jusqu'au tag fermant . '(?P<right>[^>]*>)),isS', $texte, $matches, PREG_SET_ORDER )) { foreach ($matches as $match) { $texte = str_replace( $match['masque'] , $hide_sheme.$match['right'] , $texte ); } $switch_me = true; } $texte = liens_absolus($texte, $base); if ($switch_me) { $texte = str_replace($hide_sheme, '<img src="'.$url_sheme, $texte); } return ($texte); }
function crayons_formulaire($html, $action='crayons_store') { if (!$html) return ''; include_spip('inc/filtres'); return liens_absolus( '<div class="formulaire_spip">' . '<form class="formulaire_crayon" method="post" action="' . url_absolue(parametre_url(self(),'action', $action)) . '" enctype="multipart/form-data">' . $html . crayons_boutons() . '</form>' .'</div>' ); }
function crayons_formulaire($html, $action = 'crayons_store') { if (!$html) { return ''; } // on est oblige de recreer un Crayon pour connaitre la largeur du form. // Pb conceptuel a revoir $crayon = new Crayon(""); $class = $crayon->largeur < 250 ? " small" : ""; include_spip('inc/filtres'); return liens_absolus('<div class="formulaire_spip">' . '<form class="formulaire_crayon' . $class . '" method="post" action="' . url_absolue(parametre_url(self(), 'action', $action)) . '" enctype="multipart/form-data">' . $html . crayons_boutons() . '</form>' . '</div>'); }
/** * Récupère le contenu d'un média * * Arguments possibles : * -* login * -* pass * -* id_article int (Obligatoire) * -* champs_demandes string (champs que l'on souhaite récupérer, séparés par une virgule, sinon, on retourne l'ensemble) * -* document_largeur int (largeur maximale du document, si c'est une image, défaut largeur du document original) * -* document_hauteur int (hauteur maximale du document, si c'est une image, défaut hauteur du document original) * -* vignette_format string (carre ou autre, autre n'a pas de fonction) * -* vignette_largeur int (largeur de la vignette en px, défaut 100) * -* vignette_hauteur int (hauteur de la vignette en px, défaut 100) */ function geodiv_lire_media($args) { global $spip_xmlrpc_serveur; if (!intval($args['id_article']) > 0) { $erreur = _T('xmlrpc:erreur_identifiant', array('objet' => 'article')); return new IXR_Error(-32601, attribut_html($erreur)); } $champs_demandes = is_array($args['champs_demandes']) ? $args['champs_demandes'] : array(); $format_vignette = $args['vignette_format']; $config = lire_config('geol', array()); $secteur_medias = intval($config['secteur_medias']) > 0 ? $config['secteur_medias'] : 1; $args_media = array_merge($args, array('objet' => 'article', 'id_objet' => $args['id_article'])); $res = $spip_xmlrpc_serveur->read($args_media); if (!$res) { return $spip_xmlrpc_serveur->error; } $id_secteur = $res['result'][0]['id_secteur'] ? $res['result'][0]['id_secteur'] : sql_getfetsel('id_secteur', 'spip_articles', 'id_article=' . intval($args['id_article'])); /** * Sécurité : L'article demandé n'est pas un média */ if ($id_secteur != $secteur_medias) { $erreur = _T('xmlrpc_geodiv:erreur_article_media', array('id_article' => $args['id_article'])); return new IXR_Error(-32601, attribut_html($erreur)); } /** * Si on demande précisément certains champs, on ne fait que les renvoyer */ if (count($champs_demandes) != 0) { foreach ($res['result'][0] as $champ => $valeur) { if (!in_array($champ, array('id_article')) && !in_array($champ, $champs_demandes)) { unset($res['result'][0][$champ]); } } } /** * On ajoute le booléen "modifiable" : * Uniquement si on ne demande pas de champs spécifique ou qu'il soit dedans */ if (count($champs_demandes) == 0 || in_array('modifiable', $champs_demandes)) { if (autoriser('modifier', 'id_article', $args['id_article'], $GLOBALS['visiteur_session'])) { $res['result'][0]['modifiable'] = 1; } else { $res['result'][0]['modifiable'] = 0; } } /** * On ajoute le logo de l'article : * Uniquement si on ne demande pas de champs spécifique ou qu'il soit dedans */ if (count($champs_demandes) == 0 || in_array('logo', $champs_demandes)) { $logo = quete_logo('id_article', 'on', $res['result'][0]['id_article'], '', false); if (is_array($logo)) { $res['result'][0]['logo'] = url_absolue($logo[0]); } } /** * On a les infos de l'article, on récupère maintenant : * (si pas de champs demandés spécifiés ou les champs en question sont demandés) * -* Son document * -* Sa vignette * -* Sa géoloc * -* Ses mots clés * -** tags * -** échelle * -* Ses commentaires */ /** * On commence par le document principal */ if (count($champs_demandes) == 0 || in_array('document', $champs_demandes) || in_array('vignette', $champs_demandes)) { $document = sql_fetsel('*', 'spip_documents as documents LEFT JOIN spip_documents_liens AS lien ON documents.id_document=lien.id_document', 'lien.objet=' . sql_quote('article') . ' AND lien.id_objet=' . intval($args['id_article']), array(), array(), 1); if (is_array($document)) { include_spip('inc/documents'); include_spip('inc/filtres_images_mini'); include_spip('filtres/images_transforme'); if (count($champs_demandes) == 0 || in_array('document', $champs_demandes)) { $largeur_document = $args['document_largeur']; $hauteur_document = $args['document_hauteur']; if (in_array($document['extension'], array('gif', 'png', 'jpg')) && ($largeur_document || $hauteur_document)) { $res['result'][0]['document'] = url_absolue(extraire_attribut(image_reduire(get_spip_doc($document['fichier']), $largeur_document, $hauteur_document), 'src')); } else { $res['result'][0]['document'] = url_absolue(get_spip_doc($document['fichier'])); } $res['result'][0]['media'] = $document['media']; $res['result'][0]['extension'] = $document['extension']; } if (count($champs_demandes) == 0 || in_array('vignette', $champs_demandes)) { $largeur_vignette = $args['vignette_largeur'] ? $args['vignette_largeur'] : 100; $hauteur_vignette = $args['vignette_hauteur'] ? $args['vignette_hauteur'] : 100; if ($format_vignette == 'carre') { $vignette = extraire_attribut(quete_logo_document($document, $lien, $align, $mode_logo, '', '', $connect = NULL), 'src'); $res['result'][0]['vignette'] = url_absolue(extraire_attribut(image_recadre(image_passe_partout($vignette, $largeur_vignette, $hauteur_vignette), $largeur_vignette, $hauteur_vignette), 'src')); } else { $vignette = liens_absolus(quete_logo_document($document, $lien, $align, $mode_logo, $largeur_vignette, $hauteur_vignette, $connect = NULL)); $res['result'][0]['vignette'] = extraire_attribut($vignette, 'src'); } } } } /** * On ajoute les auteurs * On met juste leur id_auteur + nom, si besoin de plus une autre requête sur l'auteur est à effectuer */ if (count($champs_demandes) == 0 || in_array('auteurs', $champs_demandes)) { $auteurs = sql_select('auteurs.nom, auteurs.id_auteur', 'spip_auteurs AS auteurs INNER JOIN spip_auteurs_liens AS L1 ON L1.id_auteur = auteurs.id_auteur INNER JOIN spip_articles AS L2 ON L2.id_article = L1.id_objet', "L1.objet='article' AND auteurs.statut != '5poubelle' AND L2.id_article = " . intval($res['result'][0]['id_article'])); while ($auteur = sql_fetch($auteurs)) { $res['result'][0]['auteurs'][] = $auteur; } } /** * On ajoute les points de géoloc */ if (defined('_DIR_PLUGIN_GIS') && count($champs_demandes) == 0 || in_array('gis', $champs_demandes)) { include_spip('gis_xmlrpc', 'inc'); $tous_gis = sql_select('gis.id_gis', 'spip_gis AS `gis` INNER JOIN spip_gis_liens AS L1 ON L1.id_gis = gis.id_gis', 'L1.id_objet = ' . intval($args['id_article']) . ' AND (L1.objet = ' . sql_quote('article') . ')'); while ($gis = sql_fetch($tous_gis)) { $args['id_gis'] = $gis['id_gis']; $res['result'][0]['gis'][] = spip_lire_gis($args); } } /** * On ajoute les tags * On met juste leur id_mot + titr, si besoin de plus une autre requête sur le mot est à effectuer */ if (count($champs_demandes) == 0 || in_array('tags', $champs_demandes)) { $tags_group = intval($config['groupe_tags']) > 0 ? intval($config['groupe_tags']) : intval(lire_config('spipicious/groupe_mot')); if ($tags_group > 0) { $tous_tags = sql_select('mots.id_mot, mots.titre', 'spip_mots AS `mots` INNER JOIN spip_mots_liens AS L1 ON ( L1.id_mot = mots.id_mot )', 'L1.id_objet = ' . intval($args['id_article']) . ' AND (L1.objet = "article") AND (mots.id_groupe = ' . $tags_group . ')'); while ($tag = sql_fetch($tous_tags)) { $res['result'][0]['tags'][] = $tag; } } } /** * Et on ajoute l'échelle * On met juste son id_mot + titre, si besoin de plus une autre requête sur le mot est à effectuer */ if (count($champs_demandes) == 0 || in_array('echelle', $champs_demandes)) { $echelle_group = intval($config['groupe_echelle']) > 0 ? intval($config['groupe_echelle']) : 0; if ($echelle_group > 0) { $echelle = sql_fetsel('mots.id_mot, mots.titre', 'spip_mots AS `mots` INNER JOIN spip_mots_liens AS L1 ON ( L1.id_mot = mots.id_mot )', 'L1.id_objet = ' . intval($args['id_article']) . ' AND (L1.objet = "article") AND (mots.id_groupe = ' . $echelle_group . ')'); if (is_array($echelle)) { $res['result'][0]['echelle'][] = $echelle; } } } /** * Et on ajoute les forums * On n'affiche que les forums publiés (statut publie) * * On met juste : * -* id_forum * -* id_thread * -* titre * -* auteur * -* id_auteur * Si besoin de plus une autre requête sur le forum est à effectuer */ if (count($champs_demandes) == 0 || in_array('forums', $champs_demandes)) { $forums = sql_select('id_forum, id_thread,titre,auteur,id_auteur', 'spip_forum', 'objet=' . sql_quote('article') . ' AND id_objet = ' . intval($args['id_article']) . ' AND (statut = ' . sql_quote('publie') . ')'); while ($forum = sql_fetch($forums)) { $res['result'][0]['forums'][] = $forum; } } $media_struct = $res['result'][0]; $media_struct = array_filter($media_struct); return $media_struct; }