JeuWeb - Crée ton jeu par navigateur
Nokogiri - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Nokogiri (/showthread.php?tid=1594)



Nokogiri - Plume - 06-10-2010

Nokogiri est un parser HTML, XML, SAX et patati et patata… Il offre la possibilité de faire des recherches dans des documents grâce aux sélecteurs CSS3 ou grâce à XPATH.

J'en ai besoin pour extraire les Paths des territoires de la carte du monde en SVG ( http://upload.wikimedia.org/wikipedia/commons/b/b7/World98.svg ).

Citation :Les procédures indiquées sont effectuées sous Mac OS X. Vous vous débrouillez pour les adapter.

Pour installer Nokigiri, il faut que vous ayez les librairies libxml2 et libxslt d'installées.

Citation :J'utilise HomeBrew ( http://mxcl.github.com/homebrew/ ) comme gestionnaire de paquets. Vous savez, le truc d'élite que Sephinou a partagé ( http://www.jeuweb.org/showthread.php?tid=6844 ). Comme quoi, j'invente rien ! Vous pouvez utiliser tout autre gestionnaire de paquets mais vous vous débrouillez pour adapter les commandes qui suivront.

Installer libxml2 sera facile :
Code :
$ sudo brew install libxml2

Installer libxslt sera plus chiant. C'est d'ailleurs un des points qui m'amène à écrire ces lignes. Suivez le guide :
Code :
$ brew create ftp://xmlsoft.org/libxml2/libxslt-1.1.26.tar.gz

Citation :Si vous trouvez une version plus récente, faites vous plaisir.

Normalement, votre éditeur de texte préféré s'ouvre. En tout cas, moi ça le fait. Si c'est pas le cas, c'pas complexe. Entrez la commande suivante :
Code :
$ brew edit libxslt

Si ça le fait toujours pas (genre, vous n'avez pas d'éditeur de texte par défaut), c'est que vous êtes nazes et j'peux pas grand chose pour vous. Mais j'vous aide quand même pour avancer. Débrouillez vous comme vous pourrez mais vous devrez éditer le fichier /usr/local/Library/Formula/libxslt.rb.
J'espère pour vous que vous avez pas touché la configuration par défaut sinon vous êtes vraiment seuls…

Pour en finir, videz le contenu et enregistrez le contenu suivant :

require 'formula'

class Libxslt <Formula
url 'ftp://xmlsoft.org/libxml2/libxslt-1.1.26.tar.gz'
homepage 'http://xmlsoft.org/XSLT/'
md5 'e61d0364a30146aaa3001296f853b2b9'

depends_on 'libxml2'

def install
system "./configure", "--prefix=#{prefix}", "--disable-dependency-tracking"
system "make"
system "make install"
end
end
Citation :Alors, évidemment, si vous avez une version différente, soyez malin et faites le nécessaire pour ne pas bêtement copier/coller…

Vous sauvegardez, vous dégagez et vous entrez la ligne de commande suivante :
Code :
sudo brew install libxslt

Voilà! Maintenant, je vous laisse. J'dois encore écrire le script qui va me faire le boulot pour ma carte et je reviendrai vers vous.

Citation :Si jamais quelqu'un a déjà eut le loisir d'utiliser Nokogiri, je suis friand d'informations Smile

Des questions ?

@tchaOo° & à la prochaine!


RE: Nokogiri - Plume - 07-10-2010

Hmmm…

J'viens de me rendre compte que j'ai oublié le plus important dans l'installation de Nokogiri. Installer Nokogiri…

Dans mon post précédent, j'ai juste montré comment installé les pré-requis pour installer Nokogiri. Il faut donc finir en tapant la commande :
Code :
sudo gem install nokogiri



RE: Nokogiri - Sephi-Chan - 07-10-2010

Attention, si vous utilisez RVM (si vous êtes sur Mac ou Linux, ça devrait toujours être le cas), pas de sudo ! Smile


Sephi-Chan


RE: Nokogiri - Plume - 07-10-2010

En ce qui me concerne, le sudo ne pose aucun problème. Je rencontre parfois même des problèmes sans le sudo pour l'installation des gems. Et pourtant, j'utilise RVM.


RE: Nokogiri - Sephi-Chan - 07-10-2010

Si tu fais sudo, la gem est installée de manière globale plutôt que dans ton home. Wink


Sephi-Chan


RE: Nokogiri - Plume - 08-10-2010

Voilà la source pour faire le boulot demandé.

Pour traiter 20Mo de données, ça prend 1 seconde :
Code :
$ time ruby extract_path_from_svg.rb
Extraction started...

real    0m1.023s
user    0m0.857s
sys    0m0.137s

Je détaillerai les sources dans le wiki et préviendrai quand ce sera fait Smile


#!/usr/bin/env ruby
require 'nokogiri'

if __FILE__ == $0

@doc = Nokogiri::XML(File.open("World_Map.svg"))

puts "Extraction started..."

@flights = [
{
:name => 'Kwala',
:color => '#898123',
:id => 24
},
{
:name => 'Bouh',
:color => '#156783',
:id => 25
},
{
:name => 'Victeam',
:color => '#FEFEDE',
:id => 26
},
{
:name => 'Teamon & Pumba',
:color => '#edafce',
:id => 27
}
]
@territory_id = 0
@percentages = [16, 20, 35, 29]

@data_file = File.open('data.js', 'w')
@data_file.write 'var territories = [' + "\n"

@i = 0
@territories_names = @doc.search('d')
@doc.search("path").each do |path|
@territory_id = @territory_id + 1
@percentages.sort_by {rand}

@data_file.write "{\n"
@data_file.write '"id": ' + @territory_id.to_s + ",\n"
@data_file.write '"path": "' + path.attributes['d'].value + '"' + ",\n"

if !@territories_names[@territory_id - 1].nil?
@data_file.write '"name": ' + @territories_names[@territory_id - 1].attributes['id'].value + ",\n"
end

@data_file.write '"owning_informations": [' + "\n"
@data_file.write '{ "owning_percentage": ' + @percentages[0].to_s + ', "flight": {"id": ' + @flights[0][:id].to_s + ', "name": "' + @flights[0][:name] + '", "color": "' + @flights[0][:color] + '"}},' + "\n"
@data_file.write '{ "owning_percentage": ' + @percentages[1].to_s + ', "flight": {"id": ' + @flights[1][:id].to_s + ', "name": "' + @flights[1][:name] + '", "color": "' + @flights[1][:color] + '"}},' + "\n"
@data_file.write '{ "owning_percentage": ' + @percentages[2].to_s + ', "flight": {"id": ' + @flights[2][:id].to_s + ', "name": "' + @flights[2][:name] + '", "color": "' + @flights[2][:color] + '"}},' + "\n"
@data_file.write '{ "owning_percentage": ' + @percentages[3].to_s + ', "flight": {"id": ' + @flights[3][:id].to_s + ', "name": "' + @flights[3][:name] + '", "color": "' + @flights[3][:color] + '"}}' + "\n"
@data_file.write "]\n"
@data_file.write "},\n"
end

@data_file.write ']'
@data_file.close

end



RE: Nokogiri - Plume - 08-10-2010

Je l'ai réécrite, c'est plus intéressant comme ça :

#!/usr/bin/env ruby
require 'active_support'
require 'nokogiri'
require 'json'

if __FILE__ == $0

@doc = Nokogiri::XML(File.open("World_Map.svg"))

puts "Extraction started..."

@flights = [
{
:name => 'Kwala',
:color => '#898123',
:id => 24
},
{
:name => 'Bouh',
:color => '#156783',
:id => 25
},
{
:name => 'Victeam',
:color => '#FEFEDE',
:id => 26
},
{
:name => 'Teamon & Pumba',
:color => '#edafce',
:id => 27
}
]
@territory_id = 1
@percentages = [16, 20, 35, 29]

File.open('data.js', 'w') do |f|

@territories = []
@territories_names = @doc.search('d')

@doc.search('path').each_with_index do |path, i|

@percentages.sort_by {rand}
territory = {
:id => @territory_id,
:name => @territories_names[@territory_id - 1] && @territories_names[@territory_id - 1].attributes['id'].value,
:path => path.attributes['d'].value,
:owning_informations => []
}

@flights.each do |flight|

territory[:owning_informations] << {
:owning_percentage => @percentages[i % 4],
:flight => flight
}
end

@territories << territory
@territory_id += 1
end

f.write JSON.dump(@territories)
end

end

Merci à Sephi pour ses conseils Smile
J'ai corrigé le dernier script. J'm'étais un peu chier dessus en fait.