Exemplo n.º 1
0
function abs_url($texte, $base = '')
{
    if ($GLOBALS['mode_abs_url'] == 'url') {
        return url_absolue($texte, $base);
    } else {
        return liens_absolus($texte, $base);
    }
}
Exemplo n.º 2
0
/**
 * 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);
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
/**
 * 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);
}
Exemplo n.º 5
0
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>'
	);
}
Exemplo n.º 6
0
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>');
}
Exemplo n.º 7
0
/**
 * 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;
}