Je travaille avec un document HTML généré à partir de Micrsoft Word 2007/2010. En plus de générer du code HTML extrêmement sale, Word a également tendance à utiliser à la fois le style de bloc et le style en ligne. Je cherche une bibliothèque php qui fusionnerait un bloc avec un élément de style déjà existant.
J'ai converti le code HTML à partir de Word et je les enverrai via XMLRPC. La bibliothèque php devra fusionner la feuille de style avec le style en ligne afin que le format soit préservé. Je souhaite effectuer l'appel vers cette bibliothèque après la réception de la demande par XMLRPC et avant qu'elle n'atteigne le filtre kses afin que le bloc de style ne soit pas supprimé.
Exemple
Si le code HTML d'origine est:
<html>
<head>
<style>
.normaltext {color:black;font-weight:normal;font-size:10pt}
.important {color:red;font-weight:bold;font-size:11pt}
</style>
<body>
<p class="normaltext" style="font-family:arial">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
In ut erat id dui mollis faucibus. Mauris eu neque et eros tempus placerat.
<span class="important">Nam in purus nisi</span>, vitae dictum ligula.
Morbi mattis eros eget diam vulputate imperdiet.
<span class="important" style="color:green">Integer</span> a metus eros.
Sed iaculis porta imperdiet.
</p>
</body>
</html>
Devraient devenir:
<html>
<head>
<body>
<p style="font-family:arial;color:black;font-weight:normal;font-size:10pt">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
In ut erat id dui mollis faucibus. Mauris eu neque et eros tempus placerat.
<span style="color:red;font-weight:bold;font-size:11pt">Nam in purus nisi</span>, vitae dictum ligula.
Morbi mattis eros eget diam vulputate imperdiet.
<span style="color:green;font-weight:bold;font-size:11pt">Integer</span> a metus eros.
Sed iaculis porta imperdiet.
</p>
</body>
</html>
But
L'objectif final est de pouvoir conserver tout le style et la mise en forme d'un fichier HTML généré par Word et de l'envoyer à wordpress, où il peut être édité par TinyMCE. S'il existe une alternative à ce que je décris (doit être fait côté serveur), je suis prêt à l'accepter également comme réponse.
J'essaie de reproduire le même résultat que celui que vous avez fourni dans votre exemple ci-dessus et je ne peux obtenir qu'un résultat similaire à celui de;
<p class=MsoNormal>
<span class=MsoIntenseReference>
<span style='color:red;text-transform:none;letter-spacing:0pt;font-weight:normal;text-decoration:none'>
Red Example text
</span>
</span>
</p>
Comme vous pouvez le constater, Microsoft Word (2010) insère des noms de classe prédéfinis pour les balises de paragraphe et d'étendue, en plus d'encapsuler l'envergure contenant le texte.
Comment avez-vous pu attribuer un nom de classe à la plage dans laquelle votre texte est enveloppé?
Pour référence, je sauvegarde mon fichier HTML en tant que "page Web, filtrée" et filtré étant la clé pour supprimer tout formatage "incorrect" que Word appliquerait sinon au document.
Si je peux reproduire le même résultat que dans l'exemple ci-dessus, nous pourrons peut-être trouver une solution plus simple.
PS Je m'excuse de ce que cette réponse à votre question soit une réponse, mais je ne suis apparemment pas en mesure de poster un commentaire. J’ai l’intention de donner suite à quelques commentaires supplémentaires qui contribueront à une réponse complète, car j’ai quelques suggestions à faire, une fois que j’aurai approfondi ma question initiale ci-dessus!
REMARQUE: Ceci est conçu comme un guide pour vous permettre de vous mettre sur le bon chemin. Par conséquent, le code fourni ci-dessous est un exemple qui manque certaines fonctionnalités dans lesquelles vous devrez écrire.
Idéalement, vous souhaitez que votre script XML-RPC gère le traitement du contenu dans lequel vous le transmettez de deux manières.
1) Recherchez et remplacez les styles en ligne par ceux compatibles avec WordPress via une expression régulière (RegEx).
2) Publiez votre contenu nouvellement assaini sur votre blog sous la forme d’un message.
Étant donné que vous ne connaissez pas le format de style exactement en-ligne que votre document MS Word produira, vous pouvez utiliser la recherche régulière et remplacer le texte entre les caractères en fonction de certains critères.
Prenez ceci par exemple;
<span style="color:green">Integer</span>
Grâce à RegEx, vous pouvez rechercher le mot "vert" entre <span
et >
. Lorsque vous trouvez une correspondance de "vert", vous remplacez tout le texte entre votre style en-ligne souhaité;
<span class="green" style="color:green;font-weight:bold;font-size:10pt">
Pour que ce style en ligne soit disponible dans l'écran d'édition de publication dans le tableau de bord WordPress, vous devez ajouter des options supplémentaires à l'éditeur "styles-dropdown" de l'éditeur TinyMCE.
array(
'title' => 'Bold Green Text',
'classes' => 'green',
'inline' => 'span',
'styles' => array(
'color' => 'green',
'fontWeight' => 'bold',
'fontSize' => '10pt'
)
Vous pouvez en lire plus à ce sujet à,
1) ICI
2) ET ICI
Essentiellement, les styles personnalisés que vous ajoutez doivent correspondre à ceux que vous rendez disponibles via votre fonction RegEx.
Maintenant, en termes de votre script XML-RPC (exemple. Post-via-xmlrpc.php) ressemblerait à quelque chose comme:
<?php
// Your RegExp function for processing your source file
function sanitize_content() {
gloabl $content;
$content = '<span class="important">example content is here</span>';
// do your regular expression stuff here
return $content;
}
// Your XML-RPC function
function wpPostXMLRPC($title,$content,$rpcurl,$username,$password,$categories=array(1)){
$categories = implode(",", $categories);
$XML = "<title>$title</title>"."<category>$categories</category>".$sanitized_content;
$params = array('','',$username,$password,$XML,1);
$request = xmlrpc_encode_request('blogger.newPost',$params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_URL, $rpcurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_exec($ch);
curl_close($ch);
}
// Do stuff here to initiate your post function
?>
Pour cet exemple, vous pouvez voir que j'ai inclus la chaîne $ content dans le script, mais vous voudrez bien entendu transmettre votre fichier HTML MS Word à cette variable à la place. Vous pouvez le faire via un formulaire ou un chemin de fichier, etc. sur.
En supposant que votre post-via-xmlrpc.php soit accessible via votre hôte local, vous lanceriez ce processus en visitant,
http: //localhost/post-via-xmlrpc.php
La partie la plus difficile de tout ce processus est en réalité votre fonction de recherche et de remplacement d’expression régulière (RegEx) pour laquelle vous devez rechercher <body>
et supprimer tout ce qui précède, rechercher </body>
et tout supprimer après, puis supprimer les deux <body>
et </body>
, puis analyser le contenu restant en remplaçant les styles en-ligne selon les besoins.
Il n'est vraiment pas nécessaire de manipuler une autre bibliothèque PHP lorsque tout peut être fait à partir d'un script XML-RPC autonome conçu pour purifier votre entrée.
Check-out:
Le portage de code depuis l'une des sources vers PHP, ou l'utilisation de l'une des API disponibles, devrait permettre de rendre votre style CSS inline.
Si les styles ne sont pas acceptables mais que vous ne voulez pas que TinyMCE les élimine et que vous souhaitiez le faire, vous voudrez peut-être aborder la question plus directement.
TinyMCE a une configuration valid_children
, qui permettrait aux styles de rester. En ajoutant +body[style]
, vous devriez pouvoir obtenir des blocs de style.
http://codex.wordpress.org/TinyMCE#Customize_TinyMCE_with_Filters
L'option keep_styles
devrait également aider, ainsi que paste_remove_styles
. Découvrez les valeurs par défaut ici http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes//class-wp-editor.php#L271
Vous pouvez vous connecter au filtre tiny_mce_before_init
et modifier les valeurs.
http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes//class-wp-editor.php#L396