Merge branch 'master' of gitlab.odin.cse.buffalo.edu:odin-lab/Website

This commit is contained in:
Oliver Kennedy 2016-09-22 14:58:34 -04:00
commit 12f98e057c
9 changed files with 432 additions and 352 deletions

4
.gitignore vendored
View file

@ -2,4 +2,6 @@ build
.DS_Store
*.aux
*.log
artifacts
artifacts
*.pdf
*.tex

View file

@ -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
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

View file

@ -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",

View file

@ -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" },

View file

@ -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",

694
lib/cv.rb
View file

@ -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

View file

@ -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

View file

@ -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

Binary file not shown.