tree filter_spaces (tree t, bool &spaced) { if (is_space (t) && spaced) return concat(); if (is_space (t) && !spaced) { spaced= true; return t; } spaced= false; if (is_atomic (t)) return t; tree r (L(t)); int i, n=N(t); if (is_apply (t) || is_tuple (t)) { // then arity shouldn't vary for (i=0; i<n; i++) r << filter_spaces (t[i], spaced); return r; } for (i=0; i<n; i++) { if (t[i] == concat() || t[i] == "") continue; if (!is_space (t[i]) || !spaced) { r << filter_spaces (t[i], spaced); if (is_space (t[i])) spaced= true; else spaced= false; } } n= N(r); if (n>0 && is_space (r[n-1])) r[n-1]= concat(); return r; }
tree collect_metadata (tree t, tree latex_class) { tree r(CONCAT); bool spaced; string s = "article"; if (is_tuple (latex_class, "\\documentclass", 1) || is_tuple (latex_class, "\\documentstyle", 1)) s = latex_verbarg_to_string (latex_class[1]); else if (is_tuple (latex_class, "\\documentclass*", 2) || is_tuple (latex_class, "\\documentstyle*", 2)) s = latex_verbarg_to_string (latex_class[2]); if (s == "acm_proc_article-sp" || s == "sig-alternate" || s == "sig-alt-full" || s == "acmart") r= collect_metadata_acm (t); else if (s == "elsarticle" || s == "elsart" || s == "ifacconf") r= collect_metadata_elsevier (t); else if (s == "amsart" || s == "amsbook" || s == "amsproc") r= collect_metadata_ams (t); else if (s == "revtex4-1") r= collect_metadata_revtex (t); else if (s == "svmono") r= collect_metadata_svmono (t); else if (s == "svjour3") r= collect_metadata_springer (t, false); else if (s == "llncs") r= collect_metadata_springer (t, true); else if (s == "IEEEconf" || s == "IEEEtran") r= collect_metadata_ieee (t); else r << collect_metadata_latex (t); r= unconcat_tmseps (r); r= filter_spaces (r, spaced); return r; }
tree collect_metadata_springer (tree t, bool llncs) { int i, n=N(t); tree u, r (CONCAT); tree doc_data (APPLY, "\\doc-data"); tree abstract_data (APPLY, "\\abstract-data"); array<tree> doc_notes, author_datas, author_affs; for (i=0; i<n; i++) { u= t[i]; if (is_tuple (u, "\\dedication", 1)) doc_notes << tree (APPLY, "\\doc-note", concat ("Dedication: ", u[1])); else if (is_tuple (u, "\\date", 1)) doc_data << tree (APPLY, "\\doc-date", u[1]); else if (is_tuple (u, "\\title", 1)) { get_springer_title_notes (u[1], doc_notes); doc_data << tree (APPLY, "\\doc-title", cstm (u[1])); } else if (is_tuple (u, "\\subtitle", 1)) { get_springer_title_notes (u[1], doc_notes); doc_data << tree (APPLY, "\\doc-subtitle", cstm (u[1])); } else if (is_tuple (u, "\\author", 1)) author_datas << get_springer_author_datas (u[1], "name", llncs); else if (!llncs && is_tuple (u, "\\institute", 1)) author_affs << get_springer_affiliation_datas (u[1]); else if (llncs && is_tuple (u, "\\institute", 1)) author_affs << get_llncs_affiliation_datas (u[1]); else if (is_tuple (u, "\\begin-abstract")) { tree abstract_text (CONCAT); i++; while (i<n && !is_tuple (t[i], "\\end-abstract")) { u= t[i]; if (is_tuple (u, "\\keywords", 1)) translate_springer_abstract_data (u, "keywords", abstract_data); else if (is_tuple (u, "\\tmmsc") || is_tuple (u, "\\tmarxiv") || is_tuple (u, "\\tmacm") || is_tuple (u, "\\tmpacs")) abstract_data << collect_abstract_data (u); else abstract_text << u; i++; } abstract_data << tree (APPLY, "\\abstract", abstract_text); } else if (is_tuple (u, "\\keywords", 1)) translate_springer_abstract_data (u, "keywords", abstract_data); else if (is_tuple (u, "\\subclass", 1)) translate_springer_abstract_data (u, "msc", abstract_data); else if (is_tuple (u, "\\PACS", 1)) translate_springer_abstract_data (u, "pacs", abstract_data); else if (is_tuple (u, "\\CRclass", 1)) translate_springer_abstract_data (u, "acm", abstract_data); else if (is_tuple (u, "\\tmarxiv")) abstract_data << collect_abstract_data (u); } bool spaced= false; if (llncs) { author_datas= merge_llncs_author_datas (author_datas, author_affs); } else { author_datas << author_affs; author_datas= filter_spaces (author_datas, spaced); author_datas= merge_springer_author_datas (author_datas); } for (int j=0; j<N(author_datas); j++) author_datas[j]= tree (APPLY, "\\doc-author", author_datas[j]); if (N(author_datas) > 0) doc_data << author_datas; if (N(doc_notes) > 0) doc_data << doc_notes; if (N(doc_data) > 1) r << doc_data << "\n"; if (N(abstract_data) > 1) r << abstract_data << "\n"; return r; }
array<tree> filter_spaces (array<tree> a, bool &spaced) { for (int i=0; i<N(a); i++) a[i]= filter_spaces (a[i], spaced); return a; }