Réel fond rapide: Nous avons un PDFMaker (HTMLDoc) qui convertit html en pdf. HTMLDoc ne reprend pas systématiquement les styles dont nous avons besoin à partir du code HTML qui nous est fourni par le client. Ainsi, j'essaie de convertir des choses telles que style = "width: 80px; height: 90px;" à hauteur = 80 largeur = 90. Ma tentative jusqu'ici a révélé ma compréhension limitée des références arrières et comment les utiliser correctement au cours de Perl Regex. Je peux prendre un fichier d'entrée et le convertir en un fichier de sortie, mais il attrape seulement un "style" par ligne, et ne remplace qu'une paire nom/valeur de ce CSS.Convertir les attributs de style CSS en attributs HTML en utilisant Perl
Je suis probablement en train d'aborder ce problème, mais je n'arrive pas à trouver une façon plus rapide et plus intelligente de le faire en Perl. Toute aide serait grandement appréciée! REMARQUE: Les seuls attributs que j'essaie de modifier pour ce script particulier sont "height", "width" et "border", car notre client utilise un outil qui applique automatiquement les styles aux éléments qu'ils traînent avec un Éditeur de style WYSIWYG. Évidemment, utiliser une regex pour les supprimer de beaucoup d'endroits fonctionne assez bien, car vous laissez simplement les cellules de la table être dimensionnées par leur contenu, ce qui semble correct, mais je me suis dit qu'une façon plus rapide de régler le problème serait de remplacez ces trois attributs par les attributs "width" "height" et "border", qui se comportent généralement de la même manière que leurs équivalents css (sauf que CSS vous permet de personnaliser la largeur, la couleur et le style de la bordure, mais l'utilisation est solide 1px, donc je peux ajouter une condition pour remplacer "1px solide" par "border = 1" Je me rends compte que ceux-ci ne sont pas totalement équivalents, mais pour cette application ce serait une étape).
Voici ce que j'ai jusqu'à présent:
#!/usr/bin/perl
if ([email protected][0] || [email protected][1])
{
print "Usage: converter.pl [input file] [output file] \n";
exit;
}
open FILE, "<", @ARGV[0] or die $!;
open OUTFILE, ">", @ARGV[1] or die $!;
my $line;
my $guts;
while (<FILE>) {
$line = $_ ;
$line =~ /style=\"(.+)\"/;
$guts = $1;
$guts =~ /([a-zA-Z]+)\:([a-zA-Z0-9]+)\;/;
$name = $1;
$value = $2;
$guts = $name."=".$value;
$line =~ s/style=\"(.+)\"/$guts/g;
print OUTFILE $line ;
}
exit;
Note: Ce n'est pas devoirs, et non je ne vous demande pas de faire mon travail pour moi, ce serait finir par être un outil interne cela a accéléré le processus de formatage de notre HTML entrant pour fonctionner correctement dans le convertisseur PDF que nous avons.
MISE À JOUR
Pour les personnes intéressées, je me suis une version initiale de travail. Celui-ci ne remplace que la largeur et la hauteur, l'attribut de bordure que nous sommes en train de scrapper pour le moment. Mais si quelqu'un voulait voir comment nous l'avons fait, un coup d'oeil ...
#!/usr/bin/perl
## NOTES ##
# This script was made to simply replace style attributes with their name/value pair equivalents as attributes.
# It was designed to replace width and height attributes on a metric buttload of table elements from client data we got.
# As such, it's not really designed to handle more than that, and only strips the unit "PX" from the values.
# All of these can be modified in the second foreach loop, which checks for height and width.
if ([email protected][0] || [email protected][1])
{
print "Usage: quickvert.pl [input file] [output file] \n";
exit;
}
open FILE, "<", @ARGV[0] or die $!;
open OUTFILE, ">", @ARGV[1] or die $!;
my $line;
my $guts;
my $count = 1;
while (<FILE>) {
$line = $_ ;
my (@match) = $line =~ /style=\"(.+?)\"/g;
my $guts;
my $newguts;
foreach (@match) {
#print $_ ."\n";
$guts = $_;
$guts =~ /([a-zA-Z]+)\:([a-zA-Z0-9]+)\;/;
$newguts = "";
foreach my $style (split(/;/,$guts)) {
my ($name, $value) = split(/:/,$style);
$value =~ s/px//g;
if ($name =~ m/height/g || $name =~ m/width/g) {
$newguts .= "$name='$value' ";
} else {
$newguts .= "";
}
}
#print "replacing $guts with $newguts on line $count \n";
$line =~ s/style=\"$guts\"/$newguts/i;
}
#print $newguts;
print OUTFILE $line ;
$count++;
}
exit;
Pas exactement la même chose mais http://stackoverflow.com/questions/1271438/how-can-i-merge-css-definitions-in-files-into-inline-style-attributes-using-per/1271680 # 1271680 pourrait vous donner quelques idées. –