2010-07-02 11 views
1

J'ai le fichier de coupe suivant pour créer une version statique de mon application sinatra, volé http://github.com/semanticart/stuff-site/blob/master/Rakefilecomment stocker le nom des fichiers imbriqués dans une variable et une boucle à travers eux en râteau

class View 
    attr_reader :permalink 
    def initialize(path) 
    filename = File.basename(path) 
    @permalink = filename[0..-6] 
    end 
end 

view_paths = Dir.glob(File.join(File.dirname(__FILE__), 'views/pages', '*.haml')) 
ALL_VIEWS = view_paths.map {|path| View.new(path) } 

task :build do 
    def dump_request_to_file url, file 
    Dir.mkdir(File.dirname(file)) unless File.directory?(File.dirname(file)) 
    File.open(file, 'w'){|f| f.print @request.get(url).body} 
    end 

    static_dir = File.join(File.dirname(__FILE__), 'public') 

    require 'sinatra' 
    require 'c4eo' 
    @request = Rack::MockRequest.new(Sinatra::Application) 

    ALL_VIEWS.each do |view| 
    puts view 
    dump_request_to_file("/#{view.permalink}", File.join(static_dir, view.permalink+'.html')) 
    end 
end 

ALL_VIEWS est maintenant un tableau contenant tous les fichiers Haml à la racine de mon répertoire 'views/pages'.

Comment puis-je modifier ALL_VIEWS et la méthode dump_request_to_file pour parcourir tous les sous-répertoires de mon répertoire views/pages?

Ma vues ressemble un peu à ceci: http://i45.tinypic.com/167unpw.gif

Si cela rend la vie beaucoup plus facile, je pouvais avoir tous mes fichiers nommés index.haml, répertoires à l'intérieur.

Merci

Répondre

2

Pour faire défiler tous subdirs, changement « vues/pages » à « vues/pages/** »

Les doubles splats dit à la recherche récursive, vous pouvez le voir dans la documentation à http://ruby-doc.org/core/classes/Dir.html#M002322


Notez que je ne l'ai pas regardé à fond à votre cas d'utilisation, mais à titre préliminaire, il semble que vous pourriez avoir du mal à générer un permalien. Quand je vérifié les résultats, je suis arrivé:

[#<View:0x1010440a0 @permalink="hound">, 
#<View:0x101044078 @permalink="index">, 
#<View:0x101044000 @permalink="hound">, 
#<View:0x101043f88 @permalink="index">, 
#<View:0x101043f10 @permalink="references">, 
#<View:0x101043e98 @permalink="do_find">, 
#<View:0x101043e20 @permalink="index">, 
#<View:0x101043da8 @permalink="README">] 

qui ont été générés à partir de ces fichiers:

["/Users/josh/deleteme/fileutilstest/views/pages/bar/cheese/rodeo/hound.haml", 
"/Users/josh/deleteme/fileutilstest/views/pages/bar/cheese/rodeo/outrageous/index.haml", 
"/Users/josh/deleteme/fileutilstest/views/pages/bar/pizza/hound.haml", 
"/Users/josh/deleteme/fileutilstest/views/pages/bar/pizza/index.haml", 
"/Users/josh/deleteme/fileutilstest/views/pages/bar/pizza/references.haml", 
"/Users/josh/deleteme/fileutilstest/views/pages/do_find.haml", 
"/Users/josh/deleteme/fileutilstest/views/pages/tutorials/index.haml", 
"/Users/josh/deleteme/fileutilstest/views/pages/tutorials/README.haml"] 

Et il vous ressemble créer le lien avec: File.join (static_dir, view.permalink + .html)

vous pouvez donc voir que dans ce cas, cela créerait trois fichiers comme static_dir/index.html

Une solution assez évidente est d'inclure e e partie relative du lien, il deviendrait

static_dir/bar/cheese/rodeo/outrageous/index.html 
static_dir/bar/pizza/index.html 
static_dir/tutorials/index.html 

EDIT: En ce qui concerne aborder la façon de trouver l'URL relative, cela semble fonctionner

class View 
    attr_reader :permalink 
    def initialize(root_path , path) 
    root_path = File.expand_path(root_path).sub(/\/?$/,'/') 
    path  = File.expand_path path 
    filename = path.gsub root_path , String.new 
    raise "#{path} does not appear to be a subdir of #{root_path}" unless root_path + filename == path 
    @permalink = filename[0..-6] 
    end 
end 


view_paths = Dir.glob(File.join(File.dirname(__FILE__), 'views/pages/**', '*.haml')) 
ALL_VIEWS = view_paths.map { |path| View.new 'views/pages' , path } 

require 'pp' 
pp ALL_VIEWS 

Je suis pas tout ce qui tient à la chose [0 ..- 6], cela ne fonctionne que si vous savez que votre fichier a un suffixe et qu'il a cinq caractères. Mais je vais le laisser tranquille puisque je ne sais pas vraiment comment vous voudriez gérer les différentes situations futures que je pourrais anticiper (c'est-à-dire générer un code html depuis le haml et le servir, maintenant vous avez deux fichiers index.html et index.haml, qui, après avoir supprimé leurs extensions, sont à la fois index ou styles.css qui perd une partie de son nom de fichier lorsque vous essayez de retirer son extension en tirant [0 ..- 6]

+0

Merci pour cela, des idées comment je pourrais produire la partie relative du lien? –

+1

Ajouté un exemple de la façon d'adresser le chemin relatif –

+0

Merci d'avoir pris le temps, c'est un excellent ajout. –