diff --git a/.gitignore b/.gitignore index 176357d2..561e8b8f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ build .DS_Store *.aux *.log -artifacts \ No newline at end of file +artifacts +*.pdf +*.tex \ No newline at end of file diff --git a/Rakefile b/Rakefile index 6b18f329..9cfdee3b 100644 --- a/Rakefile +++ b/Rakefile @@ -148,4 +148,33 @@ task :documents => ["artifacts/db.json", :cv, :cnp] directory "build/artifacts" task :deploy => [:documents,:odin_lab,"build/artifacts"] do system("cp -r artifacts/*.{pdf,json} build/artifacts/") -end \ No newline at end of file +end + +###################### Specialized Stuff for Individual Use ###################### + +file "okennedy_short.tex" => (["db/cv/okennedy.json", "lib/cv.rb", "Rakefile"]+Dir["db/cv/okennedy/**"]) do + File.open("okennedy_short.tex", "w+") do |fh| + CV.make("okennedy", fh, + title: "Recent Activities", + since: { + education: 2008, + reviewer: 2015, + general_service: 2015, + volunteering: 2015, + talks: 2015, + courses: 2015, + publications: 2014 + }, + skip: [ + :employment, + :memberships, + :dept_service, + :tech_reports + ] + ) + end +end +file "okennedy_short.pdf" => "okennedy_short.tex" do + system("pdflatex okennedy_short.tex") +end + diff --git a/db/cv/okennedy.json b/db/cv/okennedy.json index c818a0f0..b9682321 100644 --- a/db/cv/okennedy.json +++ b/db/cv/okennedy.json @@ -101,7 +101,10 @@ } ], "honors" : [ - "The pVLDB 2012 paper titled \"DBToaster: Higher-order Delta Processing for Dynamic, Frequently Fresh Views\" was accepted to the \"Best of VLDB 2012\" issue of the VLDB Journal" + { "description" : + "The pVLDB 2012 paper titled \"DBToaster: Higher-order Delta Processing for Dynamic, Frequently Fresh Views\" was accepted to the \"Best of VLDB 2012\" issue of the VLDB Journal", + "year" : 2012 + } ], "reviewer" : [ { "venue" : "VLDBJ", "years" : [ 2013 ] }, @@ -165,8 +168,14 @@ { "code" : "CSE 562", "title" : "Graduate Database Systems (planned)", "semester" : "Spring 2017" }, + { "code" : "CSE 199", + "title" : "Undergraduate CS Seminar (Recitation)", + "semester" : "Fall 2016" }, + { "code" : "CSE 705", + "title" : "Database Research Seminar", + "semester" : "Fall 2016" }, { "code" : "CSE 662", - "title" : "Languages and Runtimes for Big Data (planned)", + "title" : "Languages and Runtimes for Big Data", "semester" : "Fall 2016" }, { "code" : "CSE 462", "title" : "Undergraduate Database Systems", diff --git a/db/cv/okennedy/talks.json b/db/cv/okennedy/talks.json index 35e82f11..90f3dd9e 100644 --- a/db/cv/okennedy/talks.json +++ b/db/cv/okennedy/talks.json @@ -1,7 +1,11 @@ [ + { "talk" : "TBD", "date" : "Oct. 2016", + "venue" : "Airbus" }, + { "talk" : "TBD", "date" : "Oct. 2016", + "venue" : "RIT" }, { "talk" : "Just-In-Time Data Structures", "date" : "Jun. 2016", "venue" : "LogicBlox" }, - { "talk" : "Embracing Uncertainty with Mimir", "date" : "May 2016", + { "talk" : "Embracing Uncertainty with Mimir", "date" : "May. 2016", "venue" : "NYU" }, { "talk" : "Embracing Uncertainty with Mimir", "date" : "Mar. 2016", "venue" : "HPE/Vertica" }, diff --git a/db/lab.json b/db/lab.json index a198f139..ea291f0f 100644 --- a/db/lab.json +++ b/db/lab.json @@ -34,11 +34,6 @@ "projects" : ["mimir"], "ubit" : "poonamku" }, - "Patrick Coonan" : { - "status" : "BS/MS", - "projects" : ["insider-threats"], - "ubit" : "pcoonan" - }, "William Spoth" : { "status" : "PhD", "projects" : ["mimir"], @@ -73,10 +68,6 @@ "advisor" : ["Luke Ziarek", "Geoff Challen"], "joint_advisor": true }, - "Michael Kulbacki" : { - "status" : "BS", - "projects" : ["mimir"] - }, "Jacob Varghese" : { "status" : "BS", "projects" : ["mimir"] @@ -86,6 +77,17 @@ "projects" : ["mimir"] } }, + "temp-leave" : { + "Michael Kulbacki" : { + "status" : "BS", + "projects" : ["mimir"] + }, + "Patrick Coonan" : { + "status" : "BS/MS", + "projects" : ["insider-threats"], + "ubit" : "pcoonan" + } + }, "collaborators" : [ "Lukasz Ziarek", "Geoff Challen", diff --git a/lib/cv.rb b/lib/cv.rb index 5c2b1db8..ac310658 100644 --- a/lib/cv.rb +++ b/lib/cv.rb @@ -36,14 +36,19 @@ class CV < Latex::Builder @who = who @include_rejected_grants = options.fetch(:include_rejected_grants, false) @include_pending_papers = options.fetch(:include_pending_papers, false) + @title = options.fetch(:title, "Curriculum Vitae") + @since = Hash.new { |h,k| if h.has_key? :rest then h[:rest] else 0 end } + options[:since].each { |k, v| @since[k] = v } if options.has_key?(:since) + @skip = options.fetch(:skip, []) + gen end - def CV.make(who, out) - CV.new(who, out) + def CV.make(who, out, options = {}) + CV.new(who, out, options) end - def my_section(title) + def make_section(title) section!(title) print_direct "~" endl("-0.4in") @@ -60,6 +65,7 @@ class CV < Latex::Builder documentclass("11pt", "article") usepackage "fullpage" usepackage "bibentry" + usepackage "enumitem" document do pagestyle "empty" @@ -70,23 +76,38 @@ class CV < Latex::Builder render_contact_details vspace! "-0.1in" - render_education - render_employment_history - render_honors - render_professional_activities - render_invited_talks - render_courses_taught - render_grant_support - render_pubs_and_artifacts + render_education unless skip?(:education) + render_employment_history unless skip?(:employment) + render_honors unless skip?(:honors) + render_professional_activities unless skip?(:service) + render_invited_talks unless skip?(:invited_talks) + render_courses_taught unless skip?(:courses) + render_grant_support unless skip?(:grants) + render_pubs_and_artifacts unless skip?(:pubs) end end + def filter_records(category, records) + records.select { |record| + duration_is_since?(record, @since[category]) + } + end + + def build_filtered_itemize(category, records, *args) + args.unshift(filter_records(category, records)) + build_itemize(*args) { |record| yield record } + end + + def skip?(category) + @skip.include? category + end + ############### HEADER ################ def render_header noindent - textbf { huge; puts "Curriculum Vitae" } + textbf { huge; puts @title } hfill textbf { huge; puts @data["name"] } vspace "0.05in" @@ -128,8 +149,8 @@ class CV < Latex::Builder ############### EDUCATION ################ def render_education - my_section("Education") - build_itemize(@data["education"]) do |r| + make_section("Education") + build_filtered_itemize(:education, @data["education"], "label=,leftmargin=0mm") do |r| textit { puts "#{r["degree"]}," } puts "#{r["university"]}, #{r["city"]}" hfill @@ -150,17 +171,9 @@ class CV < Latex::Builder ############### EMPLOYMENT HISTORY ################ - def render_employment_history(args = {}) - employment = @data["employment"]; - - if args.has_key?(:since) then - since = args[:since] - employment = - employment.select { |r| duration_is_since?(r, since) } - end - - my_section("Employment History") - build_itemize(employment) do |r| + def render_employment_history + make_section("Employment History") + build_filtered_itemize(:employment, @data["employment"]) do |r| puts "#{r["title"]}, #{r["employer"]}" hfill puts duration(r) @@ -170,15 +183,15 @@ class CV < Latex::Builder ############### HONORS ################ def render_honors - my_section("Honors") - build_itemize(@data["honors"]) do |r| - puts r + make_section("Honors") + build_filtered_itemize(:honors, @data["honors"], "label=,leftmargin=0mm") do |r| + puts r["description"] end end ############### PROFESSIONAL ACTIVITIES ################ - def render_one_activity_class(data, role_title) + def render_one_activity_class(activity_class, data, role_title) role_title = case role_title when Proc then role_title @@ -186,12 +199,12 @@ class CV < Latex::Builder orig_role_title = role_title lambda { |r| r[orig_role_title] } end - build_itemize(data) do |r| + build_filtered_itemize(activity_class, data, "noitemsep,leftmargin=5mm,label=--") do |r| puts(role_title.call(r)) hfill puts duration(r) unless r["roles"].nil? - build_itemize(r["roles"]) do |role| + build_itemize(r["roles"], "noitemsep") do |role| puts role["title"] hfill puts duration(role) @@ -201,44 +214,47 @@ class CV < Latex::Builder end def render_professional_activities(args = {}) - my_section("Professional Activities") + make_section("Professional Activities") - subsection!("Reviewer / Program Comittee Member") - render_one_activity_class(@data["reviewer"], - lambda { |r| - venue = LabMetadata.complete_venue(r)["type"] - raise "Unknown Venue: #{r}" unless venue; - "#{venue.capitalize}: #{LabMetadata.venue_name(r)}" - }) + unless skip? :reviewer + subsection!("Reviewer / Program Comittee Member") + render_one_activity_class(:reviewer, @data["reviewer"], + lambda { |r| + venue = LabMetadata.complete_venue(r)["type"] + raise "Unknown Venue: #{r}" unless venue; + "#{venue.capitalize}: #{LabMetadata.venue_name(r)}" + }) + end - subsection!("Service") - render_one_activity_class(@data["service"]["general"], "description") + unless skip? :general_service + subsection!("Service") + render_one_activity_class(:general_service, @data["service"]["general"], "description") + end - subsection!("Professional Memberships") - render_one_activity_class(@data["memberships"], "org") + unless skip? :memberships + subsection!("Professional Memberships") + render_one_activity_class(:memberships, @data["memberships"], "org") + end - subsection!("Volunteer Work") - render_one_activity_class(@data["volunteering"], "org") + unless skip? :volunteering + subsection!("Volunteer Work") + render_one_activity_class(:volunteering, @data["volunteering"], "org") + end - subsection!("Departmental Service") - build_itemize(@data["service"]["dept"]) do |dept| - puts dept["org"] - render_one_activity_class(dept["service"], "org") + unless skip? :dept_service + subsection!("Departmental Service") + build_itemize(@data["service"]["dept"]) do |dept| + puts dept["org"] + render_one_activity_class(:dept_service, dept["service"], "org") + end end end ############### INVITED TALKS ################ - def render_invited_talks(args = {}) - talks = @data["talks"] - - if args.has_key? :since - since = args[:since] - talks = talks.select { |r| date_to_time(r["date"]).year >= since } - end - - my_section("Invited Talks") - build_itemize(talks) do |r| + def render_invited_talks + make_section("Invited Talks") + build_filtered_itemize(:talks, @data["talks"], "noitemsep,leftmargin=5mm,label=--") do |r| textit { puts r["venue"] } wrap { small @@ -253,28 +269,26 @@ class CV < Latex::Builder ############### COURSES ################ - def render_courses_taught(args = {}) - my_section("Courses") + def render_courses_taught + make_section("Courses") courses = @data["courses"] - if args.has_key? :since - since = args[:since] - courses = courses.map do |dept| - dept = dept.clone - dept["courses"] = dept["courses"].select do |c| - unless /([0-9]{4})/ =~ c["semester"] - raise "Invalid Semester: '#{c["semester"]}'" - end - $1.to_i >= since + since = @since[:courses] + courses = courses.map do |dept| + dept = dept.clone + dept["courses"] = dept["courses"].select do |c| + unless /([0-9]{4})/ =~ c["semester"] + raise "Invalid Semester: '#{c["semester"]}'" end - dept unless dept["courses"].empty? - end.compact - end + $1.to_i >= since + end + dept unless dept["courses"].empty? + end.compact - build_itemize(courses) do |dept| + build_itemize(courses, "leftmargin=1mm,label=") do |dept| puts dept["venue"] - build_itemize(dept["courses"]) do |r| + build_itemize(dept["courses"], "noitemsep,leftmargin=7mm") do |r| texttt { puts r["code"] } puts ":" wrap { @@ -292,21 +306,18 @@ class CV < Latex::Builder ############### GRANT SUPPORT ################ def render_grant_support(args = {}) - my_section("Grant Support") + make_section("Grant Support") - test_for_since = - if args.has_key? :since then - proc { |r| duration_is_since?(r, args[:since]) } - else - proc { true } - end + test_for_since = proc { |r| duration_is_since?(r, @since[:grants]) } grant_categories = [ ["Pending Applications", "submitted", ["grant", "gift"]], ["Awarded Grants", "accepted", ["grant"]], ["Gifts", "accepted", ["gift"]], - ["Completed", "completed", ["grant", "gift"]] ] + grant_categories += [ + ["Completed", "completed", ["grant", "gift"]] + ] unless skip?(:completed_grants) grant_categories += [ ["Declined", "rejected", ["grant", "gift"]] ] if args.fetch(:include_rejected, @include_rejected_grants) @@ -333,99 +344,103 @@ class CV < Latex::Builder test_for_since.call(r) }.sort { |a,b| to_date(b["start"]) <=> to_date(a["start"])} - ## Header for the category - subsection!("#{sec} (#{grants_in_category.length})") - ## For each grant in the category - grants_in_category.each do |r| - collaborative_total = 0; - supplements_total = 0 - our_total = 0; - total_awarded = 0; - award_value_is_string = true + unless grants_in_category.empty? - # Derive grant totals for collaborative grants and - # grants with supplements, as well as fractional - # amounts for us. - if r["amount"].is_a? Numeric then - collaborative_total = - if r["collaborative"].nil? then 0 else - r["collaborative"].map { |x| x["amount"].to_f }.sum - end - supplements_total = - if r["supplements"].nil? then 0 else - r["supplements"].map { |x| x["amount"].to_f }.sum - end - our_total = r["amount"].to_f + supplements_total - total_awarded = our_total + collaborative_total; - award_value_is_string = false - end + ## Header for the category + subsection!("#{sec} (#{grants_in_category.length})") - noindent + ## For each grant in the category + grants_in_category.each do |r| + collaborative_total = 0; + supplements_total = 0 + our_total = 0; + total_awarded = 0; + award_value_is_string = true - tabular("rl") do + # Derive grant totals for collaborative grants and + # grants with supplements, as well as fractional + # amounts for us. + if r["amount"].is_a? Numeric then + collaborative_total = + if r["collaborative"].nil? then 0 else + r["collaborative"].map { |x| x["amount"].to_f }.sum + end + supplements_total = + if r["supplements"].nil? then 0 else + r["supplements"].map { |x| x["amount"].to_f }.sum + end + our_total = r["amount"].to_f + supplements_total + total_awarded = our_total + collaborative_total; + award_value_is_string = false + end - # For each field being displayed - fields_to_display.each do |k| + noindent - # Only display fields if they're available - unless r[k].nil? - # Field title - textit { puts( + tabular("rl") do + + # For each field being displayed + fields_to_display.each do |k| + + # Only display fields if they're available + unless r[k].nil? + # Field title + textit { puts( + case k + when "copis" then "Co-PI".pluralize(r["copis"].length) + when "collaborative" then + "Peer Org.".pluralize(r["collaborative"].length) + else k.capitalize + end + )} + # Break + print_direct ":&" + + # Post-processing on field value case k - when "copis" then "Co-PI".pluralize(r["copis"].length) - when "collaborative" then - "Peer Org.".pluralize(r["collaborative"].length) - else k.capitalize - end - )} - # Break - print_direct ":&" - - # Post-processing on field value - case k - when "title", "agency" - parbox("5in") do - if k == "title" then textsf { puts r[k] } else puts r[k] end - end - when "effective dates" - puts duration(r) - when "copis" - puts r["copis"].join(", ") - when "amount" - unless award_value_is_string - puts format_money our_total - unless r["collaborative"].nil? - puts " (Total Across Collaboration: #{format_money total_awarded})" + when "title", "agency" + parbox("5in") do + if k == "title" then textsf { puts r[k] } else puts r[k] end end - else - puts r["amount"] - end - when "collaborative" - r["collaborative"].each do |i| - puts i["institution"] - puts "(#{format_money i["amount"]})" - end - when "supplements" - unless award_value_is_string then - puts(r["supplements"].map do |supp| - "#{supp["type"]}" - end.join(", ")) - puts "(#{"amount".pluralize(r["supplements"].length)} included in total above)" - else - puts(r["supplements"].map do |supp| - "#{supp["type"]} (#{format_money supp["amount"].to_f})" - end.join(", ")) - end - else # case k - puts r[k] - end # case k - endl - end # unless r[k].nil? - end # fields_to_display.each - end # block("tabular") (field table) - endl("0.2in") - end # grants_in_category.each + when "effective dates" + puts duration(r) + when "copis" + puts r["copis"].join(", ") + when "amount" + unless award_value_is_string + puts format_money our_total + unless r["collaborative"].nil? + puts " (Total Across Collaboration: #{format_money total_awarded})" + end + else + puts r["amount"] + end + when "collaborative" + r["collaborative"].each do |i| + puts i["institution"] + puts "(#{format_money i["amount"]})" + end + when "supplements" + unless award_value_is_string then + puts(r["supplements"].map do |supp| + "#{supp["type"]}" + end.join(", ")) + puts "(#{"amount".pluralize(r["supplements"].length)} included in total above)" + else + puts(r["supplements"].map do |supp| + "#{supp["type"]} (#{format_money supp["amount"].to_f})" + end.join(", ")) + end + else # case k + puts r[k] + end # case k + endl + end # unless r[k].nil? + end # fields_to_display.each + end # block("tabular") (field table) + endl("0.2in") + end # grants_in_category.each + end # unless grants_in_category.empty? end # grant_categories.each end @@ -523,123 +538,126 @@ class CV < Latex::Builder end def render_paper_title(title) - print_direct "``#{title}''" + print_direct "\\textsc{#{title}}" end def render_one_pub_or_artifact(title,list,fmt,filter = proc { true }) list = list.select { |r| filter.call(r) } unless list.empty? subsection!("#{title} (#{list.length})") - build_itemize(list) { |r| fmt.call(r) } + build_itemize(list, "leftmargin=0mm,label=,noitemsep") { |r| fmt.call(r) } end end def render_pubs_and_artifacts(args = {}) global_filter = - if args.has_key? :since then - since = args[:since] - proc { |r| r["year"].to_i >= since } - else - proc { true } - end + proc { |r| duration_is_since?(r, @since[:publications])} all_my_pubs = LabMetadata.publications_for(@who) - my_section("Publications and Artifacts") + make_section("Publications and Artifacts") # block("center") do # puts "(Author lists marked with a * are not correlated with level of contribution)" # end - render_one_pub_or_artifact( - "Journal Publications", - all_my_pubs.where do |r| - case get_venue_type(r) - when "journal" then true - else false - end - end, - proc do |r| - render_paper_title(r["title"]) - render_author_list(r) - puts "---" - extra_fields = - if r["volume"].nil? then [] - else ["Volume #{r["volume"]}, Number #{r["number"]}"] end + - if r["issuetitle"].nil? then [] - else [r["issuetitle"]] end - textit { - puts "#{LabMetadata.venue_name(r)} #{r["year"]}#{if extra_fields.length > 0 then " (#{extra_fields.join("; ")}), " else ", " end}" - } - puts "#{get_pub_length_string(r)}, " - puts render_selectivity(r) - end, - global_filter - ) + unless skip?(:journal_pubs) + render_one_pub_or_artifact( + "Journal Publications", + all_my_pubs.where do |r| + case get_venue_type(r) + when "journal" then true + else false + end + end, + proc do |r| + render_paper_title(r["title"]) + render_author_list(r) + puts "---" + extra_fields = + if r["volume"].nil? then [] + else ["Volume #{r["volume"]}, Number #{r["number"]}"] end + + if r["issuetitle"].nil? then [] + else [r["issuetitle"]] end + textit { + puts "#{LabMetadata.venue_name(r)} #{r["year"]}#{if extra_fields.length > 0 then " (#{extra_fields.join("; ")}), " else ", " end}" + } + puts "#{get_pub_length_string(r)}, " + puts render_selectivity(r) + end, + global_filter + ) + end - render_one_pub_or_artifact( - "Conference Publications", - all_my_pubs.where do |r| - case get_venue_type(r) - when "conference" then true - else false - end - end, - proc do |r| - render_paper_title(r["title"]) - render_author_list(r) - puts "---" - textit{ puts LabMetadata.venue_name(r) } - puts "#{r["year"]}, " - puts "#{get_pub_length_string(r)}, " - puts render_selectivity(r) - end, - global_filter - ) + unless skip?(:conference_pubs) + render_one_pub_or_artifact( + "Conference Publications", + all_my_pubs.where do |r| + case get_venue_type(r) + when "conference" then true + else false + end + end, + proc do |r| + render_paper_title(r["title"]) + render_author_list(r) + puts "---" + textit{ puts LabMetadata.venue_name(r) } + puts "#{r["year"]}, " + puts "#{get_pub_length_string(r)}, " + puts render_selectivity(r) + end, + global_filter + ) + end - render_one_pub_or_artifact( - "Workshop Publications", - all_my_pubs.where do |r| - case get_venue_type(r) - when "workshop" then true - else false - end - end, - proc do |r| - render_paper_title(r["title"]) - render_author_list(r) - puts "---" - textit { puts LabMetadata.venue_name(r) } - puts "#{r["year"]}, " - puts "#{get_pub_length_string(r)}, " - puts render_selectivity(r) - end, - global_filter - ) + unless skip?(:workshop_pubs) + render_one_pub_or_artifact( + "Workshop Publications", + all_my_pubs.where do |r| + case get_venue_type(r) + when "workshop" then true + else false + end + end, + proc do |r| + render_paper_title(r["title"]) + render_author_list(r) + puts "---" + textit { puts LabMetadata.venue_name(r) } + puts "#{r["year"]}, " + puts "#{get_pub_length_string(r)}, " + puts render_selectivity(r) + end, + global_filter + ) + end - render_one_pub_or_artifact( - "Book Chapters", - all_my_pubs.where do |r| - case get_venue_type(r) - when "chapter" then true - else false - end - end, - proc do |r| - render_paper_title(r["title"]) - render_author_list(r) - puts "---" - textit { puts LabMetadata.venue_name(r) } - render_editor_list(r) - publisher = get_publisher(r) - series = r["series"] || $venues[r["venue"]]["series"] - puts "---" if publisher || series - puts "#{publisher}#{if series then ";" else "" end}" if publisher - puts series if series - textit { puts r["year"] } - puts "(#{get_pub_length_string(r)}, #{render_selectivity(r)})" - end, - global_filter - ) + unless skip?(:book_chapters) + render_one_pub_or_artifact( + "Book Chapters", + all_my_pubs.where do |r| + case get_venue_type(r) + when "chapter" then true + else false + end + end, + proc do |r| + render_paper_title(r["title"]) + render_author_list(r) + puts "---" + textit { puts LabMetadata.venue_name(r) } + render_editor_list(r) + publisher = get_publisher(r) + series = r["series"] || $venues[r["venue"]]["series"] + puts "---" if publisher || series + puts "#{publisher}#{if series then ";" else "" end}" if publisher + puts series if series + textit { puts r["year"] } + puts "(#{get_pub_length_string(r)}, #{render_selectivity(r)})" + end, + global_filter + ) + end render_one_pub_or_artifact( "Submitted Publications", @@ -655,85 +673,91 @@ class CV < Latex::Builder global_filter ) if @include_pending_papers - render_one_pub_or_artifact( - "Technical Reports", - all_my_pubs.where do |r| - case get_venue_type(r) - when "techreport" then true - else false - end - end, - proc do |r| - render_paper_title(r["title"]) - render_author_list(r) - puts "---" - textit { - puts "#{LabMetadata.venue_name(r)}#{if r["id"].nil? then "" else " ##{r["id"]}" end}, " - } - puts get_pub_length_string(r) - end, - global_filter - ) if args.fetch(:show_tech_reports, true) + unless skip?(:tech_reports) + render_one_pub_or_artifact( + "Technical Reports", + all_my_pubs.where do |r| + case get_venue_type(r) + when "techreport" then true + else false + end + end, + proc do |r| + render_paper_title(r["title"]) + render_author_list(r) + puts "---" + textit { + puts "#{LabMetadata.venue_name(r)}#{if r["id"].nil? then "" else " ##{r["id"]}" end}, " + } + puts get_pub_length_string(r) + end, + global_filter + ) + end - render_one_pub_or_artifact( - "Patents", - all_my_pubs.where do |r| - case get_venue_type(r) - when "patent" then true - else false - end - end, - proc do |r| - render_paper_title(r["title"]) - render_author_list(r) - puts "--- #{r["country"]} Patent#{if r["status"] == "granted" then "" else " Application" end} ##{r["id"]}" - end, - global_filter - ) + unless skip?(:patents) + render_one_pub_or_artifact( + "Patents", + all_my_pubs.where do |r| + case get_venue_type(r) + when "patent" then true + else false + end + end, + proc do |r| + render_paper_title(r["title"]) + render_author_list(r) + puts "--- #{r["country"]} Patent#{if r["status"] == "granted" then "" else " Application" end} ##{r["id"]}" + end, + global_filter + ) + end - render_one_pub_or_artifact( - "Artifacts", - @data["artifacts"], - proc do |r| - print_direct "\\textbf{#{safe_text r["name"]}} (#{safe_text r["class"]})" - endl - print_direct "\\textit{#{safe_text r["description"]}}" - unless r["url"].nil? + unless skip?(:artifacts) + render_one_pub_or_artifact( + "Artifacts", + @data["artifacts"], + proc do |r| + print_direct "\\textsc{#{safe_text r["name"]}} (#{safe_text r["class"]})" + unless r["released"].nil? + d = to_date(r["released"]) + hfill + puts "First released #{d.strftime("%B %Y")}" + end endl - url(r["url"]) - end - unless r["released"].nil? - d = to_date(r["released"]) - endl - puts "First released #{d.strftime("%B %Y")}" - end - unless r["metrics"].nil? - unless r["metricsasof"].nil? + print_direct "\\textit{#{safe_text r["description"]}}" + unless r["url"].nil? endl - puts "As of #{r["metricsasof"]}, #{r["name"]} had " - else - puts "#{r["name"]} has " + url(r["url"]) end - - metrics = r["metrics"].to_a.map do |m,v| - case m - when "sitevisits" then "#{safe_text v} unique website visitors" - when "downloads" then "#{safe_text v} unique downloads" - else puts "#{safe_text v} #{safe_text m}" - end - end - - case metrics.length - when 0 then raise "Empty Metrics Field for #{r["name"]}" - when 1 then puts metrics[0] - when 2 then puts metrics.join(" and ") + unless r["metrics"].nil? + unless r["metricsasof"].nil? + endl + puts "As of #{r["metricsasof"]}, #{r["name"]} had " else - metrics.push("and #{metrics.pop}") - puts metrics.join(", ") + puts "#{r["name"]} has " + end + + metrics = r["metrics"].to_a.map do |m,v| + case m + when "sitevisits" then "#{safe_text v} unique website visitors" + when "downloads" then "#{safe_text v} unique downloads" + else puts "#{safe_text v} #{safe_text m}" + end + end + + case metrics.length + when 0 then raise "Empty Metrics Field for #{r["name"]}" + when 1 then puts metrics[0] + when 2 then puts metrics.join(" and ") + else + metrics.push("and #{metrics.pop}") + puts metrics.join(", ") + end end end - end - ) if args.fetch(:show_artifacts, true) + ) if args.fetch(:show_artifacts, true) + end end end \ No newline at end of file diff --git a/lib/latex.rb b/lib/latex.rb index 036a59a9..34335420 100644 --- a/lib/latex.rb +++ b/lib/latex.rb @@ -56,7 +56,7 @@ module Latex latex_command(:smallskip) latex_command(:medskip) latex_command(:bigskip) - latex_command(:itemize , environment: true) + latex_command(:itemize , arg_optional:[true], environment: true) latex_command(:enumeate, environment: true) latex_command(:item) latex_command(:tabular, environment: true) @@ -125,9 +125,10 @@ module Latex end end - def build_itemize(array) + def build_itemize(array, *args) + if(array.length > 0) - itemize do + itemize(*args) do array.each do |r| item yield r diff --git a/lib/text.rb b/lib/text.rb index db3d3e74..71344a30 100644 --- a/lib/text.rb +++ b/lib/text.rb @@ -94,6 +94,15 @@ module Text return date_to_time(r["end"]).year >= year elsif not r["years"].nil? return r["years"].map {|y|y.to_i}.max >= year + elsif not r["year"].nil? + return r["year"].to_i >= year + elsif not r["date"].nil? + extracted_year = + case r["date"] + when /[a-z]+\. (\d\d\d\d)/ then $1 + else raise "Invalid date format: #{r["date"]}" + end + return extracted_year.to_i >= year else raise "Invalid time range : #{r}" end diff --git a/src/papers/2017/VLDB-BetaPDBs-submitted.pdf b/src/papers/2017/VLDB-BetaPDBs-submitted.pdf new file mode 100644 index 00000000..1151129c Binary files /dev/null and b/src/papers/2017/VLDB-BetaPDBs-submitted.pdf differ