]> git.tdb.fi Git - libs/datafile.git/blobdiff - tool/compiler.cpp
Use C++11 features to manipulate containers
[libs/datafile.git] / tool / compiler.cpp
index 8725bea3e90c9c2eff8e3e85f21212220e26115c..8360ee6ce35931b52f5867bfb75ffdddeb713df1 100644 (file)
@@ -45,6 +45,14 @@ bool Compiler::process_statement(const FS::Path &fn, DataFile::Statement &st)
        if(st.keyword=="_content")
                return true;
 
+       if(st.keyword=="_extension")
+       {
+               string ext = FS::extpart(FS::basename(fn));
+               if(ext.empty() || ext.size()==1)
+                       throw invalid_argument("Compiler::process_statement");
+               st.keyword = ext.substr(1);
+       }
+
        for(vector<DataFile::Value>::iterator i = st.args.begin(); i!=st.args.end(); ++i)
                if(i->get_signature()==DataFile::StringType::signature)
                {
@@ -151,21 +159,22 @@ ForEach::ForEach(Compiler &c, const FS::Path &b, const list<string> &p):
 {
        add("exclude", &ForEach::exclude);
        add("pattern", &ForEach::pattern);
+       add("wrap",    &ForEach::wrap);
+       add("wrap",    &ForEach::wrap_keyword);
        add("write",   &ForEach::write);
 }
 
 void ForEach::finish()
 {
-       list<string> files = FS::list_files(base);
-       for(list<string>::iterator i = files.begin(); i!=files.end(); ++i)
+       for(const string &f: FS::list_files(base))
        {
                bool match = false;
                for(list<string>::const_iterator j = patterns.begin(); (j!=patterns.end() && !match); ++j)
-                       match = Regex(*j).match(*i);
+                       match = Regex(*j).match(f);
                for(list<string>::const_iterator j = excludes.begin(); (j!=excludes.end() && match); ++j)
-                       match = !Regex(*j).match(*i);
+                       match = !Regex(*j).match(f);
                if(match)
-                       compiler.process_file(base / *i, write_st);
+                       compiler.process_file(base/f, write_st);
        }
 }
 
@@ -179,6 +188,19 @@ void ForEach::pattern(const string &p)
        patterns.push_back(p);
 }
 
+void ForEach::wrap()
+{
+       wrap_keyword("_extension");
+}
+
+void ForEach::wrap_keyword(const string &kwd)
+{
+       DataFile::Statement st(kwd);
+       st.append("$filename");
+       st.sub.push_back(DataFile::Statement("_content"));
+       write_st.push_back(st);
+}
+
 void ForEach::write(const DataFile::Statement &st)
 {
        write_st.insert(write_st.end(), st.sub.begin(), st.sub.end());