Browse Source

Merge https://github.com/gcushen/hugo-academic

Pull update from upstream.
Xi Ruoyao 6 years ago
parent
commit
858997033a
73 changed files with 1448 additions and 802 deletions
  1. 3 3
      README.md
  2. 0 1
      archetypes/project/index.md
  3. 2 2
      archetypes/publication/index.md
  4. 3 2
      archetypes/talk/index.md
  5. 52 2
      assets/js/academic.js
  6. 1 1
      data/academic.toml
  7. 2 2
      data/assets.toml
  8. 1 0
      data/i18n/languages.yaml
  9. 1 1
      data/themes/dark.toml
  10. 1 1
      demo.sh
  11. 0 365
      exampleSite/config.toml
  12. 62 0
      exampleSite/config/_default/config.toml
  13. 19 0
      exampleSite/config/_default/languages.toml
  14. 41 0
      exampleSite/config/_default/menus.toml
  15. 170 0
      exampleSite/config/_default/params.toml
  16. 93 0
      exampleSite/content/author/admin/_index.md
  17. 0 0
      exampleSite/content/author/admin/avatar.jpg
  18. 7 34
      exampleSite/content/home/about.md
  19. 46 0
      exampleSite/content/home/accomplishments.md
  20. 9 12
      exampleSite/content/home/posts.md
  21. 2 2
      exampleSite/content/home/publications.md
  22. 4 4
      exampleSite/content/home/publications_featured.md
  23. 2 2
      exampleSite/content/home/talks.md
  24. 3 3
      exampleSite/content/home/talks_featured.md
  25. 4 4
      exampleSite/content/post/getting-started/index.md
  26. 1 0
      exampleSite/content/privacy.md
  27. 3 3
      exampleSite/content/publication/clothing-search/index.md
  28. 2 2
      exampleSite/content/publication/person-re-id/index.md
  29. 3 2
      exampleSite/content/talk/example/index.md
  30. 20 3
      i18n/de.yaml
  31. 29 0
      i18n/en.yaml
  32. 47 3
      i18n/es.yaml
  33. 47 3
      i18n/fr.yaml
  34. 204 0
      i18n/hu.yaml
  35. 14 12
      layouts/_default/single.html
  36. 29 0
      layouts/author/list.html
  37. 3 2
      layouts/index.json
  38. 112 24
      layouts/partials/css/academic.css
  39. 23 5
      layouts/partials/css/parse_theme.css
  40. 12 6
      layouts/partials/footer.html
  41. 43 14
      layouts/partials/header.html
  42. 9 2
      layouts/partials/navbar.html
  43. 27 13
      layouts/partials/page_author.html
  44. 2 2
      layouts/partials/page_header.html
  45. 50 34
      layouts/partials/page_links.html
  46. 21 14
      layouts/partials/page_metadata.html
  47. 1 1
      layouts/partials/project_li_showcase.html
  48. 1 0
      layouts/partials/pub_types.html
  49. 1 1
      layouts/partials/publication_li_stream.html
  50. 1 1
      layouts/partials/search.html
  51. 1 1
      layouts/partials/talk_li_detailed.html
  52. 1 1
      layouts/partials/talk_li_simple.html
  53. 1 1
      layouts/partials/talk_li_stream.html
  54. 32 22
      layouts/partials/widgets/about.html
  55. 53 0
      layouts/partials/widgets/accomplishments.html
  56. 26 34
      layouts/partials/widgets/contact.html
  57. 2 2
      layouts/partials/widgets/experience.html
  58. 1 1
      layouts/partials/widgets/hero.html
  59. 1 1
      layouts/partials/widgets/hero_carousel.html
  60. 24 70
      layouts/partials/widgets/posts.html
  61. 2 2
      layouts/partials/widgets/publications.html
  62. 3 3
      layouts/partials/widgets/publications_featured.html
  63. 3 3
      layouts/partials/widgets/talks.html
  64. 2 2
      layouts/partials/widgets/talks_featured.html
  65. 40 52
      layouts/project/single.html
  66. 3 15
      layouts/publication/single.html
  67. 3 1
      layouts/section/publication.html
  68. 3 1
      layouts/shortcodes/alert.html
  69. 1 1
      layouts/talk/single.html
  70. 12 0
      netlify.toml
  71. BIN
      static/img/icon-192.png
  72. BIN
      static/img/icon.png
  73. 1 1
      theme.toml

+ 3 - 3
README.md

@@ -4,7 +4,7 @@
 
 **Academic** makes it easy to create a beautiful website for free using Markdown. Customize anything on your site with widgets, themes, and language packs.
 
-Follow our easy [step by step guide](https://sourcethemes.com/academic/docs/install/) to learn how to build your own free website with Academic. [Check out the personal demo](https://themes.gohugo.io/theme/academic/) or the [business demo](https://sourcethemes.com/academic/) of what you'll get in less than 10 minutes.
+Follow our easy [step by step guide](https://sourcethemes.com/academic/docs/install/) to learn how to build your own free website with Academic. [Check out the personal demo](https://academic-demo.netlify.com/) or the [business demo](https://sourcethemes.com/academic/) of what you'll get in less than 10 minutes.
 
 - [View the documentation](https://sourcethemes.com/academic/docs/)
 - [Ask a question](http://discuss.gohugo.io/)
@@ -60,7 +60,7 @@ You can choose from one of the following four methods to install:
 1. [Install Academic with Netlify](https://app.netlify.com/start/deploy?repository=https://github.com/sourcethemes/academic-kickstart)
     * Netlify will provide you with a customizable URL to access your new site
 2. On GitHub, go to your newly created `academic-kickstart` repository and edit `config.toml` to personalize your site. Shortly after saving the file, your site will automatically update
-3. Read the [Quick Start Guide](https://sourcethemes.com/academic/docs/) to learn how to add Markdown content. For inspiration, refer to the [Markdown content](https://github.com/gcushen/hugo-academic/tree/master/exampleSite) which powers the [Demo](https://themes.gohugo.io/theme/academic/)
+3. Read the [Quick Start Guide](https://sourcethemes.com/academic/docs/) to learn how to add Markdown content. For inspiration, refer to the [Markdown content](https://github.com/gcushen/hugo-academic/tree/master/exampleSite) which powers the [Demo](https://academic-demo.netlify.com/)
 
 ### Install with Git
 
@@ -97,7 +97,7 @@ Prerequisites:
 
     Now visit [localhost:1313](http://localhost:1313) and your new Academic powered website will appear. Otherwise, if using Netlify, they will provide you with your URL.
            
-2. Read the [Quick Start Guide](https://sourcethemes.com/academic/docs/) to learn how to add Markdown content, customize your site, and deploy it. For inspiration, refer to the [Markdown content](https://github.com/gcushen/hugo-academic/tree/master/exampleSite) which powers the [Demo](https://themes.gohugo.io/theme/academic/)
+2. Read the [Quick Start Guide](https://sourcethemes.com/academic/docs/) to learn how to add Markdown content, customize your site, and deploy it. For inspiration, refer to the [Markdown content](https://github.com/gcushen/hugo-academic/tree/master/exampleSite) which powers the [Demo](https://academic-demo.netlify.com/)
 
 3. Build your site by running the `hugo` command. Then [host it for free using Github Pages](https://georgecushen.com/create-your-website-with-hugo/) or Netlify (refer to the first installation method). Alternatively, copy the generated `public/` directory (by FTP, Rsync, etc.) to your production web server (such as a university's hosting service).
 

+ 0 - 1
archetypes/project/index.md

@@ -25,7 +25,6 @@ external_link = ""
 url_pdf = ""
 url_code = ""
 url_dataset = ""
-url_project = ""
 url_slides = ""
 url_video = ""
 url_poster = ""

+ 2 - 2
archetypes/publication/index.md

@@ -25,8 +25,8 @@ publication_short = ""
 abstract = ""
 abstract_short = ""
 
-# Is this a selected publication? (true/false)
-selected = false
+# Is this a featured publication? (true/false)
+featured = false
 
 # Projects (optional).
 #   Associate this publication with one or more of your projects.

+ 3 - 2
archetypes/talk/index.md

@@ -7,6 +7,7 @@ draft = false
 #   End time can optionally be hidden by prefixing the line with `#`.
 time_start = {{ .Date }}
 time_end = {{ .Date }}
+all_day = false
 
 # Authors. Comma separated list, e.g. `["Bob Smith", "David Jones"]`.
 authors = []
@@ -22,8 +23,8 @@ event_url = ""
 # Location of event.
 location = ""
 
-# Is this a selected talk? (true/false)
-selected = false
+# Is this a featured talk? (true/false)
+featured = false
 
 # Projects (optional).
 #   Associate this talk with one or more of your projects.

+ 52 - 2
assets/js/academic.js

@@ -267,7 +267,49 @@
   }
 
   /* ---------------------------------------------------------------------------
-   * On window load.
+  * Toggle day/night mode.
+  * --------------------------------------------------------------------------- */
+
+  function toggleDarkMode() {
+    if ($('body').hasClass('dark')) {
+      $('body').css({opacity: 0, visibility: 'visible'}).animate({opacity: 1}, 500);
+      $('body').removeClass('dark');
+      $('.js-dark-toggle i').removeClass('fa-sun');
+      $('.js-dark-toggle i').addClass('fa-moon');
+      localStorage.setItem('dark_mode', '0');
+    } else {
+      $('body').css({opacity: 0, visibility: 'visible'}).animate({opacity: 1}, 500);
+      $('body').addClass('dark');
+      $('.js-dark-toggle i').removeClass('fa-moon');
+      $('.js-dark-toggle i').addClass('fa-sun');
+      localStorage.setItem('dark_mode', '1');
+    }
+  }
+
+  /* ---------------------------------------------------------------------------
+   * On document ready.
+   * --------------------------------------------------------------------------- */
+
+  $(document).ready(function() {
+    // Set dark mode if user chose it.
+    let default_mode = 0;
+    if ($('body').hasClass('dark')) {
+      default_mode = 1;
+    }
+    let dark_mode = parseInt(localStorage.getItem('dark_mode') || default_mode);
+    if (dark_mode) {
+      $('body').addClass('dark');
+      $('.js-dark-toggle i').removeClass('fa-moon');
+      $('.js-dark-toggle i').addClass('fa-sun');
+    } else {
+      $('body').removeClass('dark');
+      $('.js-dark-toggle i').removeClass('fa-sun');
+      $('.js-dark-toggle i').addClass('fa-moon');
+    }
+  });
+
+  /* ---------------------------------------------------------------------------
+   * On window loaded.
    * --------------------------------------------------------------------------- */
 
   $(window).on('load', function() {
@@ -389,15 +431,23 @@
     });
     $(document).on('keydown', function(e){
       if (e.which == 27) {
+        // `Esc` key pressed.
         if ($('body').hasClass('searching')) {
           toggleSearchDialog();
         }
-      } else if (e.which == 191) {
+      } else if (e.which == 191 && e.shiftKey == false && !$('input,textarea').is(':focus')) {
+        // `/` key pressed outside of text input.
         e.preventDefault();
         toggleSearchDialog();
       }
     });
 
+    // Toggle day/night mode.
+    $('.js-dark-toggle').click(function(e) {
+      e.preventDefault();
+      toggleDarkMode();
+    });
+
   });
 
 })(jQuery);

+ 1 - 1
data/academic.toml

@@ -1,3 +1,3 @@
 # Academic
 
-version = "3.1.1"
+version = "3.3.0"

+ 2 - 2
data/assets.toml

@@ -71,8 +71,8 @@
   sri = "sha256-eSi1q2PG6J7g7ib17yAaWMcrr5GrtohYChqibrV7PBE="
   url = "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/%s/css/bootstrap.min.css"
 [css.fontAwesome]
-  version = "5.4.1"
-  sri = "sha384-5sAR7xN1Nv6T6+dT2mhtzEpVJvfS3NScPQTrOxhwjIuvcA67KV2R5Jz6kr4abQsz"
+  version = "5.6.0"
+  sri = "sha384-aOkxzJ5uQz7WBObEZcHvV5JvRW3TUc2rNPA7pe3AwnsUohiw1Vj2Rgx2KSOkF5+h"
   url = "https://use.fontawesome.com/releases/v%s/css/all.css"
 [css.academicons]
   version = "1.8.6"

+ 1 - 0
data/i18n/languages.yaml

@@ -5,6 +5,7 @@
 "es": "Español"
 "eu": "Euskara"
 "fr": "Français"
+"hu": "Magyar"
 "id": "Bahasa Indonesia"
 "it": "Italiano"
 "ja": "日本語"

+ 1 - 1
data/themes/dark.toml

@@ -17,4 +17,4 @@ menu_title = "#fff"
 
 # Home sections
 home_section_odd = "hsla(231, 15%, 18%, 1)"
-home_section_even = "hsla(231, 15%, 17%, 1)"
+home_section_even = "hsla(231, 15%, 16%, 1)"

+ 1 - 1
demo.sh

@@ -1,4 +1,4 @@
 #!/usr/bin/env bash
 
 cd exampleSite
-hugo -t "academic" --themesDir ../../ -p 1315 --i18n-warnings server
+HUGO_THEME=academic hugo --themesDir ../../ -p 1315 --i18n-warnings server

+ 0 - 365
exampleSite/config.toml

@@ -1,365 +0,0 @@
-# Configuration of Academic
-# Documentation: https://sourcethemes.com/academic/
-#
-# This file is formatted using TOML syntax - learn more at https://learnxinyminutes.com/docs/toml/
-# Each configuration section is defined by a name in square brackets (e.g. `[outputs]`).
-
-# The URL of your website.
-# End your URL with a `/` trailing slash, e.g. `https://example.com/`.
-baseurl = "/"
-
-# Title of your site
-title = "Academic"
-
-# Your copyright notice - appears in site footer.
-# To display a copyright symbol, type `©`.
-copyright = "© 2018"
-
-theme = "academic"
-enableEmoji = true
-footnotereturnlinkcontents = "<sup>^</sup>"
-ignoreFiles = ["\\.Rmd$", "\\.Rmarkdown$", "_files$", "_cache$"]
-preserveTaxonomyNames = true
-paginate = 10
-
-# Enable comments by entering your Disqus shortname
-disqusShortname = ""
-
-# Enable analytics by entering your Google Analytics tracking ID
-googleAnalytics = ""
-
-# Default language to use (if you setup multilingual support)
-defaultContentLanguage = "en"
-hasCJKLanguage = false  # Set `true` for Chinese/Japanese/Korean languages.
-defaultContentLanguageInSubdir = false
-
-# Get last modified date for content from Git?
-enableGitInfo = false
-
-[outputs]
-  home = [ "HTML", "CSS", "RSS", "JSON" ]
-  section = [ "HTML", "RSS" ]
-
-# Configure BlackFriday Markdown rendering.
-#   See: https://gohugo.io/getting-started/configuration/#configure-blackfriday
-[blackfriday]
-  hrefTargetBlank = true  # `true` opens external links in a new tab.
-  fractions = true  # `false` disables smart fractions (e.g. 5/12 formatted as a fraction).
-  smartypants = true  # `false` disables all smart punctuation substitutions (e.g. smart quotes, dashes, fractions).
-
-[params]
-  # AUTHOR SETUP
-
-  # Your details.
-  name = "Lena Smith"
-  role = "Professor of Artificial Intelligence"
-
-  # Organizations/Affiliations.
-  #   Separate multiple entries with a comma, using the form: `[ {name="Org1", url=""}, {name="Org2", url=""} ]`.
-  organizations = [ { name = "Stanford University", url = "" } ]
-
-  gravatar = false  # Get your avatar from Gravatar.com? (true/false)
-  avatar = "portrait.jpg"  # Specify an avatar image (in `static/img/` folder) or delete value to disable avatar.
-
-  # Details for the Contact Widget
-  email = "test@example.org"
-  address = "Building 1 Room 1, Stanford University, California, 90210, USA"
-  office_hours = "Monday 10:00 to 13:00 or email for appointment"
-  phone = "888 888 88 88"
-  skype = "echo123"
-  telegram = ""
-  keybase = ""  # Your keybase.io username.
-
-  # Discussion link (e.g. link to a forum, mailing list, or chat).
-  #   Uncomment line below to use.
-  #   discussion = { name = "Discuss", url = "https://discourse.gohugo.io" }
-
-  # Enable/disable map in Contact widget.
-  # To show your address on a map in the contact widget, you need to enter your latitude, longitude and choose
-  # a map provider below.
-  # To use Google Maps, set `map = 1` and enter your API key that can be obtained here:
-  #   https://developers.google.com/maps/documentation/javascript/get-api-key
-  # To use OpenStreetMap tiles, set `map = 2`.
-  # To use OpenStreetMap on a high traffic site, set `map = 3` and enter your API key that can be obtained here:
-  #   https://www.mapbox.com/studio/account/tokens
-  # To get your coordinates, right-click on Google Maps and choose "What's here?". The coords will show up at the bottom.
-  #
-  # Map provider:
-  #   0: No map
-  #   1: Google Maps
-  #   2: OpenStreetMap (Mapnik)
-  #   3: OpenStreetMap (Mapbox)
-  map = 0
-  map_api_key = ""
-  latitude = "37.4275"
-  longitude = "-122.1697"
-  zoom = 15
-
-  # SITE SETUP
-
-  # Color theme.
-  #   Choose from `default`, `ocean`, `forest`, `dark`, `apogee`, `1950s`, `coffee`, `cupcake`.
-  color_theme = "default"
-
-  # Font style.
-  #   Choose from `default`, `classic`, or `playfair`.
-  font = "default"
-
-  # Description for social sharing and search engines. If undefined, author role is used in place.
-  description = ""
-
-  # Default image for social sharing and search engines. Place image in `static/img/` folder and specify image name here.
-  sharing_image = ""
-
-  # Twitter username (without @). Used when a vistor shares your site on Twitter.
-  twitter = ""
-
-  # Diplay a logo in navigation bar rather than title (optional).
-  #   To enable, place an image in `static/img/` and reference its filename below. To disable, set the value to "".
-  logo = ""
-
-  # Date and time format (refer to https://sourcethemes.com/academic/docs/customization/#date-format )
-  #   Examples: "Mon, Jan 2, 2006" or "2006-01-02"
-  date_format = "Jan 2, 2006"
-  #   Examples: "3:04 pm" or "15:04"
-  time_format = "3:04 PM"
-
-  # Show estimated reading time for posts?
-  reading_time = true
-
-  # Display comment count? Requires commenting to be enabled.
-  comment_count = true
-
-  # Display next/previous section pager?
-  section_pager = false
-
-  # Enable global LaTeX math rendering?
-  #   If false, you can enable it locally on a per page basis.
-  math = false
-
-  # Highlight.js options
-  #   highlight
-  #     Enable global source code highlighting?  If false, you can
-  #     override it for a particular page in that page's preamble.
-  #
-  #     Example: highlight = true
-  #
-  #   highlight_languages
-  #     Add support for highlighting additional languages. Support for
-  #     languages mentioned here will be included in all pages.
-  #
-  #     Example: highlight_languages = ["go", "lisp", "ocaml"]
-  #
-  #   highlight_style
-  #     Choose a different CSS style for highlighting source
-  #     code. Setting this option in a page's preamble has no
-  #     effect.
-  #
-  #     Example: highlight_style = "github-gist"
-  #
-  #   For the list of supported languages and styles, see:
-  #   https://cdnjs.com/libraries/highlight.js/
-  #
-  #   For more info on the highlighting options, see:
-  #   https://sourcethemes.com/academic/docs/writing-markdown-latex/#highlighting-options
-  highlight = true
-  highlight_languages = []
-  # highlight_style = "github"
-
-  # Enable native social sharing buttons?
-  sharing = true
-
-  # Privacy pack
-  #   Show a cookie consent message to visitors
-  #   Anonymize IP in Google Analytics (if enabled)
-  privacy_pack = false
-
-  # Link custom CSS and JS assets
-  #   (relative to /static/css and /static/js respectively)
-  custom_css = []
-  custom_js  = []
-
-  # Publication types.
-  #   Used to categorize publications.
-  #   The index of the publication type in the list is used as its unique numerical identifier.
-  #   The numeric ID is used in a publication's frontmatter to categorize it.
-  #   The language can be edited below.
-  #   For multilingual sites, `publication_types` can be copied to each language section at the end of this file and
-  #   translated.
-  publication_types = [
-    'Uncategorized',  # 0
-    'Conference paper',  # 1
-    'Journal article',  # 2
-    'Manuscript',  # 3
-    'Report',  # 4
-    'Book',  # 5
-    'Book section'  # 6
-  ]
-
-  # Configuration of talk pages.
-  [params.talks]
-    # Show talk time?
-    time = true
-
-  # Configuration of publication pages.
-  [params.publications]
-    # Date format (refer to https://sourcethemes.com/academic/docs/customization/#date-format )
-    #   Examples: "Mon, Jan 2, 2006" or "2006-01-02"
-    date_format = "January, 2006"
-
-  # Configuration of project pages.
-  [params.projects]
-    # List publications and talks related to the project?
-    list_children = true
-
-    # Post list format.
-    #   0 = Simple
-    #   1 = Detailed
-    #   2 = Stream
-    post_format = 2
-
-    # Publication list format.
-    #   0 = Simple
-    #   1 = Detailed
-    #   2 = APA
-    #   3 = MLA
-    #   4 = Stream
-    publication_format = 4
-
-    # Talk list format.
-    #   0 = Simple
-    #   1 = Detailed
-    #   2 = Stream
-    talk_format = 2
-
-  # Social/Academic Networking
-  #
-  # Icon pack "fab" includes the following social network icons:
-  #
-  #   twitter, weibo, linkedin, github, facebook, pinterest, google-plus,
-  #   youtube, instagram, soundcloud
-  #
-  #   For email icon, use "fas" icon pack, "envelope" icon, and
-  #   "mailto:your@email.com" as the link.
-  #
-  #   Full list: https://fontawesome.com/icons
-  #
-  # Icon pack "ai" includes the following academic icons:
-  #
-  #   cv, google-scholar, arxiv, orcid, researchgate, mendeley
-  #
-  #   Full list: https://jpswalsh.github.io/academicons/
-
-  [[params.social]]
-    icon = "envelope"
-    icon_pack = "fas"
-    link = "#contact"  # For a direct email link, use "mailto:test@example.org".
-
-  [[params.social]]
-    icon = "twitter"
-    icon_pack = "fab"
-    link = "https://twitter.com/GeorgeCushen"
-
-  [[params.social]]
-    icon = "google-scholar"
-    icon_pack = "ai"
-    link = "https://scholar.google.co.uk/citations?user=sIwtMXoAAAAJ"
-
-  [[params.social]]
-    icon = "github"
-    icon_pack = "fab"
-    link = "https://github.com/gcushen"
-
-  # Link to a PDF of your resume/CV from the About widget.
-  # To enable, copy your resume/CV to `static/files/cv.pdf` and uncomment the lines below.
-  # [[params.social]]
-  #   icon = "cv"
-  #   icon_pack = "ai"
-  #   link = "files/cv.pdf"
-
-# Navigation Links
-#   To link a homepage widget, specify the URL as a hash `#` followed by the filename of the
-#     desired widget in your `content/home/` folder.
-#   The weight parameter defines the order that the links will appear in.
-[params.menus]
-  # Align the main menu to the right of the page? (true/false)
-  align_right = true
-
-[[menu.main]]
-  name = "Home"
-  url = "#about"
-  weight = 1
-
-[[menu.main]]
-  name = "Publications"
-  url = "#publications_selected"
-  weight = 2
-
-[[menu.main]]
-  name = "Posts"
-  url = "#posts"
-  weight = 3
-
-[[menu.main]]
-  name = "Projects"
-  url = "#projects"
-  weight = 4
-
-[[menu.main]]
-  name = "Tutorials"
-  url = "/tutorial/"
-  weight = 5
-
-[[menu.main]]
-  name = "Contact"
-  url = "#contact"
-  weight = 6
-
-# Link to a PDF of your resume/CV from the menu.
-# To enable, copy your resume/CV to `static/files/cv.pdf` and uncomment the lines below.
-# [[menu.main]]
-#    name = "CV"
-#    url = "files/cv.pdf"
-#    weight = 7
-
-# Search.
-[params.search]
-  # Search provider:
-  #   0: No search engine
-  #   1: Built-in (Fuse)
-  #   2: Algolia (https://www.algolia.com)
-  engine = 1
-
-  # Configuration of Algolia search engine.
-  # Paste the values from your Algolia dashboard.
-  [params.search.algolia]
-    app_id = ""
-    api_key = ""
-    index_name = ""
-    show_logo = false
-
-# Taxonomies.
-[taxonomies]
-  tag = "tags"
-  category = "categories"
-  publication_type = "publication_types"
-
-# Languages
-#   Create a [languages.X] block for each language you want, where X is the language ID.
-#   Refer to https://sourcethemes.com/academic/docs/language/
-
-# Configure the English version of the website.
-[languages.en]
-  languageCode = "en-us"
-
-# Uncomment the lines below to configure your website in a second language.
-#[languages.zh]
-#  languageCode = "zh-Hans"
-#  title = "Chinese website title..."
-#  [languages.zh.params]
-#    name = "Your name in Chinese..."
-#    role = "Your role in Chinese..."
-#  [[languages.zh.menu.main]]
-#    name = "Wo"
-#    url = "#about"
-#    weight = 1

+ 62 - 0
exampleSite/config/_default/config.toml

@@ -0,0 +1,62 @@
+# Configuration of Academic
+# Documentation: https://sourcethemes.com/academic/
+#
+# This file is formatted using TOML syntax - learn more at https://learnxinyminutes.com/docs/toml/
+# Each configuration section is defined by a name in square brackets (e.g. `[outputs]`).
+
+# Title of your site
+title = "Academic"
+
+# The URL of your site.
+# End your URL with a `/` trailing slash, e.g. `https://example.com/`.
+baseurl = "/"
+
+# Enter a copyright notice to display in the site footer.
+# To display a copyright symbol, type `&copy;`.
+copyright = ""
+
+# Enable analytics by entering your Google Analytics tracking ID
+googleAnalytics = ""
+
+# Enable comments by entering your Disqus shortname
+disqusShortname = ""
+
+############################
+## Advanced options below ##
+############################
+
+# Name of Academic theme folder in `themes/`.
+theme = "academic"
+
+# Get last modified date for content from Git?
+enableGitInfo = false
+
+# Default language to use (if you setup multilingual support)
+defaultContentLanguage = "en"
+hasCJKLanguage = false  # Set `true` for Chinese/Japanese/Korean languages.
+defaultContentLanguageInSubdir = false
+
+paginate = 10  # Number of items per page in paginated lists.
+enableEmoji = true
+footnotereturnlinkcontents = "<sup>^</sup>"
+ignoreFiles = ["\\.Rmd$", "\\.Rmarkdown$", "_files$", "_cache$"]
+preserveTaxonomyNames = true
+
+[outputs]
+  home = [ "HTML", "CSS", "RSS", "JSON" ]
+  section = [ "HTML", "RSS" ]
+
+# Configure BlackFriday Markdown rendering.
+#   See: https://gohugo.io/getting-started/configuration/#configure-blackfriday
+[blackfriday]
+  hrefTargetBlank = true  # `true` opens external links in a new tab. See https://github.com/gohugoio/hugo/issues/2424
+	angledQuotes = false
+	latexDashes = true
+  extensions = ["backslashLineBreak"]
+
+# Taxonomies.
+[taxonomies]
+  tag = "tags"
+  category = "categories"
+  publication_type = "publication_types"
+  author = "authors"

+ 19 - 0
exampleSite/config/_default/languages.toml

@@ -0,0 +1,19 @@
+# Languages
+#   Create a `[X]` block for each language you want, where X is the language ID.
+#   Refer to https://sourcethemes.com/academic/docs/language/
+
+# Configure the English version of the site.
+[en]
+  languageCode = "en-us"
+
+# Uncomment the lines below to configure your website in a second language.
+#[zh]
+#  languageCode = "zh-Hans"
+#  contentDir = "content/zh"
+#  title = "Chinese website title..."
+#  [zh.params]
+#    description = "Site description in Chinese..."
+#  [[zh.menu.main]]
+#    name = "Wo"
+#    url = "#about"
+#    weight = 1

+ 41 - 0
exampleSite/config/_default/menus.toml

@@ -0,0 +1,41 @@
+# Navigation Links
+#   To link a homepage widget, specify the URL as a hash `#` followed by the filename of the
+#     desired widget in your `content/home/` folder.
+#   The weight parameter defines the order that the links will appear in.
+
+[[main]]
+  name = "Home"
+  url = "#about"
+  weight = 1
+
+[[main]]
+  name = "Publications"
+  url = "#publications_featured"
+  weight = 2
+
+[[main]]
+  name = "Posts"
+  url = "#posts"
+  weight = 3
+
+[[main]]
+  name = "Projects"
+  url = "#projects"
+  weight = 4
+
+[[main]]
+  name = "Tutorials"
+  url = "/tutorial/"
+  weight = 5
+
+[[main]]
+  name = "Contact"
+  url = "#contact"
+  weight = 6
+
+# Link to a PDF of your resume/CV from the menu.
+# To enable, copy your resume/CV to `static/files/cv.pdf` and uncomment the lines below.
+# [[main]]
+#    name = "CV"
+#    url = "files/cv.pdf"
+#    weight = 7

+ 170 - 0
exampleSite/config/_default/params.toml

@@ -0,0 +1,170 @@
+# SITE SETUP
+# Documentation: https://sourcethemes.com/academic/
+
+# Color theme.
+#   Choose from `default`, `ocean`, `forest`, `dark`, `apogee`, `1950s`, `coffee`, `cupcake`.
+color_theme = "default"
+# Enable users to switch between day and night mode?
+day_night = true
+
+# Font style.
+#   Choose from `default`, `classic`, or `playfair`.
+font = "default"
+
+# Description for social sharing and search engines. If undefined, superuser role is used in place.
+description = ""
+
+# Default image for social sharing and search engines. Place image in `static/img/` folder and specify image name here.
+sharing_image = ""
+
+# Twitter username (without @). Used when a vistor shares your site on Twitter.
+twitter = ""
+
+# Diplay a logo in navigation bar rather than title (optional).
+#   To enable, place an image in `static/img/` and reference its filename below. To disable, set the value to "".
+logo = ""
+
+# Enable global source code highlighting? true/false
+# Documentation: https://sourcethemes.com/academic/docs/writing-markdown-latex/#highlighting-options
+highlight = true
+# highlight_languages = ["r"]  # Add support for highlighting additional languages
+# highlight_style = "github"  # For supported styles, see https://cdnjs.com/libraries/highlight.js/
+
+# Enable global LaTeX math rendering?
+#   If false, you can enable it locally on a per page basis.
+math = false
+
+# Privacy pack
+#   Show a cookie consent message to visitors
+#   Anonymize IP in Google Analytics (if enabled)
+privacy_pack = false
+
+# Date and time format (refer to https://sourcethemes.com/academic/docs/customization/#date-format )
+#   Examples: "Mon, Jan 2, 2006" or "2006-01-02"
+date_format = "Jan 2, 2006"
+#   Examples: "3:04 pm" or "15:04"
+time_format = "3:04 PM"
+
+############################
+## Contact Widget setup   ##
+############################
+
+# Enter contact details (optional). To hide a field, clear it to "".
+email = "test@example.org"
+phone = "888 888 88 88"
+address = "Building 1 Room 1, Stanford University, California, 90210, USA"
+
+# Office hours: use `<br>` to insert a line break, or set to "" to remove office hours
+office_hours = """Monday 10:00 to 13:00<br>
+                  Wednesday 09:00 to 10:00<br>
+                  Otherwise email to book an appointment"""
+
+# Enter an optional link for booking appointments (e.g. calendly.com).
+appointment_url = ""
+
+# Contact links
+#   Set to `[]` to disable, or comment out unwanted lines with a hash `#`.
+contact_links = [
+  {icon = "twitter", icon_pack = "fab", name = "DM Me", link = "https://twitter.com/Twitter"},
+  {icon = "skype", icon_pack = "fab", name = "Skype Me", link = "skype:echo123?call"},
+  {icon = "keybase", icon_pack = "fab", name = "Chat on Keybase", link = "https://keybase.io/"},
+  {icon = "comments", icon_pack = "fas", name = "Discuss on Forum", link = "https://discourse.gohugo.io"},
+  # {icon = "telegram", icon_pack = "fab", name = "Telegram Me", link = "https://telegram.me/@Telegram"},
+  ]
+
+# Display a map.
+# To show your address on a map in the contact widget, you need to enter your latitude, longitude and choose
+# a map provider below.
+# To use Google Maps, set `map = 1` and enter your API key that can be obtained here:
+#   https://developers.google.com/maps/documentation/javascript/get-api-key
+# To use OpenStreetMap tiles, set `map = 2`.
+# To use OpenStreetMap on a high traffic site, set `map = 3` and enter your API key that can be obtained here:
+#   https://www.mapbox.com/studio/account/tokens
+# To get your coordinates, right-click on Google Maps and choose "What's here?". The coords will show up at the bottom.
+#
+# Map provider:
+#   0: No map
+#   1: Google Maps
+#   2: OpenStreetMap (Mapnik)
+#   3: OpenStreetMap (Mapbox)
+map = 0
+map_api_key = ""
+latitude = "37.4275"
+longitude = "-122.1697"
+zoom = 15
+
+############################
+## Plugins                ##
+############################
+
+# Load CSS and JS plugins
+#   E.g. To load `/assets/css/custom.css`, set `plugins_css = ["custom"]`.
+#   E.g. To load `/assets/js/custom.js`, set `plugins_js = ["custom"]`.
+plugins_css = []
+plugins_js  = []
+
+############################
+## Advanced options       ##
+############################
+
+# Get user avatars from Gravatar.com? (true/false)
+gravatar = false
+
+# Align the main menu to the right of the page? (true/false)
+menu_align_right = false
+
+# Show estimated reading time for posts? (true/false)
+reading_time = true
+
+# Display comment count (if commenting enabled in config.toml)? (true/false)
+comment_count = true
+
+# Display next/previous section pager? (true/false)
+section_pager = false
+
+# Enable in-built social sharing buttons? (true/false)
+sharing = true
+
+# Configuration of publication pages.
+[publications]
+  # Date format (refer to https://sourcethemes.com/academic/docs/customization/#date-format )
+  #   Examples: "Mon, Jan 2, 2006" or "2006-01-02"
+  date_format = "January 2006"
+
+# Configuration of project pages.
+[projects]
+  # Post list format.
+  #   0 = Simple
+  #   1 = Detailed
+  #   2 = Stream
+  post_format = 2
+
+  # Publication list format.
+  #   0 = Simple
+  #   1 = Detailed
+  #   2 = APA
+  #   3 = MLA
+  #   4 = Stream
+  publication_format = 4
+
+  # Talk list format.
+  #   0 = Simple
+  #   1 = Detailed
+  #   2 = Stream
+  talk_format = 2
+
+# Search.
+[search]
+  # Search provider:
+  #   0: No search engine
+  #   1: Academic (built-in)
+  #   2: Algolia (https://www.algolia.com)
+  engine = 1
+
+  # Configuration of Algolia search engine.
+  # Paste the values from your Algolia dashboard.
+  [search.algolia]
+    app_id = ""
+    api_key = ""
+    index_name = ""
+    show_logo = false

+ 93 - 0
exampleSite/content/author/admin/_index.md

@@ -0,0 +1,93 @@
++++
+# Display name
+name = "Nelson Bighetti"
+
+# Is this the primary user of the site?
+superuser = true
+
+# Role/position
+role = "Professor of Artificial Intelligence"
+
+# Organizations/Affiliations
+#   Separate multiple entries with a comma, using the form: `[ {name="Org1", url=""}, {name="Org2", url=""} ]`.
+organizations = [ { name = "Stanford University", url = "" } ]
+
+# Short bio (displayed in user profile at end of posts)
+bio = "My research interests include distributed robotics, mobile computing and programmable matter."
+
+# Enter email to display Gravatar (if Gravatar enabled in Config)
+email = ""
+
+# List (academic) interests or hobbies
+interests = [
+  "Artificial Intelligence",
+  "Computational Linguistics",
+  "Information Retrieval"
+]
+
+# List qualifications (such as academic degrees)
+[[education.courses]]
+  course = "PhD in Artificial Intelligence"
+  institution = "Stanford University"
+  year = 2012
+
+[[education.courses]]
+  course = "MEng in Artificial Intelligence"
+  institution = "Massachusetts Institute of Technology"
+  year = 2009
+
+[[education.courses]]
+  course = "BSc in Artificial Intelligence"
+  institution = "Massachusetts Institute of Technology"
+  year = 2008
+
+# Social/Academic Networking
+#
+# Icon pack "fab" includes the following social network icons:
+#
+#   twitter, weibo, linkedin, github, facebook, pinterest, google-plus,
+#   youtube, instagram, soundcloud
+#
+#   For email icon, use "fas" icon pack, "envelope" icon, and
+#   "mailto:your@email.com" as the link.
+#
+#   Full list: https://fontawesome.com/icons
+#
+# Icon pack "ai" includes the following academic icons:
+#
+#   cv, google-scholar, arxiv, orcid, researchgate, mendeley
+#
+#   Full list: https://jpswalsh.github.io/academicons/
+
+[[social]]
+  icon = "envelope"
+  icon_pack = "fas"
+  link = "#contact"  # For a direct email link, use "mailto:test@example.org".
+
+[[social]]
+  icon = "twitter"
+  icon_pack = "fab"
+  link = "https://twitter.com/GeorgeCushen"
+
+[[social]]
+  icon = "google-scholar"
+  icon_pack = "ai"
+  link = "https://scholar.google.co.uk/citations?user=sIwtMXoAAAAJ"
+
+[[social]]
+  icon = "github"
+  icon_pack = "fab"
+  link = "https://github.com/gcushen"
+
+# Link to a PDF of your resume/CV from the About widget.
+# To enable, copy your resume/CV to `static/files/cv.pdf` and uncomment the lines below.
+# [[social]]
+#   icon = "cv"
+#   icon_pack = "ai"
+#   link = "files/cv.pdf"
+
++++
+
+Nelson Bighetti is a professor of artificial intelligence at the Stanford AI Lab. His research interests include distributed robotics, mobile computing and programmable matter. He leads the Robotic Neurobiology group, which develops self-reconfiguring robots, systems of self-organizing robots, and mobile sensor networks.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed neque elit, tristique placerat feugiat ac, facilisis vitae arcu. Proin eget egestas augue. Praesent ut sem nec arcu pellentesque aliquet. Duis dapibus diam vel metus tempus vulputate. 

+ 0 - 0
exampleSite/static/img/portrait.jpg → exampleSite/content/author/admin/avatar.jpg


+ 7 - 34
exampleSite/content/home/about.md

@@ -1,40 +1,13 @@
 +++
 # About/Biography widget.
-widget = "about"
-active = true
+widget = "about"  # Do not modify this line!
+active = true  # Activate this widget? true/false
+weight = 5  # Order that this section will appear in.
 date = 2016-04-20T00:00:00
 
-# Order that this section will appear in.
-weight = 5
+title = "Biography"
 
-# List your academic interests.
-[interests]
-  interests = [
-    "Artificial Intelligence",
-    "Computational Linguistics",
-    "Information Retrieval"
-  ]
-
-# List your qualifications (such as academic degrees).
-[[education.courses]]
-  course = "PhD in Artificial Intelligence"
-  institution = "Stanford University"
-  year = 2012
-
-[[education.courses]]
-  course = "MEng in Artificial Intelligence"
-  institution = "Massachusetts Institute of Technology"
-  year = 2009
-
-[[education.courses]]
-  course = "BSc in Artificial Intelligence"
-  institution = "Massachusetts Institute of Technology"
-  year = 2008
- 
+# Choose the user profile to display
+# This should be the username of a profile in your `content/author/` folder.
+author = "Admin"
 +++
-
-# Biography
-
-Lena Smith is a professor of artificial intelligence at the Stanford AI Lab. Her research interests include distributed robotics, mobile computing and programmable matter. She leads the Robotic Neurobiology group, which develops self-reconfiguring robots, systems of self-organizing robots, and mobile sensor networks.
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed neque elit, tristique placerat feugiat ac, facilisis vitae arcu. Proin eget egestas augue. Praesent ut sem nec arcu pellentesque aliquet. Duis dapibus diam vel metus tempus vulputate. 

+ 46 - 0
exampleSite/content/home/accomplishments.md

@@ -0,0 +1,46 @@
++++
+# Accomplishments widget.
+widget = "accomplishments"  # Do not modify this line!
+active = true  # Activate this widget? true/false
+
+title = "Accomplish&shy;ments"
+subtitle = ""
+
+# Order that this section will appear in.
+weight = 15
+
+# Date format
+#   Refer to https://sourcethemes.com/academic/docs/customization/#date-format
+date_format = "Jan 2006"
+
+# Accomplishments.
+#   Add/remove as many `[[item]]` blocks below as you like.
+#   `title`, `organization` and `date_start` are the required parameters.
+#   Leave other parameters empty if not required.
+#   Begin/end multi-line descriptions with 3 quotes `"""`.
+
+[[item]]
+  title = "Neural Networks and Deep Learning"
+  organization = "Coursera"
+  certificate_url = "https://www.coursera.org"
+  date_start = "2018-10-01"
+  date_end = ""
+  description = ""
+
+[[item]]
+  title = "Blockchain Fundamentals"
+  organization = "edX"
+  certificate_url = "https://www.edx.org"
+  date_start = "2018-03-01"
+  date_end = ""
+  description = ""
+  
+[[item]]
+  title = "Intro to Python"
+  organization = "DataCamp"
+  certificate_url = "https://www.datacamp.com"
+  date_start = "2017-07-01"
+  date_end = "2017-12-21"
+  description = ""
+
++++

+ 9 - 12
exampleSite/content/home/posts.md

@@ -1,23 +1,15 @@
 +++
 # Recent Posts widget.
 # This widget displays recent posts from `content/post/`.
-widget = "posts"
-active = true
+widget = "posts"  # Do not modify this line!
+active = true  # Activate this widget? true/false
+weight = 40  # Order that this section will appear.
 date = 2016-04-20T00:00:00
 
 title = "Recent Posts"
 subtitle = ""
 
-# Order that this section will appear in.
-weight = 40
-
-# Filter posts by tag.
-#  By default, show all recent posts.
-#  Filtering example: `tags_include = ["hugo", "academic"]`
-tags_include = []
-tags_exclude = []
-
-# Number of posts to list.
+# Number of recent posts to list.
 count = 5
 
 # List format.
@@ -25,5 +17,10 @@ count = 5
 #   1 = Detailed
 #   2 = Stream
 list_format = 2
+
+# Filter posts by tag or category.
+#  E.g. to only show posts tagged with `Academic`, set `filter_tag = "Academic"`
+filter_tag = ""
+filter_category = ""
 +++
 

+ 2 - 2
exampleSite/content/home/publications.md

@@ -33,7 +33,7 @@ list_format = 4
 #  6: Book chapter
 publication_type = "-1"
 
-# Exclude publications that are shown in the Selected Publications widget?
-exclude_selected = false
+# Exclude publications that are shown in the Featured Publications widget?
+exclude_featured = false
 +++
 

+ 4 - 4
exampleSite/content/home/publications_selected.md → exampleSite/content/home/publications_featured.md

@@ -1,12 +1,12 @@
 +++
-# Selected Publications widget.
+# Featured Publications widget.
 # This widget displays publications from `content/publication/` which have
-# `selected = true` in their `+++` front matter.
-widget = "publications_selected"
+# `featured = true` in their `+++` front matter.
+widget = "publications_featured"
 active = true
 date = 2016-04-20T00:00:00
 
-title = "Selected Publications"
+title = "Featured Publications"
 subtitle = ""
 
 # Order that this section will appear in.

+ 2 - 2
exampleSite/content/home/talks.md

@@ -19,7 +19,7 @@ count = 10
 #   2 = Stream
 list_format = 2
 
-# Exclude talks that are shown in the Selected Talks widget?
-exclude_selected = false
+# Exclude talks that are shown in the Featured Talks widget?
+exclude_featured = false
 +++
 

+ 3 - 3
exampleSite/content/home/talks_selected.md → exampleSite/content/home/talks_featured.md

@@ -1,10 +1,10 @@
 +++
-# Selected Talks widget.
-widget = "talks_selected"
+# Featured Talks widget.
+widget = "talks_featured"
 active = false
 date = 2016-04-20T00:00:00
 
-title = "Selected Talks"
+title = "Featured Talks"
 subtitle = ""
 
 # Order that this section will appear in.

+ 4 - 4
exampleSite/content/post/getting-started/index.md

@@ -7,7 +7,7 @@ lastmod = 2018-01-13T00:00:00
 draft = false
 
 # Authors. Comma separated list, e.g. `["Bob Smith", "David Jones"]`.
-authors = []
+authors = ["Admin"]
 
 tags = ["Academic"]
 summary = "Create a beautifully simple website or blog in under 10 minutes."
@@ -78,7 +78,7 @@ caption = "Cupcake"
 
 **Academic** makes it easy to create a beautiful website for free using Markdown. Customize anything on your site with widgets, themes, and language packs.
 
-Follow our easy [step by step guide](https://sourcethemes.com/academic/docs/install/) to learn how to build your own free website with Academic. [Check out the personal demo](https://themes.gohugo.io/theme/academic/) or the [business demo](https://sourcethemes.com/academic/) of what you'll get in less than 10 minutes.
+Follow our easy [step by step guide](https://sourcethemes.com/academic/docs/install/) to learn how to build your own free website with Academic. [Check out the personal demo](https://academic-demo.netlify.com/) or the [business demo](https://sourcethemes.com/academic/) of what you'll get in less than 10 minutes.
 
 - [View the documentation](https://sourcethemes.com/academic/docs/)
 - [Ask a question](http://discuss.gohugo.io/)
@@ -127,7 +127,7 @@ You can choose from one of the following four methods to install:
 1. [Install Academic with Netlify](https://app.netlify.com/start/deploy?repository=https://github.com/sourcethemes/academic-kickstart)
     * Netlify will provide you with a customizable URL to access your new site
 2. On GitHub, go to your newly created `academic-kickstart` repository and edit `config.toml` to personalize your site. Shortly after saving the file, your site will automatically update
-3. Read the [Quick Start Guide](https://sourcethemes.com/academic/docs/) to learn how to add Markdown content. For inspiration, refer to the [Markdown content](https://github.com/gcushen/hugo-academic/tree/master/exampleSite) which powers the [Demo](https://themes.gohugo.io/theme/academic/)
+3. Read the [Quick Start Guide](https://sourcethemes.com/academic/docs/) to learn how to add Markdown content. For inspiration, refer to the [Markdown content](https://github.com/gcushen/hugo-academic/tree/master/exampleSite) which powers the [Demo](https://academic-demo.netlify.com/)
 
 ### Install with Git
 
@@ -164,7 +164,7 @@ Prerequisites:
 
     Now visit [localhost:1313](http://localhost:1313) and your new Academic powered website will appear. Otherwise, if using Netlify, they will provide you with your URL.
            
-2. Read the [Quick Start Guide](https://sourcethemes.com/academic/docs/) to learn how to add Markdown content, customize your site, and deploy it. For inspiration, refer to the [Markdown content](https://github.com/gcushen/hugo-academic/tree/master/exampleSite) which powers the [Demo](https://themes.gohugo.io/theme/academic/)
+2. Read the [Quick Start Guide](https://sourcethemes.com/academic/docs/) to learn how to add Markdown content, customize your site, and deploy it. For inspiration, refer to the [Markdown content](https://github.com/gcushen/hugo-academic/tree/master/exampleSite) which powers the [Demo](https://academic-demo.netlify.com/)
 
 3. Build your site by running the `hugo` command. Then [host it for free using Github Pages](https://georgecushen.com/create-your-website-with-hugo/) or Netlify (refer to the first installation method). Alternatively, copy the generated `public/` directory (by FTP, Rsync, etc.) to your production web server (such as a university's hosting service).
 

+ 1 - 0
exampleSite/content/privacy.md

@@ -3,6 +3,7 @@ title = "Privacy Policy"
 
 date = 2018-06-28T00:00:00
 draft = true
+share = false
 
 # [header]
 # image = ""

+ 3 - 3
exampleSite/content/publication/clothing-search/index.md

@@ -25,8 +25,8 @@ publication_short = "In *ICMEW*"
 abstract = "We present a mobile visual clothing search system whereby a smart phone user can either choose a social networking photo or take a new photo of a person wearing clothing of interest and search for similar clothing in a retail database. From the query image, the person is detected, clothing is segmented, and clothing features are extracted and quantized. The information is sent from the phone client to a server, where the feature vector of the query image is used to retrieve similar clothing products from online databases. The phone's GPS location is used to re-rank results by retail store location. State of the art work focuses primarily on the recognition of a diverse range of clothing offline and pays little attention to practical applications. Evaluated on a challenging dataset, the system is relatively fast and achieves promising results."
 abstract_short = "A mobile visual clothing search system is presented whereby a smart phone user can either choose a social networking image or capture a new photo of a person wearing clothing of interest and search for similar clothing in a large cloud-based ecommerce database. The phone's GPS location is used to re-rank results by retail store location, to inform the user of local stores where similar clothing items can be tried on."
 
-# Is this a selected publication? (true/false)
-selected = true
+# Is this a featured publication? (true/false)
+featured = true
 
 # Projects (optional).
 #   Associate this publication with one or more of your projects.
@@ -45,7 +45,7 @@ url_pdf = "http://eprints.soton.ac.uk/352095/1/Cushen-IMV2013.pdf"
 url_preprint = "http://eprints.soton.ac.uk/352095/1/Cushen-IMV2013.pdf"
 url_code = "#"
 url_dataset = "#"
-url_project = "#"
+url_project = ""
 url_slides = "#"
 url_video = "#"
 url_poster = "#"

+ 2 - 2
exampleSite/content/publication/person-re-id/index.md

@@ -25,8 +25,8 @@ publication_short = "In *SITIS*"
 abstract = "Person re-identification is a critical security task for recognizing a person across spatially disjoint sensors. Previous work can be computationally intensive and is mainly based on low-level cues extracted from RGB data and implemented on a PC for a fixed sensor network (such as traditional CCTV). We present a practical and efficient framework for mobile devices (such as smart phones and robots) where high-level semantic soft biometrics are extracted from RGB and depth data. By combining these cues, our approach attempts to provide robustness to noise, illumination, and minor variations in clothing. This mobile approach may be particularly useful for the identification of persons in areas ill-served by fixed sensors or for tasks where the sensor position and direction need to dynamically adapt to a target. Results on the BIWI dataset are preliminary but encouraging. Further evaluation and demonstration of the system will be available on our website."
 abstract_short = ""
 
-# Is this a selected publication? (true/false)
-selected = false
+# Is this a featured publication? (true/false)
+featured = false
 
 # Projects (optional).
 #   Associate this publication with one or more of your projects.

+ 3 - 2
exampleSite/content/talk/example/index.md

@@ -7,6 +7,7 @@ draft = false
 #   End time can optionally be hidden by prefixing the line with `#`.
 time_start = 2030-06-01T13:00:00
 time_end = 2030-06-01T15:00:00
+all_day = false
 
 # Authors. Comma separated list, e.g. `["Bob Smith", "David Jones"]`.
 authors = []
@@ -22,8 +23,8 @@ event_url = "https://example.org"
 # Location of event.
 location = "London, United Kingdom"
 
-# Is this a selected talk? (true/false)
-selected = false
+# Is this a featured talk? (true/false)
+featured = false
 
 # Projects (optional).
 #   Associate this talk with one or more of your projects.

+ 20 - 3
i18n/de.yaml

@@ -98,6 +98,23 @@
 - id: more_talks
   translation: Weitere Vorträge
 
+# Contact widget
+
+- id: contact_name
+  translation: Name
+
+- id: contact_email
+  translation: E-Mail
+
+- id: contact_message
+  translation: Nachricht
+
+- id: contact_send
+  translation: Senden
+
+- id: book_appointment
+  translation: Termin vereinbaren
+
 # Publication/Talk details
 
 - id: abstract
@@ -115,9 +132,6 @@
 - id: last_updated
   translation: Zuletzt aktualisiert am
 
-- id: links
-  translation: Links
-
 - id: event
   translation: Veranstaltung
 
@@ -153,6 +167,9 @@
 
 # Search
 
+- id: search
+  translation: Suche
+
 - id: search_placeholder
   translation: Suche...
 

+ 29 - 0
i18n/en.yaml

@@ -74,6 +74,11 @@
 
 - id: education
   translation: Education
+  
+# Accomplishments widget
+
+- id: see_certificate
+  translation: See certificate
 
 # Experience widget
 
@@ -112,6 +117,9 @@
 - id: contact_send
   translation: Send
 
+- id: book_appointment
+  translation: Book an appointment
+
 # Publication/Talk details
 
 - id: abstract
@@ -135,6 +143,27 @@
 - id: location
   translation: Location
 
+- id: pub_uncat
+  translation: Uncategorized
+
+- id: pub_conf
+  translation: Conference paper
+
+- id: pub_journal
+  translation: Journal article
+
+- id: pub_manuscript
+  translation: Manuscript
+
+- id: pub_report
+  translation: Report
+
+- id: pub_book
+  translation: Book
+
+- id: pub_book_section
+  translation: Book section
+
 # Filtering
 
 - id: filter_by_type

+ 47 - 3
i18n/es.yaml

@@ -6,6 +6,12 @@
 - id: table_of_contents
   translation: Índice
 
+- id: on_this_page
+  translation: En esta página
+
+- id: back_to_top
+  translation: Regreso al inicio
+
 # General
 
 - id: related
@@ -69,6 +75,16 @@
 - id: education
   translation: Educación
 
+# Accomplishments widget
+
+- id: see_certificate
+  translation: Ver certificado
+
+# Experience widget
+
+- id: present
+  translation: Actualmente
+
 # Publications widget
 
 - id: more_publications
@@ -87,6 +103,23 @@
 - id: more_talks
   translation: Más charlas
 
+# Contact widget
+
+- id: contact_name
+  translation: Nombre
+
+- id: contact_email
+  translation: Email
+
+- id: contact_message
+  translation: Mensaje
+
+- id: contact_send
+  translation: Enviar
+
+- id: book_appointment
+  translation: Solicitar una cita
+
 # Publication/Talk details
 
 - id: abstract
@@ -104,9 +137,6 @@
 - id: last_updated
   translation: Última actualización el
 
-- id: links
-  translation: Links
-
 - id: event
   translation: Evento
 
@@ -140,6 +170,20 @@
 - id: projects
   translation: Proyectos
 
+# Search
+
+- id: search
+  translation: Buscar
+
+- id: search_placeholder
+  translation: Buscar...
+
+- id: search_results
+  translation: resultados encontrados
+
+- id: search_no_results
+  translation: No se encontraron resultados
+
 # Error 404
 
 - id: page_not_found

+ 47 - 3
i18n/fr.yaml

@@ -6,6 +6,12 @@
 - id: table_of_contents
   translation: Table des matières
 
+- id: on_this_page
+  translation: Dans cette page
+
+- id: back_to_top
+  translation: Retourner au début
+
 # General
 
 - id: related
@@ -69,6 +75,16 @@
 - id: education
   translation: Formation
 
+# Accomplishments widget
+
+- id: see_certificate
+  translation: Voir certification
+
+# Experience widget
+
+- id: present
+  translation: Actuellement
+
 # Publications widget
 
 - id: more_publications
@@ -87,6 +103,23 @@
 - id: more_talks
   translation: Plus de présentations
 
+# Contact widget
+
+- id: contact_name
+  translation: Nom
+
+- id: contact_email
+  translation: Email
+
+- id: contact_message
+  translation: Message
+
+- id: contact_send
+  translation: Envoyer
+
+- id: book_appointment
+  translation: Demander un rendez-vous
+
 # Publication/Talk details
 
 - id: abstract
@@ -104,9 +137,6 @@
 - id: last_updated
   translation: Dernière mise à jour le
 
-- id: links
-  translation: Liens
-
 - id: event
   translation: Événement
 
@@ -140,6 +170,20 @@
 - id: projects
   translation: Projets
 
+# Search
+
+- id: search
+  translation: Rechercher
+
+- id: search_placeholder
+  translation: Recherche...
+
+- id: search_results
+  translation: Résultats trouvés
+
+- id: search_no_results
+  translation: Aucun résultat n'a été trouvé
+
 # Error 404
 
 - id: page_not_found

+ 204 - 0
i18n/hu.yaml

@@ -0,0 +1,204 @@
+# Navigation
+
+- id: toggle_navigation
+  translation: Navigáció
+
+- id: table_of_contents
+  translation: Tartalomjegyzék
+
+- id: on_this_page
+  translation: Ezen az oldalon
+
+- id: back_to_top
+  translation: Vissza felülre
+
+# General
+
+- id: related
+  translation: Kapcsolódó anyagok
+
+- id: minute_read
+  translation: perc olvasás
+
+- id: previous
+  translation: Előző
+
+- id: next
+  translation: Következő
+
+- id: figure
+  translation: "%d. ábra:"
+
+# Buttons
+
+- id: btn_preprint
+  translation: Megjelenés előtt
+
+- id: btn_pdf
+  translation: PDF
+
+- id: btn_cite
+  translation: Idézet
+
+- id: btn_slides
+  translation: Diák
+
+- id: btn_video
+  translation: Videó
+
+- id: btn_code
+  translation: Kód
+
+- id: btn_dataset
+  translation: Adatcsomag
+
+- id: btn_project
+  translation: Projekt
+
+- id: btn_poster
+  translation: Poszter
+
+- id: btn_source
+  translation: Forrás dokumentum
+
+- id: btn_copy
+  translation: Másolat
+
+- id: btn_download
+  translation: Letöltés
+
+# About widget
+
+- id: interests
+  translation: Érdeklődési terület
+
+- id: education
+  translation: Tanulmányok
+  
+# Accomplishments widget
+
+- id: see_certificate
+  translation: Lásd a bizonyítányt
+
+# Experience widget
+
+- id: present
+  translation: Jelenleg
+
+# Publications widget
+
+- id: more_publications
+  translation: További publikációk
+
+# Posts widget
+
+- id: continue_reading
+  translation: OLVASS TOVÁBB
+
+- id: more_posts
+  translation: További posztok
+
+# Talks widget
+
+- id: more_talks
+  translation: Előadások
+
+# Contact widget
+
+- id: contact_name
+  translation: Név
+
+- id: contact_email
+  translation: Email
+
+- id: contact_message
+  translation: Üzenet
+
+- id: contact_send
+  translation: Elküldés
+
+- id: book_appointment
+  translation: Időpont kérése
+
+# Publication/Talk details
+
+- id: abstract
+  translation: Kivonat
+
+- id: publication
+  translation: Publikáció
+
+- id: publication_type
+  translation: Típus
+
+- id: date
+  translation: Dátum
+
+- id: last_updated
+  translation: Utoljára frissítve
+
+- id: event
+  translation: Esemény
+
+- id: location
+  translation: Helyszín
+
+# Filtering
+
+- id: filter_by_type
+  translation: Szűrés
+
+- id: filter_all
+  translation: Mind
+
+# Project details
+
+- id: open_project_site
+  translation: Tovább a projekt oldalára
+
+# Default node titles
+
+- id: posts
+  translation: Posztok
+
+- id: publications
+  translation: Publikációk
+
+- id: talks
+  translation: Előadások
+
+- id: projects
+  translation: Projektek
+
+# Search
+
+- id: search
+  translation: Keresés
+
+- id: search_placeholder
+  translation: Keresés...
+
+- id: search_results
+  translation: találat
+
+- id: search_no_results
+  translation: Nincsen találat
+
+# Error 404
+
+- id: page_not_found
+  translation: Az oldal nem található
+
+- id: 404_recommendations
+  translation: Esetleg ezeket kereste?
+
+# Cookie consent
+
+- id: cookie_message
+  translation: Ez az oldal a legjobb felhasználói élmény érdekében sütiket használ.
+
+- id: cookie_dismiss
+  translation: Rendben
+
+- id: cookie_learn
+  translation: További információk

+ 14 - 12
layouts/_default/single.html

@@ -12,19 +12,21 @@
     </div>
 
     {{ partial "tags.html" . }}
-    {{ partial "page_author.html" . }}
 
-    {{ $related := .Site.RegularPages.Related . | first 5 }}
-    {{ with $related }}
-    <div class="article-widget">
-      <div class="hr-light"></div>
-      <h3>{{ i18n "related" }}</h3>
-      <ul>
-        {{ range . }}
-        <li><a href="{{ .RelPermalink }}">{{ .Title }}</a></li>
-        {{ end }}
-      </ul>
-    </div>
+    {{ if ne .Type "page" }}
+      {{ partial "page_author.html" . }}
+      {{ $related := .Site.RegularPages.Related . | first 5 }}
+      {{ with $related }}
+      <div class="article-widget">
+        <div class="hr-light"></div>
+        <h3>{{ i18n "related" }}</h3>
+        <ul>
+          {{ range . }}
+          <li><a href="{{ .RelPermalink }}">{{ .Title }}</a></li>
+          {{ end }}
+        </ul>
+      </div>
+      {{ end }}
     {{ end }}
 
     {{ if .Site.Params.section_pager }}

+ 29 - 0
layouts/author/list.html

@@ -0,0 +1,29 @@
+{{ partial "header.html" . }}
+{{ partial "navbar.html" . }}
+{{ partial "page_header.html" . }}
+
+<section id="about" class="home-section">
+  <div class="container">
+    {{/* Only show About widget if a profile has been configured for this user. */}}
+    {{ $widget := "widgets/about.html" }}
+    {{ $params := dict "root" $ "page" . "author" .Title }}
+    {{ with $.Site.GetPage (printf "/author/%s" (urlize .Title)) }}
+      {{ partial $widget $params }}
+    {{ end }}
+    <div class="article-widget">
+      <div class="hr-light"></div>
+      <h3>{{ i18n "related" }}</h3>
+      <ul>
+        {{ range .Pages }}
+        <li>
+          <a href="{{ .Permalink }}">{{ .Title }}</a>
+        </li>
+        {{ end }}
+      </ul>
+    </div>
+  </div>
+</section>
+
+<!-- Page Footer -->
+{{ partial "footer_container.html" . }}
+{{ partial "footer.html" . }}

+ 3 - 2
layouts/index.json

@@ -1,9 +1,10 @@
 {{- /* Generate the search index. */ -}}
 {{- $index := slice -}}
 {{- $pages := where .Site.RegularPages "Section" "!=" "home" -}}
+{{- /* Add the index page of docs separately since it's not in RegularPages above. */ -}}
 {{- $pages := $pages | union (where (where .Site.Pages "Kind" "section") "Type" "docs") -}}
-{{- /* TODO: Add author pages to index so their bios can be searched. */ -}}
-{{- /* $pages := $pages | union (where (where .Site.Pages "Kind" "taxonomy") "taxonomyTerm" "author") */ -}}
+{{- /* Add author pages to index so their bios can be searched. */ -}}
+{{- $pages := $pages | union (where $.Site.Pages "Section" "author") -}}
 
 {{- range $pages -}}
   {{- /* Do not index drafts or private pages. */ -}}

+ 112 - 24
layouts/partials/css/academic.css

@@ -26,13 +26,13 @@ body {
   line-height: inherit;
   color: inherit;
   background-color: {{ .Get "background" }};
-  margin-top: 71px; /* Offset body content by navbar height. */
+  margin-top: 70px; /* Offset body content by navbar height. */
   padding-top: 0;
   counter-reset: captions;
 }
 @media screen and (max-width: 1200px) { /* Match max-width of .nav-bar query. */
   body {
-    margin-top: 51px; /* Offset body content by navbar height. */
+    margin-top: 50px; /* Offset body content by navbar height. */
   }
 }
 
@@ -78,7 +78,16 @@ h1, h2, h3, h4, h5, h6 {
   line-height: 1.25;
   color: #313131;
   text-rendering: optimizeLegibility;
-  overflow-wrap: break-word; /* Ensures very long heading words do not overflow into content. */
+
+  /* Ensure long words do not overflow into content. */
+  overflow-wrap: break-word;
+  word-wrap: break-word;
+  word-break: break-word;
+
+  /* Add a hyphen where the word breaks (use `&shy;` to insert a soft-hyphen in a word). */
+  -webkit-hyphens: manual;
+  -ms-hyphens: manual;
+  hyphens: manual;
 }
 h1 {
   font-size: 2.25rem;
@@ -241,6 +250,7 @@ small,
 
 .search-results {
   transform: scale(0);
+  -webkit-transform: scale(0);
   background-color: {{ .Get "background" }};
   bottom: 0;
   left: 0;
@@ -262,6 +272,7 @@ small,
 
 .searching .search-results {
   transform: scale(1);
+  -webkit-transform: scale(1);
   visibility: visible;
   z-index: 11; /* Second highest index, after navbar. */
 }
@@ -271,15 +282,27 @@ small,
 }
 
 .search-results > .container {
-  padding-top: calc(70px + 2rem); /* Max responsive navbar height plus padding. */
+  padding-top: 70px;  /* Navbar height. */
+}
+@media screen and (max-width: 1200px) {
+  .search-results > .container {
+    padding-top: 50px;  /* Navbar height. */
+  }
 }
 
 .search-header {
-  background-color: {{ .Get "background" }};
+  position: -webkit-sticky;
   position: sticky;
-  top: calc(70px + 2rem); /* Max responsive navbar height plus padding. */
+  top: 70px;  /* Navbar height. */
+  background-color: {{ .Get "background" }};
+  padding-top: 2rem;
   padding-bottom: 1rem;
 }
+@media screen and (max-width: 1200px) {
+  .search-header {
+    top: 50px;  /* Navbar height. */
+  }
+}
 
 .dark .search-header {
   background-color: rgb(40, 42, 54);
@@ -472,6 +495,14 @@ a[data-fancybox] img {
   background-color: {{ .Get "home_section_even" }};
 }
 
+.dark .home-section {
+  background-color: {{ .Get "dark_home_section_odd" }};
+}
+
+.dark .home-section:nth-of-type(even) {
+  background-color: {{ .Get "dark_home_section_even" }};
+}
+
 @media screen and (max-width: 768px) {
   .home-section {
     padding: 60px 0 60px 0;
@@ -754,12 +785,6 @@ article {
   box-sizing: border-box;
 }
 
-/* Prevent FA's line height of 1 causing FA button links to be taller than other button links. */
-.btn-links .fab,
-.btn-links .fas {
-  line-height: inherit !important;
-}
-
 .split-header-image {
   position: relative; /* Required for caption positioning */
   clear: both;
@@ -776,6 +801,32 @@ article {
   height: auto;
 }
 
+.featured-image {
+  width: 100%;
+  background-position: left;
+  background-origin: border-box;
+  background-size: cover;
+  height: 60vh;
+  min-height: 500px;
+  -webkit-box-flex: 1;
+  -webkit-flex: 1 0 auto;
+  -ms-flex: 1 0 auto;
+  flex: 1 0 auto
+}
+
+@media screen and (max-width: 1199px) {
+  .featured-image {
+    min-height: 400px;
+    height: auto;
+  }
+}
+
+@media screen and (max-width: 767px) {
+  .featured-image {
+    min-height: 300px;
+  }
+}
+
 .article-header-caption {
   position: absolute;
   bottom: 0;
@@ -1166,6 +1217,30 @@ article .article-metadata {
   z-index: 3;
 }
 
+/*************************************************
+ *  Accomplishments
+ **************************************************/
+ 
+.course {
+  margin-bottom: -0.5rem;
+}
+
+.course h6 {
+  font-size: 0.80rem;
+  font-weight: 700;
+  line-height: 1.5;
+  text-transform: uppercase;
+}
+
+.course h6 a {
+  border-bottom: solid 1px transparent;
+}
+
+.course h6 a:hover {
+  border-bottom: solid 1px;
+  text-decoration: none;
+}
+
 /*************************************************
  *  Card component
  **************************************************/
@@ -1381,8 +1456,13 @@ a.badge:hover {
   border-radius: .3rem;
 }
 
+.btn-links .btn {
+  padding: 5px .5rem 5px .5rem;
+  line-height: 1;
+}
+
 .btn.btn-sm {
-  padding: .4rem;
+  padding: 5px .4rem 5px .4rem;
   font-size: .6rem;
   border-radius: .2rem;
 }
@@ -1734,7 +1814,7 @@ table > tbody > tr:hover > th {
  *  Alerts
  **************************************************/
 
-div.alert p {
+div.alert > div {
   position: relative;
   display: block;
   font-size: 1rem;
@@ -1743,7 +1823,15 @@ div.alert p {
   margin-bottom: 0;
 }
 
-div.alert p:first-child::before {
+div.alert div > * {
+  margin-bottom: .5rem;  /* Use smaller paragraph spacing than usual. */
+}
+
+div.alert div > :last-child {
+  margin-bottom: 0;
+}
+
+div.alert > div:first-child::before {
   position: absolute;
   top: -0.5rem;
   left: -2rem;
@@ -1756,7 +1844,7 @@ div.alert p:first-child::before {
   text-align: center;
 }
 
-div.alert-warning p:first-child::before {
+div.alert-warning > div:first-child::before {
   font-family: 'Font Awesome 5 Free';
   font-weight: 900;
   color: #ff3860;
@@ -1847,9 +1935,9 @@ div.alert a {
     .docs-sidebar {
       position: -webkit-sticky;
       position: sticky;
-      top: 51px;
+      top: 50px;
       z-index: 10;
-      height: calc(100vh - 51px)
+      height: calc(100vh - 50px)
     }
   }
 }
@@ -1862,9 +1950,9 @@ div.alert a {
     .docs-sidebar {
       position: -webkit-sticky;
       position: sticky;
-      top: 71px;
+      top: 70px;
       z-index: 10;
-      height: calc(100vh - 71px)
+      height: calc(100vh - 70px)
     }
   }
 }
@@ -1917,7 +2005,7 @@ div.alert a {
 @media (min-width:768px) {
   @supports ((position:-webkit-sticky) or (position:sticky)) {
     .docs-links {
-      max-height: calc(100vh - 5rem - 71px);
+      max-height: calc(100vh - 5rem - 70px);
       overflow-y: auto;
     }
   }
@@ -1942,8 +2030,8 @@ div.alert a {
   .docs-toc {
     position: -webkit-sticky;
     position: sticky;
-    top: 71px;
-    height: calc(100vh - 71px);
+    top: 70px;
+    height: calc(100vh - 70px);
     overflow-y: auto
   }
 }
@@ -2049,7 +2137,7 @@ body.dark,
 .dark .form-control,
 .dark .form-control:focus {
   color: rgb(248, 248, 242);
-  background: rgb(40, 42, 54);
+  background: {{ .Get "dark_background" }};
 }
 
 .dark .form-control {

+ 23 - 5
layouts/partials/css/parse_theme.css

@@ -21,12 +21,32 @@
 
   {{- $scr.Set "light" $theme.light -}}
 
-  {{ if $theme.background }}
+  {{ if and $theme.background $theme.light }}
     {{- $scr.Set "background" $theme.background -}}
-  {{ else if $theme.light }}
+  {{ else }}
     {{- $scr.Set "background" "#fff" -}}
+  {{ end }}
+
+  {{ if and $theme.background (not $theme.light) }}
+    {{- $scr.Set "dark_background" $theme.background -}}
+  {{ else }}
+    {{- $scr.Set "dark_background" "rgb(40, 42, 54)" -}}
+  {{ end }}
+
+  {{ if $theme.light }}
+    {{- $scr.Set "home_section_odd" $theme.home_section_odd -}}
+    {{- $scr.Set "home_section_even" $theme.home_section_even -}}
+  {{ else }}
+    {{- $scr.Set "home_section_odd" "rgb(255, 255, 255)" -}}
+    {{- $scr.Set "home_section_even" "rgb(247, 247, 247)" -}}
+  {{ end }}
+
+  {{ if not $theme.light }}
+    {{- $scr.Set "dark_home_section_odd" $theme.home_section_odd -}}
+    {{- $scr.Set "dark_home_section_even" $theme.home_section_even -}}
   {{ else }}
-    {{- $scr.Set "background" "rgb(40, 42, 54)" -}}
+    {{- $scr.Set "dark_home_section_odd" "hsla(231, 15%, 18%, 1)" -}}
+    {{- $scr.Set "dark_home_section_even" "hsla(231, 15%, 16%, 1)" -}}
   {{ end }}
 
   {{ if $theme.link }}
@@ -50,6 +70,4 @@
   {{- $scr.Set "menu_text_active" $theme.menu_text_active -}}
   {{- $scr.Set "menu_title" $theme.menu_title -}}
 
-  {{- $scr.Set "home_section_odd" $theme.home_section_odd -}}
-  {{- $scr.Set "home_section_even" $theme.home_section_even -}}
 {{ end }}

+ 12 - 6
layouts/partials/footer.html

@@ -55,7 +55,7 @@
     {{ if ne .Site.Params.search.engine 0 }}
     {{/* Configure search engine. */}}
     <script>
-      const search_index_filename = {{ "/index.json" | relURL }};
+      const search_index_filename = {{ "/index.json" | relLangURL }};
       const i18n = {
         'placeholder': {{ i18n "search_placeholder" }},
         'results': {{ i18n "search_results" }},
@@ -132,14 +132,20 @@
     {{ $js_academic := resources.Get "js/academic.js" }}
     {{ $js_academic_search := resources.Get "js/academic-search.js" }}
     {{ $js_algolia_search := resources.Get "js/algolia-search.js" }}
-    {{ $js_bundle := slice $js_academic $js_academic_search }}
+    {{ $js_bundle := slice }}
+    {{ if eq .Site.Params.search.engine 1 }}
+      {{ $js_bundle = slice $js_academic $js_academic_search }}
+    {{ else if eq $.Site.Params.search.engine 2 }}
+      {{ $js_bundle = slice $js_academic $js_algolia_search }}
+    {{ else }}
+      {{ $js_bundle = slice $js_academic }}
+    {{ end }}
+    {{ range .Site.Params.plugins_js }}
+      {{ $js_bundle = $js_bundle | append (resources.Get (printf "js/%s.js" .)) }}
+    {{ end }}
     {{ $js_bundle := $js_bundle | resources.Concat "js/academic-bundle-pre.js" | minify }}
     {{ $js_bundle := slice $js_bundle_head $js_bundle | resources.Concat "js/academic.min.js" | fingerprint "md5" }}
     <script src="{{ $js_bundle.RelPermalink }}"></script>
 
-    {{ range .Site.Params.custom_js }}
-    <script src="{{ "/js/" | relURL }}{{ . }}"></script>
-    {{ end }}
-
   </body>
 </html>

+ 43 - 14
layouts/partials/header.html

@@ -7,9 +7,22 @@
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="generator" content="Source Themes Academic {{ .Site.Data.academic.version }}">
   {{ .Hugo.Generator }}
-  {{ with .Site.Params.name }}<meta name="author" content="{{ . }}">{{ end }}
 
   {{ $scr := .Scratch }}
+
+  {{/* Attempt to load superuser. */}}
+  {{ $superuser_name := "" }}
+  {{ $superuser_username := "" }}
+  {{ $superuser_role := "" }}
+  {{ range first 1 (where (where $.Site.Pages "Section" "author") "Params.superuser" true) }}
+    {{ $superuser_name = .Params.name }}
+    {{ $superuser_username = delimit (last 1 (split (substr .File.Dir 0 -1) "/")) "" }}
+    {{ $superuser_role = .Params.role }}
+  {{ end }}
+  {{ $scr.Set "superuser_username" $superuser_username }}{{/* For access from page_author.html. */}}
+
+  {{ with $superuser_name }}<meta name="author" content="{{ . }}">{{ end }}
+
   {{/* Generate page description. */}}
   {{ $desc := "" }}
   {{ if .Params.summary }}
@@ -21,7 +34,7 @@
   {{ else if .Site.Params.description }}
     {{ $desc = .Site.Params.description }}
   {{ else }}
-    {{ $desc = .Site.Params.role }}
+    {{ $desc = $superuser_role }}
   {{ end }}
   <meta name="description" content="{{ $desc }}">
 
@@ -88,8 +101,16 @@
   {{ end }}
 
   <link rel="stylesheet" href="{{ "styles.css" | relLangURL }}">
-  {{ range .Site.Params.custom_css }}
-  <link rel="stylesheet" href="{{ "/css/" | relURL }}{{ . }}">
+  {{ if .Site.Params.plugins_css }}
+    {{ $css_comment := printf "/* Source Themes Academic v%s | https://sourcethemes.com/academic/ */\n" .Site.Data.academic.version }}
+    {{ $css_bundle_head := $css_comment | resources.FromString "css/bundle-head.css" }}
+    {{ $css_bundle := slice }}
+    {{ range .Site.Params.plugins_css }}
+      {{ $css_bundle = $css_bundle | append (resources.Get (printf "css/%s.css" .)) }}
+    {{ end }}
+    {{ $css_bundle := $css_bundle | resources.Concat "css/academic-bundle-pre.css" | minify }}
+    {{ $css_bundle := slice $css_bundle_head $css_bundle | resources.Concat "css/academic.css" | fingerprint "md5" }}
+    <link rel="stylesheet" href="{{ $css_bundle.RelPermalink }}">
   {{ end }}
 
   {{ if not .Site.IsServer }}
@@ -121,7 +142,23 @@
 
   <link rel="canonical" href="{{ .Permalink }}">
 
-  <meta property="twitter:card" content="summary_large_image">
+  {{ $featured_image := (.Resources.ByType "image").GetMatch "*featured*" }}
+  {{ $og_image := "" }}
+  {{ $twitter_card := "summary_large_image" }}
+  {{ if $featured_image }}
+    {{ $og_image = $featured_image.Permalink }}
+  {{ else if .Params.header.image }}
+    {{ $og_image = printf "img/%s" .Params.header.image | absURL }}
+  {{ else if .Site.Params.sharing_image }}
+    {{ $og_image = printf "img/%s" .Site.Params.sharing_image | absURL }}
+  {{ else if .Site.Params.avatar }}
+    {{ $og_image = (printf "img/%s" $.Site.Params.avatar) | absURL }}
+    {{ $twitter_card = "summary" }}
+  {{ else }}
+    {{ $og_image = "img/icon-192.png" | absURL }}
+    {{ $twitter_card = "summary" }}
+  {{ end }}
+  <meta property="twitter:card" content="{{ $twitter_card }}">
   {{ with .Site.Params.twitter }}
   <meta property="twitter:site" content="@{{ . }}">
   <meta property="twitter:creator" content="@{{ . }}">
@@ -130,15 +167,7 @@
   <meta property="og:url" content="{{ .Permalink }}">
   <meta property="og:title" content="{{ if not .IsHome }}{{ .Title }} | {{ end }}{{ .Site.Title }}">
   <meta property="og:description" content="{{ $desc }}">
-  {{ $og_image := "" }}
-  {{ if .Params.header.image }}
-    {{ $og_image = .Params.header.image }}
-  {{ else if .Site.Params.sharing_image }}
-    {{ $og_image = .Site.Params.sharing_image }}
-  {{ else }}
-    {{ $og_image = "icon-192.png" }}
-  {{ end }}
-  {{- with $og_image }}<meta property="og:image" content="{{ printf "img/%s" . | absURL }}">{{end}}
+  {{- with $og_image }}<meta property="og:image" content="{{ . }}">{{end}}
   <meta property="og:locale" content="{{ .Site.LanguageCode | default "en-us" }}">
   {{ if .IsPage }}
   {{ if not .PublishDate.IsZero }}<meta property="article:published_time" content="{{ .PublishDate.Format "2006-01-02T15:04:05-07:00" | safeHTML }}">

+ 9 - 2
layouts/partials/navbar.html

@@ -20,7 +20,7 @@
     <div class="collapse navbar-collapse" id="navbar">
 
       <!-- Left Nav Bar -->
-      {{ $align_right := .Site.Params.menus.align_right | default true }}
+      {{ $align_right := .Site.Params.menu_align_right | default true }}
       <ul class="navbar-nav {{ if $align_right }}ml-auto{{ else }}mr-auto{{ end }}">
         {{ range .Site.Menus.main }}
 
@@ -66,7 +66,7 @@
         {{ end }}
         {{ end }}
 
-      {{ if and (not $align_right) (or .IsTranslated .Site.Menus.main_right) }}
+      {{ if not $align_right | and (.IsTranslated | or .Site.Menus.main_right | or .Site.Params.search.engine | or .Site.Params.day_night) }}
       </ul>
       <ul class="navbar-nav ml-auto">
       {{ end }}
@@ -114,6 +114,13 @@
           </ul>
         </li>
         {{ end }}
+
+        {{ if .Site.Params.day_night }}
+        <li class="nav-item">
+          <a class="nav-link js-dark-toggle" href="#"><i class="fas fa-moon" aria-hidden="true"></i></a>
+        </li>
+        {{ end }}
+
       </ul>
 
     </div><!-- /.navbar-collapse -->

+ 27 - 13
layouts/partials/page_author.html

@@ -1,24 +1,38 @@
 {{ if not (or (eq .Site.Params.profile false) (eq .Params.profile false)) }}
 
-{{ $author := "" }}
-{{ if .Params.authors }}
-  {{ $author = index .Params.authors 0 }}
+{{/* Display superuser if superuser exists and page authors are not explicitly specified. */}}
+{{/* Otherwise, display first author if a profile for them exists. */}}
+
+{{ $author_urlize := "" }}
+{{ if and (not .Params.authors) (.Scratch.Get "superuser_username") }}
+  {{ $author_urlize = (.Scratch.Get "superuser_username") }}
+{{ else }}
+  {{ $first_author := "" }}
+  {{ if .Params.authors }}
+    {{ $first_author = index .Params.authors 0 }}
+  {{ end }}
+  {{ $author_urlize = urlize $first_author }}
 {{ end }}
 
-{{/* Display site author if page authors not explicitly specified or if first page author is site author. */}}
-{{ if or (not .Params.authors) (eq $author $.Site.Params.name) }}
+{{ $person_page_path := (printf "/author/%s" $author_urlize) }}
+{{ $person_page := $.Site.GetPage $person_page_path }}
+{{ with $person_page }}
+{{ $link := printf "/authors/%s" $author_urlize | relURL }}
+{{ $avatar := ($person_page.Resources.ByType "image").GetMatch "*avatar*" }}
 <div class="media author-card" itemscope itemtype="http://schema.org/Person">
-  {{ if $.Site.Params.gravatar }}
-  <img class="portrait mr-3" src="https://s.gravatar.com/avatar/{{ md5 $.Site.Params.email }}?s=200')" itemprop="image" alt="Avatar">
-  {{ else if $.Site.Params.avatar }}
-  <img class="portrait mr-3" src="{{ (printf "img/%s" $.Site.Params.avatar) | relURL }}" itemprop="image" alt="Avatar">
+  {{ if and $.Site.Params.gravatar .Params.email }}
+  <img class="portrait mr-3" src="https://s.gravatar.com/avatar/{{ md5 .Params.email }}?s=200')" itemprop="image" alt="Avatar">
+  {{ else if $avatar }}
+  {{ $avatar_image := $avatar.Fill "250x250 Center" }}
+  <img class="portrait mr-3" src="{{ $avatar_image.RelPermalink }}" itemprop="image" alt="Avatar">
   {{ end }}
+
   <div class="media-body">
-    <h5 class="card-title" itemprop="name"><a href="{{ "/" | relLangURL }}">{{ $.Site.Params.name }}</a></h5>
-    {{ with $.Site.Params.role }}<h6 class="card-subtitle">{{.}}</h6>{{end}}
-    {{ with $.Site.Params.bio }}<p class="card-text" itemprop="description">{{. | markdownify | emojify}}</p>{{end}}
+    <h5 class="card-title" itemprop="name"><a href="{{ $link }}">{{ .Params.name }}</a></h5>
+    {{ with .Params.role }}<h6 class="card-subtitle">{{.}}</h6>{{end}}
+    {{ with .Params.bio }}<p class="card-text" itemprop="description">{{. | markdownify | emojify}}</p>{{end}}
     <ul class="network-icon" aria-hidden="true">
-      {{ range $.Site.Params.social }}
+      {{ range .Params.social }}
       {{ $pack := or .icon_pack "fas" }}
       {{ $pack_prefix := $pack }}
       {{ if in (slice "fab" "fas" "far" "fal") $pack }}

+ 2 - 2
layouts/partials/page_header.html

@@ -30,9 +30,9 @@
 
 {{/* Featured image */}}
 {{ if and $featured (not .Params.image.preview_only) }}
-{{ $image := $featured.Fill (printf "1600x400 q90 %s" $anchor) }}
+{{ $image := $featured.Resize "800x" }}
 <div class="article-header d-xl-none">
-  <img src="{{ $image.RelPermalink }}" class="article-banner" itemprop="image" alt="">
+  <div class="featured-image" style="background-image: url('{{ $image.RelPermalink }}');"></div>
   {{ with $.Params.image.caption }}<span class="article-header-caption">{{ . | markdownify | emojify }}</span>{{ end }}
 </div>
 

+ 50 - 34
layouts/partials/page_links.html

@@ -1,21 +1,20 @@
 {{ $is_list := .is_list }}
 {{ $ := .content }}
+{{ $link := "" }}
 
 {{ with $.Params.url_preprint }}
-{{ $link := . }}
-{{ if not (urls.Parse .).Scheme }}
-{{ $link = (printf "%s%s" $.Dir .) | relURL }}
-{{ end }}
+  {{ $resource := $.Resources.GetMatch . }}
+  {{ if $resource }}
+    {{ $link = $resource.RelPermalink }}
+  {{ else }}
+    {{ $link = . | relURL }}
+  {{ end }}
 <a class="btn btn-outline-primary my-1 mr-1{{ if $is_list }} btn-sm{{end}}" href="{{ $link }}" target="_blank" rel="noopener">
   {{ i18n "btn_preprint" }}
 </a>
 {{ end }}
 {{ $pdf := "" }}
-{{ $slug := "" }}
-{{ if eq $.File.TranslationBaseName "index" }}{{/* Check if using dir-based page bundles. */}}
-  {{ $slug = delimit (last 1 (split (substr $.Dir 0 -1) "/")) "" }}
-{{ end }}
-{{ $resource := $.Resources.GetMatch (printf "%s.pdf" $slug) }}
+{{ $resource := $.Resources.GetMatch (printf "%s.pdf" $.File.ContentBaseName) }}
 {{ with $resource }}
   {{ $pdf = .RelPermalink }}
 {{ else }}
@@ -36,19 +35,23 @@
 </button>
 {{ end }}
 {{ with $.Params.url_code }}
-{{ $link := . }}
-{{ if not (urls.Parse .).Scheme }}
-{{ $link = (printf "%s%s" $.Dir .) | relURL }}
-{{ end }}
+  {{ $resource := $.Resources.GetMatch . }}
+  {{ if $resource }}
+    {{ $link = $resource.RelPermalink }}
+  {{ else }}
+    {{ $link = . | relURL }}
+  {{ end }}
 <a class="btn btn-outline-primary my-1 mr-1{{ if $is_list }} btn-sm{{end}}" href="{{ $link }}" target="_blank" rel="noopener">
   {{ i18n "btn_code" }}
 </a>
 {{ end }}
 {{ with $.Params.url_dataset }}
-{{ $link := . }}
-{{ if not (urls.Parse .).Scheme }}
-{{ $link = (printf "%s%s" $.Dir .) | relURL }}
-{{ end }}
+  {{ $resource := $.Resources.GetMatch . }}
+  {{ if $resource }}
+    {{ $link = $resource.RelPermalink }}
+  {{ else }}
+    {{ $link = . | relURL }}
+  {{ end }}
 <a class="btn btn-outline-primary my-1 mr-1{{ if $is_list }} btn-sm{{end}}" href="{{ $link }}" target="_blank" rel="noopener">
   {{ i18n "btn_dataset" }}
 </a>
@@ -71,10 +74,12 @@
 {{ end }}
 {{ end }}
 {{ with $.Params.url_poster }}
-{{ $link := . }}
-{{ if not (urls.Parse .).Scheme }}
-{{ $link = (printf "%s%s" $.Dir .) | relURL }}
-{{ end }}
+  {{ $resource := $.Resources.GetMatch . }}
+  {{ if $resource }}
+    {{ $link = $resource.RelPermalink }}
+  {{ else }}
+    {{ $link = . | relURL }}
+  {{ end }}
 <a class="btn btn-outline-primary my-1 mr-1{{ if $is_list }} btn-sm{{end}}" href="{{ $link }}" target="_blank" rel="noopener">
   {{ i18n "btn_poster" }}
 </a>
@@ -87,29 +92,35 @@
   {{ end }}
 {{ else }}
 {{ with $.Params.url_slides }}
-{{ $link := . }}
-{{ if not (urls.Parse .).Scheme }}
-{{ $link = (printf "%s%s" $.Dir .) | relURL }}
-{{ end }}
+  {{ $resource := $.Resources.GetMatch . }}
+  {{ if $resource }}
+    {{ $link = $resource.RelPermalink }}
+  {{ else }}
+    {{ $link = . | relURL }}
+  {{ end }}
 <a class="btn btn-outline-primary my-1 mr-1{{ if $is_list }} btn-sm{{end}}" href="{{ $link }}" target="_blank" rel="noopener">
   {{ i18n "btn_slides" }}
 </a>
 {{ end }}
 {{ end }}
 {{ with $.Params.url_video }}
-{{ $link := . }}
-{{ if not (urls.Parse .).Scheme }}
-{{ $link = (printf "%s%s" $.Dir .) | relURL }}
-{{ end }}
+  {{ $resource := $.Resources.GetMatch . }}
+  {{ if $resource }}
+    {{ $link = $resource.RelPermalink }}
+  {{ else }}
+    {{ $link = . | relURL }}
+  {{ end }}
 <a class="btn btn-outline-primary my-1 mr-1{{ if $is_list }} btn-sm{{end}}" href="{{ $link }}" target="_blank" rel="noopener">
   {{ i18n "btn_video" }}
 </a>
 {{ end }}
 {{ with $.Params.url_source }}
-{{ $link := . }}
-{{ if not (urls.Parse .).Scheme }}
-{{ $link = (printf "%s%s" $.Dir .) | relURL }}
-{{ end }}
+  {{ $resource := $.Resources.GetMatch . }}
+  {{ if $resource }}
+    {{ $link = $resource.RelPermalink }}
+  {{ else }}
+    {{ $link = . | relURL }}
+  {{ end }}
 <a class="btn btn-outline-primary my-1 mr-1{{ if $is_list }} btn-sm{{end}}" href="{{ $link }}" target="_blank" rel="noopener">
   {{ i18n "btn_source" }}
 </a>
@@ -129,7 +140,12 @@
   {{ $scheme := (urls.Parse $link).Scheme }}
   {{ $target := "" }}
   {{ if not $scheme }}
-    {{ $link = (printf "%s%s" $.Dir .url) | relURL }}
+    {{ $resource := $.Resources.GetMatch .url }}
+    {{ if $resource }}
+      {{ $link = $resource.RelPermalink }}
+    {{ else }}
+      {{ $link = .url | relURL }}
+    {{ end }}
   {{ else if in (slice "http" "https") $scheme }}
     {{ $target = "target=\"_blank\" rel=\"noopener\"" }}
   {{ end }}

+ 21 - 14
layouts/partials/page_metadata.html

@@ -1,36 +1,43 @@
 {{ $is_list := .is_list }}
 {{ $ := .content }}
+
+<meta content="{{ $.Params.Date }}" itemprop="datePublished">
+<meta content="{{ $.Params.LastMod }}" itemprop="dateModified">
+
 <div class="article-metadata">
 
   {{/* If `authors` is set and is not empty. */}}
   {{ if $.Params.authors }}
   {{ $authorLen := len $.Params.authors }}
+  {{ if gt $authorLen 0 }}
   <div>
     {{ range $k, $v := $.Params.authors -}}
     <span itemscope itemprop="author" itemtype="http://schema.org/Person">
-      <span itemprop="name">{{- $v | markdownify -}}</span>
+      <span itemprop="name">
+        {{with $.Site.GetPage (printf "/authors/%s" $v) }}{{ printf "<a href=\"%s\">" .RelPermalink | safeHTML }}{{end}}
+        {{- $v | markdownify -}}
+        {{with $.Site.GetPage (printf "/authors/%s" $v) }}{{ printf "</a>" | safeHTML }}{{end}}
+      </span>
     </span>
     {{- if lt $k (sub $authorLen 1) -}}, {{ end }}
     {{ end }}
   </div>
-  {{ else }}
-  <span itemscope itemprop="author" itemtype="http://schema.org/Person">
-    <meta itemprop="name" content="{{ $.Site.Params.name }}">
-  </span>
+  {{ end }}
   {{ end }}
 
+  {{ if not (in (slice "talk" "page") $.Type) }}
   <span class="article-date">
-    {{ if ne $.Params.Lastmod $.Params.Date }}
-        {{ i18n "last_updated" }}
+    {{ $date := $.Lastmod.Format $.Site.Params.date_format }}
+    {{ if eq $.Type "publication" }}
+      {{ $date = $.Date.Format ($.Site.Params.publications.date_format | default "January, 2006") }}
+    {{ else }}
+      {{ if ne $.Params.Lastmod $.Params.Date }}
+          {{ i18n "last_updated" }}
+      {{ end }}
     {{ end }}
-    <meta content="{{ $.Params.Date }}" itemprop="datePublished">
-    <time datetime="{{ $.Params.LastMod }}" itemprop="dateModified">
-      {{ $.Lastmod.Format $.Site.Params.date_format }}
-    </time>
-  </span>
-  <span itemscope itemprop="publisher" itemtype="http://schema.org/Person">
-    <meta itemprop="name" content="{{ $.Site.Params.name }}">
+    <time>{{ $date }}</time>
   </span>
+  {{ end }}
 
   {{ if and (eq $.Type "post") (not (or (eq $.Site.Params.reading_time false) (eq $.Params.reading_time false))) }}
   <span class="middot-divider"></span>

+ 1 - 1
layouts/partials/project_li_showcase.html

@@ -19,7 +19,7 @@
 {{ $js_tag_classes := delimit (apply (apply $item.Params.tags "replace" "." " " "-") "printf" "js-id-%s" ".") " " }}
 
 <div class="col-lg-12 project-item isotope-item {{ $js_tag_classes | safeHTMLAttr }}" itemscope itemtype="http://schema.org/CreativeWork">
-  <div class="row align-items-center" itemscope itemtype="http://schema.org/Event">
+  <div class="row align-items-center">
     <div class="col-12 col-md-6">
       <h3 class="article-title mb-0 mt-0" itemprop="name">
         {{- if $do_link}}<a href="{{ $link }}" {{ $target | safeHTMLAttr }} itemprop="url">{{end -}}

+ 1 - 0
layouts/partials/pub_types.html

@@ -0,0 +1 @@
+{{ $.Scratch.Set "pub_types" (slice (i18n "pub_uncat" | default "Uncategorized") (i18n "pub_conf" | default "Conference paper") (i18n "pub_journal" | default "Journal article") (i18n "pub_manuscript" | default "Manuscript") (i18n "pub_report" | default "Report") (i18n "pub_book" | default "Book") (i18n "pub_book_section" | default "Book section") ) }}

+ 1 - 1
layouts/partials/publication_li_stream.html

@@ -1,4 +1,4 @@
-<div class="media stream-item" itemscope itemtype="http://schema.org/Event">
+<div class="media stream-item" itemscope itemtype="http://schema.org/ScholarlyArticle">
   <div class="media-body">
 
     <h3 class="article-title mb-0 mt-0" itemprop="name">

+ 1 - 1
layouts/partials/search.html

@@ -1,6 +1,6 @@
 <aside class="search-results" id="search">
   <div class="container">
-    <section class="search-header fixed-top">
+    <section class="search-header">
 
       <div class="row no-gutters justify-content-between mb-3">
         <div class="col-6">

+ 1 - 1
layouts/partials/talk_li_detailed.html

@@ -18,7 +18,7 @@
   <div class="talk-metadata" itemprop="startDate">
     {{ $date := .Params.time_start | default .Date }}
     {{ (time $date).Format $.Site.Params.date_format }}
-    {{ if $.Site.Params.talks.time }}
+    {{ if not .Params.all_day }}
       {{ (time $date).Format ($.Site.Params.time_format | default "3:04 PM") }}
       {{ with .Params.time_end }}
         &mdash; {{ (time .).Format ($.Site.Params.time_format | default "3:04 PM") }}

+ 1 - 1
layouts/partials/talk_li_simple.html

@@ -4,7 +4,7 @@
   <div itemprop="startDate">
     {{ $date := .Params.time_start | default .Date }}
     {{ (time $date).Format $.Site.Params.date_format }}
-    {{ if $.Site.Params.talks.time }}
+    {{ if not .Params.all_day }}
       {{ (time $date).Format ($.Site.Params.time_format | default "3:04 PM") }}
     {{ end }}
   </div>

+ 1 - 1
layouts/partials/talk_li_stream.html

@@ -23,7 +23,7 @@
       <div>
         {{ $date := .Params.time_start | default .Date }}
         {{ (time $date).Format $.Site.Params.date_format }}
-        {{ if $.Site.Params.talks.time }}
+        {{ if not .Params.all_day }}
           {{ (time $date).Format ($.Site.Params.time_format | default "3:04 PM") }}
           {{ with .Params.time_end }}
             &mdash; {{ (time .).Format ($.Site.Params.time_format | default "3:04 PM") }}

+ 32 - 22
layouts/partials/widgets/about.html

@@ -1,31 +1,38 @@
 {{ $ := .root }}
 {{ $page := .page }}
 
+{{ $author := "" }}
+{{ if .author }}
+  {{ $author = .author }}
+{{ else }}
+  {{ $author = $page.Params.author }}
+{{end}}
+
+{{ $person_page_path := (printf "/author/%s" (urlize $author)) }}
+{{ $person_page := $.Site.GetPage $person_page_path }}
+{{ if not $person_page }}
+  {{ errorf "Could not find an author page at `%s`. Please check the value of `author` in your About widget and create an associated author page if one does not already exist." $person_page_path }}
+{{end}}
+{{ $person := $person_page.Params }}
+{{ $avatar := ($person_page.Resources.ByType "image").GetMatch "*avatar*" }}
+
 <!-- About widget -->
 <div class="row" itemprop="author" itemscope itemtype="http://schema.org/Person" itemref="{{ if $.Site.Params.email }}person-email{{ end }}{{ if $.Site.Params.phone }} person-telephone{{ end }}{{ if $.Site.Params.address}} person-address{{ end }}">
   <div class="col-12 col-lg-4">
     <div id="profile">
 
       {{ if $.Site.Params.gravatar }}
-      <img class="portrait" src="https://s.gravatar.com/avatar/{{ md5 $.Site.Params.email }}?s=200')" itemprop="image" alt="Avatar">
-      {{ else if $.Site.Params.avatar }}
-      <img class="portrait" src="{{ (printf "img/%s" $.Site.Params.avatar) | relURL }}" itemprop="image" alt="Avatar">
+      <img class="portrait" src="https://s.gravatar.com/avatar/{{ md5 $person.email }}?s=200')" itemprop="image" alt="Avatar">
+      {{ else if $avatar }}
+      {{ $avatar_image := $avatar.Fill "250x250 Center" }}
+      <img class="portrait" src="{{ $avatar_image.RelPermalink }}" itemprop="image" alt="Avatar">
       {{ end }}
 
       <div class="portrait-title">
-        <h2 itemprop="name">{{ $.Site.Params.name }}</h2>
-        {{ with $.Site.Params.role }}<h3 itemprop="jobTitle">{{ . }}</h3>{{ end }}
+        <h2 itemprop="name">{{ $person.name }}</h2>
+        {{ with $person.role }}<h3 itemprop="jobTitle">{{ . }}</h3>{{ end }}
 
-        {{/* Support legacy `organization` option. */}}
-        {{ if $.Site.Params.organization }}
-        <h3 itemprop="worksFor" itemscope itemtype="http://schema.org/Organization">
-          {{ with $.Site.Params.organization_url }}<a href="{{ . }}" target="_blank" itemprop="url" rel="noopener">{{ end }}
-            <span itemprop="name">{{ $.Site.Params.organization }}</span>
-          {{ if $.Site.Params.organization_url }}</a>{{ end }}
-        </h3>
-        {{ end }}
-
-        {{ range $.Site.Params.organizations }}
+        {{ range $person.organizations }}
         <h3 itemprop="worksFor" itemscope itemtype="http://schema.org/Organization">
           {{ with .url }}<a href="{{ . }}" target="_blank" itemprop="url" rel="noopener">{{ end }}
           <span itemprop="name">{{ .name }}</span>
@@ -34,10 +41,10 @@
         {{ end }}
       </div>
 
-      <link itemprop="url" href="{{ $.Site.BaseURL }}">
+      <link itemprop="url" href="{{ .Permalink }}">
 
       <ul class="network-icon" aria-hidden="true">
-        {{ range $.Site.Params.social }}
+        {{ range $person.social }}
         {{ $pack := or .icon_pack "fas" }}
         {{ $pack_prefix := $pack }}
         {{ if in (slice "fab" "fas" "far" "fal") $pack }}
@@ -63,22 +70,25 @@
   </div>
   <div class="col-12 col-lg-8" itemprop="description">
 
-    {{ $page.Content }}
+    {{/* Only display widget title in explicit instances of about widget, not in author pages. */}}
+    {{ if and $page.Params.widget $page.Title }}<h1>{{ $page.Title | markdownify | emojify }}</h1>{{ end }}
+
+    {{ $person_page.Content }}
 
     <div class="row">
 
-      {{ with $page.Params.interests }}
+      {{ with $person.interests }}
       <div class="col-md-5">
         <h3>{{ i18n "interests" | markdownify }}</h3>
         <ul class="ul-interests">
-          {{ range .interests }}
-          <li>{{ . | markdownify }}</li>
+          {{ range . }}
+          <li>{{ . | markdownify | emojify }}</li>
           {{ end }}
         </ul>
       </div>
       {{ end }}
 
-      {{ with $page.Params.education }}
+      {{ with $person.education }}
       <div class="col-md-7">
         <h3>{{ i18n "education" | markdownify }}</h3>
         <ul class="ul-edu fa-ul">

+ 53 - 0
layouts/partials/widgets/accomplishments.html

@@ -0,0 +1,53 @@
+{{ $ := .root }}
+{{ $page := .page }}
+
+<!-- Accomplishments widget -->
+<div class="row">
+  <div class="col-12 col-lg-4 section-heading">
+    <h1>{{ with $page.Title }}{{ . | markdownify }}{{ end }}</h1>
+    {{ with $page.Params.subtitle }}<p>{{ . | markdownify }}</p>{{ end }}
+  </div>
+  <div class="col-12 col-lg-8">
+    {{ with $page.Content }}<p>{{ . | markdownify }}</p>{{ end }}
+
+    {{ if $page.Params.item }}
+    {{ range $idx, $key := sort $page.Params.item ".date_start" "desc" }}
+    <div class="row experience">
+      <!-- Content -->
+      <div class="col py-2">
+        <div class="card course">
+          <div class="card-body">
+            <div class="float-right text-muted exp-meta">
+              <div class="text-right">
+                {{ (time .date_start).Format ($page.Params.date_format | default "Jan 2006") }}
+                {{ if .date_end}}
+                – {{ (time .date_end).Format ($page.Params.date_format | default "Jan 2006") }}
+                {{end}}
+              </div>
+              <div class="text-right">
+                {{ if .certificate_url }}
+                <h6 class="card-title exp-company text-muted my-0">
+                  <a href="{{.certificate_url}}" target="_blank" rel="noopener">
+                    {{ i18n "see_certificate" | default "See certificate" }}
+                  </a>
+                </h6>
+                {{ end }}
+              </div>
+            </div>
+            <h4 class="card-title exp-title text-muted mt-0 mb-1">{{.title | markdownify | emojify}}</h4>
+            <h4 class="card-title exp-company text-muted my-0">
+              {{- with .organization_url}}<a href="{{.}}" target="_blank" rel="noopener">{{end}}
+                {{.organization | markdownify | emojify}}
+              {{with .organization_url}}</a>{{end -}}
+            </h4>
+            {{with .description}}
+            <div class="card-text">{{. | markdownify | emojify}}</div>
+            {{end}}
+          </div>
+        </div>
+      </div>
+    </div>
+    {{end}}
+    {{end}}
+  </div>
+</div>

+ 26 - 34
layouts/partials/widgets/contact.html

@@ -60,24 +60,6 @@
       </li>
       {{ end }}
 
-      {{ with $.Site.Params.discussion }}
-      <li>
-        <i class="fa-li fas fa-comments fa-2x" aria-hidden="true"></i>
-        <span>
-          <a href="{{ .url }}" target="_blank" rel="noopener">{{ .name }}</a>
-        </span>
-      </li>
-      {{ end }}
-
-      {{ with $.Site.Params.keybase }}
-      <li>
-        <i class="fa-li fab fa-keybase fa-2x" aria-hidden="true"></i>
-        <span>
-          <a href="https://keybase.io/{{ . }}" target="_blank" rel="noopener">@{{ . }}</a> on Keybase.
-        </span>
-      </li>
-      {{ end }}
-
       {{ with $.Site.Params.phone }}
       <li>
         <i class="fa-li fas fa-phone fa-2x" aria-hidden="true"></i>
@@ -87,35 +69,45 @@
       </li>
       {{ end }}
 
-      {{ with $.Site.Params.skype }}
+      {{ with $.Site.Params.address }}
       <li>
-        <i class="fa-li fab fa-skype fa-2x" aria-hidden="true"></i>
-        <span>
-        {{- if $autolink }}<a href="skype:{{ . }}?call">{{ . }}</a>{{ else }}{{ . }}{{ end -}}
-        </span>
+        <i class="fa-li fas fa-map-marker fa-2x" aria-hidden="true"></i>
+        <span id="person-address" itemprop="address">{{ . | markdownify | emojify }}</span>
       </li>
       {{ end }}
 
-      {{ with $.Site.Params.telegram }}
+      {{ with $.Site.Params.office_hours }}
       <li>
-        <i class="fa-li fab fa-telegram fa-2x" aria-hidden="true"></i>
-        <span>
-        {{- if $autolink }}<a href="https://telegram.me/{{ . }}" target="_blank" rel="noopener">@{{ . }}</a>{{ else }}@{{ . }}{{ end -}}
-        </span>
+        <i class="fa-li fas fa-clock fa-2x" aria-hidden="true"></i>
+        <span>{{ . | markdownify | emojify }}</span>
       </li>
       {{ end }}
 
-      {{ with $.Site.Params.address }}
+      {{ with $.Site.Params.appointment_url }}
       <li>
-        <i class="fa-li fas fa-map-marker fa-2x" aria-hidden="true"></i>
-        <span id="person-address" itemprop="address">{{ replace . "\n" "<br>" | safeHTML }}</span>
+        <i class="fa-li fas fa-calendar-check fa-2x" aria-hidden="true"></i>
+        <a href="{{ . }}" target="_blank" rel="noopener">{{ i18n "book_appointment" | default "Book an appointment" }}</a>
       </li>
       {{ end }}
 
-      {{ with $.Site.Params.office_hours }}
+      {{/* Contact links. */}}
+      {{ range $.Site.Params.contact_links }}
+      {{ $pack := or .icon_pack "fas" }}
+      {{ $pack_prefix := $pack }}
+      {{ if in (slice "fab" "fas" "far" "fal") $pack }}
+        {{ $pack_prefix = "fa" }}
+      {{ end }}
+      {{ $link := .link }}
+      {{ $scheme := (urls.Parse $link).Scheme }}
+      {{ $target := "" }}
+      {{ if not $scheme }}
+        {{ $link = .link | relLangURL }}
+      {{ else if in (slice "http" "https") $scheme }}
+        {{ $target = "target=\"_blank\" rel=\"noopener\"" }}
+      {{ end }}
       <li>
-        <i class="fa-li fas fa-clock fa-2x" aria-hidden="true"></i>
-        <span>{{ . }}</span>
+        <i class="fa-li {{ $pack }} {{ $pack_prefix }}-{{ .icon }} fa-2x" aria-hidden="true"></i>
+        <a href="{{ $link | safeURL }}" {{ $target | safeHTMLAttr }}>{{.name|markdownify|emojify|safeHTML}}</a>
       </li>
       {{ end }}
 

+ 2 - 2
layouts/partials/widgets/experience.html

@@ -33,15 +33,15 @@
         <div class="card">
           <div class="card-body">
             <div class="float-right text-muted exp-meta">
-              <div>
+              <div class="text-right">
                 {{ (time .date_start).Format ($page.Params.date_format | default "January 2006") }} –
                 {{ if .date_end}}
                   {{ (time .date_end).Format ($page.Params.date_format | default "January 2006") }}
                 {{else}}
                   {{ i18n "present" | default "Present" }}
                 {{end}}
-                {{with .location}}
               </div>
+              {{with .location}}
               <div class="text-right">{{.}}</div>
               {{end}}
             </div>

+ 1 - 1
layouts/partials/widgets/hero.html

@@ -5,7 +5,7 @@
 {{/* Compute image path outside of HTML style element due to Hugo limitation. */}}
 {{ $overlay_img := "" }}
 {{ if $header.overlay_img }}
-  {{ $overlay_img = (printf "img/%s" $header.overlay_img) }}
+  {{ $overlay_img = (printf "img/%s" $header.overlay_img) | relURL }}
 {{end}}
 
 <section id="{{ $page.File.TranslationBaseName }}" class="hero-overlay" style="

+ 1 - 1
layouts/partials/widgets/hero_carousel.html

@@ -20,7 +20,7 @@
       {{ if $item.overlay_img }}
       background-image:
       {{ if $item.overlay_filter }}linear-gradient(rgba(0, 0, 0, {{ $item.overlay_filter }}), rgba(0, 0, 0, {{ $item.overlay_filter }})), {{ end }}
-      url('{{ printf "img/%s" $item.overlay_img | relURL }}');
+      url('{{ printf "/img/%s" $item.overlay_img | absURL }}');
       {{ end }}
       ;">
       <div class="container" style="text-align: {{$item.align | default "left"}};">

+ 24 - 70
layouts/partials/widgets/posts.html

@@ -1,6 +1,19 @@
 {{ $ := .root }}
 {{ $page := .page }}
-{{ $posts_len := len (where (where $.Site.RegularPages "Type" "post") ".Params.notonhomepage" nil) }}
+
+{{ $query := where (where $.Site.RegularPages "Type" "post") ".Params.notonhomepage" nil }}
+{{ $archive_page := $.Site.GetPage "section" "post" }}
+
+{{/* Check if a filter should be applied. */}}
+{{ if $page.Params.filter_tag }}
+  {{ $archive_page = $.Site.GetPage (printf "tags/%s" $page.Params.filter_tag) }}
+  {{ $query = $query | intersect $archive_page.Pages }}
+{{ else if $page.Params.filter_category }}
+  {{ $archive_page = $.Site.GetPage (printf "categories/%s" $page.Params.filter_category) }}
+  {{ $query = $query | intersect $archive_page.Pages }}
+{{ end }}
+
+{{ $count := len ($query) }}
 
 <!-- Blog Posts widget -->
 <div class="row">
@@ -8,9 +21,9 @@
 
     <h1>{{ with $page.Title }}{{ . | markdownify }}{{ end }}</h1>
     {{ with $page.Params.subtitle }}<p>{{ . | markdownify }}</p>{{ end }}
-    {{ if gt $posts_len $page.Params.count }}
+    {{ if gt $count $page.Params.count }}
     <p class="view-all">
-      <a href="{{ ($.Site.GetPage "section" "post").RelPermalink }}">
+      <a href="{{ $archive_page.RelPermalink }}">
         {{ i18n "more_posts" | markdownify }}
         <i class="fas fa-angle-double-right"></i>
       </a>
@@ -22,74 +35,15 @@
 
     {{ with $page.Content }}<p>{{ . | markdownify }}</p>{{ end }}
 
-    {{ if gt (len $page.Params.tags_include) 0 }}
-      {{ $posts := where (where (where $.Site.RegularPages "Type" "post") ".Params.tags" "intersect" $page.Params.tags_include) ".Params.notonhomepage" nil }}
-
-      {{ $.Scratch.Add "show_post" "1" }}
-      {{ range $post := first $page.Params.count $posts }}
-
-        {{ $.Scratch.Set "show_post" "1" }}
-
-        {{/* If `tags_include` is set, exclude posts with no tags. */}}
-        {{ with (not .Params.tags) }}
-          {{ with $page.Params.tags_include }}
-            {{ $.Scratch.Set "show_post" "0" }}
-          {{end}}
-        {{end}}
-        {{/* If `tags_exclude` is set, exclude posts. */}}
-        {{ range $key, $val := .Params.tags }}
-          {{ if in $page.Params.tags_exclude $val }}
-          {{ $.Scratch.Set "show_post" "0" }}
-        {{end}}
-      {{end}}
-
-      {{ $show_post := $.Scratch.Get "show_post" }}
-      {{ if ne $show_post "0" }}
-        {{ if eq $page.Params.list_format 0 }}
-          {{ partial "post_li_simple" . }}
-        {{ else if eq $page.Params.list_format 1 }}
-          {{ partial "post_li_detailed" . }}
-        {{ else }}
-          {{ partial "post_li_stream" . }}
-        {{ end }}
-      {{end}}
-
+    {{ range $post := first $page.Params.count $query }}
+      {{ if eq $page.Params.list_format 0 }}
+        {{ partial "post_li_simple" . }}
+      {{ else if eq $page.Params.list_format 1 }}
+        {{ partial "post_li_detailed" . }}
+      {{ else }}
+        {{ partial "post_li_stream" . }}
       {{ end }}
-    {{ else}}
-      {{ $posts := where (where $.Site.RegularPages "Type" "post") ".Params.notonhomepage" nil }}
-
-      {{ $.Scratch.Add "show_post" "1" }}
-      {{ range $post := first $page.Params.count $posts }}
-
-        {{ $.Scratch.Set "show_post" "1" }}
-
-        {{/* If `tags_include` is set, exclude posts with no tags. */}}
-        {{ with (not .Params.tags) }}
-          {{ with $page.Params.tags_include }}
-            {{ $.Scratch.Set "show_post" "0" }}
-          {{end}}
-        {{end}}
-
-        {{/* If `tags_exclude` is set, exclude posts. */}}
-        {{ range $key, $val := .Params.tags }}
-          {{ if in $page.Params.tags_exclude $val }}
-          {{ $.Scratch.Set "show_post" "0" }}
-        {{end}}
-      {{end}}
-
-      {{ $show_post := $.Scratch.Get "show_post" }}
-      {{ if ne $show_post "0" }}
-        {{ if eq $page.Params.list_format 0 }}
-          {{ partial "post_li_simple" . }}
-        {{ else if eq $page.Params.list_format 1 }}
-          {{ partial "post_li_detailed" . }}
-        {{ else }}
-          {{ partial "post_li_stream" . }}
-        {{ end }}
-      {{end}}
-
-      {{ end }}
-    {{ end }}
+    {{end}}
 
   </div>
 </div>

+ 2 - 2
layouts/partials/widgets/publications.html

@@ -25,8 +25,8 @@
       {{ $.Scratch.Set "recent_pubs" (where $.Site.RegularPages "Type" "publication") }}
     {{ end }}
 
-    {{ if $page.Params.exclude_selected }}
-      {{ $.Scratch.Set "recent_pubs" ( ($.Scratch.Get "recent_pubs") | intersect (where (where $.Site.RegularPages "Type" "publication") ".Params.selected" "!=" true) ) }}
+    {{ if $page.Params.exclude_featured }}
+      {{ $.Scratch.Set "recent_pubs" ( ($.Scratch.Get "recent_pubs") | intersect (where (where $.Site.RegularPages "Type" "publication") ".Params.featured" "!=" true) ) }}
     {{ end }}
 
     {{ $recent_pubs := $.Scratch.Get "recent_pubs" }}

+ 3 - 3
layouts/partials/widgets/publications_selected.html → layouts/partials/widgets/publications_featured.html

@@ -1,7 +1,7 @@
 {{ $ := .root }}
 {{ $page := .page }}
 
-<!-- Selected Publications widget -->
+<!-- Featured Publications widget -->
 <div class="row">
   <div class="col-12 col-lg-4 section-heading">
     <h1>{{ with $page.Title }}{{ . | markdownify }}{{ end }}</h1>
@@ -11,9 +11,9 @@
     {{ with $page.Content }}<p>{{ . | markdownify }}</p>{{ end }}
 
     {{ if and ($page.Params.publication_type) (ne $page.Params.publication_type "-1") }}
-      {{ $.Scratch.Set "sel_pubs" (where (where (where $.Site.RegularPages "Type" "publication") ".Params.selected" true) ".Params.publication_types" "intersect" (slice $page.Params.publication_type)) }}
+      {{ $.Scratch.Set "sel_pubs" (where (where (where $.Site.RegularPages "Type" "publication") ".Params.featured" true) ".Params.publication_types" "intersect" (slice $page.Params.publication_type)) }}
     {{ else }}
-      {{ $.Scratch.Set "sel_pubs" (where (where $.Site.RegularPages "Type" "publication") ".Params.selected" true) }}
+      {{ $.Scratch.Set "sel_pubs" (where (where $.Site.RegularPages "Type" "publication") ".Params.featured" true) }}
     {{ end }}
 
     {{ $sel_pubs := $.Scratch.Get "sel_pubs" }}

+ 3 - 3
layouts/partials/widgets/talks.html

@@ -21,9 +21,9 @@
 
     {{ $.Scratch.Set "talks" (where $.Site.RegularPages "Type" "talk") }}
 
-    {{/* Exclude talks shown in Selected Talks widget? */}}
-    {{ if $page.Params.exclude_selected }}
-    {{ $.Scratch.Set "talks" (where ($.Scratch.Get "talks") ".Params.selected" "!=" true) }}
+    {{/* Exclude talks shown in Featured Talks widget? */}}
+    {{ if $page.Params.exclude_featured }}
+    {{ $.Scratch.Set "talks" (where ($.Scratch.Get "talks") ".Params.featured" "!=" true) }}
     {{ end }}
 
     {{ range first $page.Params.count (sort ($.Scratch.Get "talks") ".Params.time_start" "desc") }}

+ 2 - 2
layouts/partials/widgets/talks_selected.html → layouts/partials/widgets/talks_featured.html

@@ -1,7 +1,7 @@
 {{ $ := .root }}
 {{ $page := .page }}
 
-<!-- Selected Talks widget -->
+<!-- Featured Talks widget -->
 <div class="row">
   <div class="col-12 col-lg-4 section-heading">
     <h1>{{ with $page.Title }}{{ . | markdownify }}{{ end }}</h1>
@@ -10,7 +10,7 @@
   <div class="col-12 col-lg-8">
     {{ with $page.Content }}<p>{{ . | markdownify }}</p>{{ end }}
 
-    {{ range (sort (where (where $.Site.RegularPages "Type" "talk") ".Params.selected" true) ".Params.time_start" "desc") }}
+    {{ range (sort (where (where $.Site.RegularPages "Type" "talk") ".Params.featured" true) ".Params.time_start" "desc") }}
       {{ if eq $page.Params.list_format 1 }}
         {{ partial "talk_li_detailed" . }}
       {{ else if eq $page.Params.list_format 2 }}

+ 40 - 52
layouts/project/single.html

@@ -15,65 +15,53 @@
     {{ partial "page_author.html" . }}
 
     {{ $page := . }}
-    {{ $project := .Slug }}
-    {{ if not $project }}{{/* If user did not explicitly set `slug` in front matter. */}}
-    {{ $project = .File.TranslationBaseName }}
-    {{ end }}
-    {{ if eq $project "index" }}{{/* Check if using dir-based page bundles. */}}
-    {{ $project = delimit (last 1 (split (substr .Dir 0 -1) "/")) "" }}
-    {{ end }}
-    {{ $project_path := .RelPermalink }}
-
-    {{ if (.Site.Params.projects.list_children | default true) }}
+    {{ $project := .File.ContentBaseName }}
 
-      {{ $items := where (where .Site.RegularPages "Type" "post") ".Params.projects" "intersect" (slice $project) }}
-      {{ $count := len $items }}
-      {{ if ge $count 1 }}
-        <h2>{{ (i18n "posts") }}</h2>
-        {{ range $items }}
-          {{ if eq $page.Site.Params.projects.post_format 0 }}
-            {{ partial "post_li_simple" . }}
-          {{ else if eq $page.Site.Params.projects.post_format 1 }}
-            {{ partial "post_li_detailed" . }}
-          {{ else }}
-            {{ partial "post_li_stream" . }}
-          {{ end }}
+    {{ $items := where (where .Site.RegularPages "Type" "post") ".Params.projects" "intersect" (slice $project) }}
+    {{ $count := len $items }}
+    {{ if ge $count 1 }}
+      <h2>{{ (i18n "posts") }}</h2>
+      {{ range $items }}
+        {{ if eq $page.Site.Params.projects.post_format 0 }}
+          {{ partial "post_li_simple" . }}
+        {{ else if eq $page.Site.Params.projects.post_format 1 }}
+          {{ partial "post_li_detailed" . }}
+        {{ else }}
+          {{ partial "post_li_stream" . }}
         {{ end }}
       {{ end }}
+    {{ end }}
 
-      {{ $items := where (where .Site.RegularPages "Type" "publication") ".Params.projects" "intersect" (slice $project) }}
-      {{ $items := $items | union (where (where .Site.RegularPages "Type" "publication") ".Params.url_project" $project_path) }}
-      {{ $pubs_len := len $items }}
-      {{ if ge $pubs_len 1 }}
-        <h2>{{ (i18n "publications") }}</h2>
-        {{ range $items }}
-          {{ if eq $page.Site.Params.projects.publication_format 1 }}
-            {{ partial "publication_li_detailed" . }}
-          {{ else if eq $page.Site.Params.projects.publication_format 2 }}
-            {{ partial "publication_li_apa" . }}
-          {{ else if eq $page.Site.Params.projects.publication_format 3 }}
-            {{ partial "publication_li_mla" . }}
-          {{ else if eq $page.Site.Params.projects.publication_format 4 }}
-            {{ partial "publication_li_stream" . }}
-          {{ else }}
-            {{ partial "publication_li_simple" . }}
-          {{ end }}
+    {{ $items := where (where .Site.RegularPages "Type" "publication") ".Params.projects" "intersect" (slice $project) }}
+    {{ $pubs_len := len $items }}
+    {{ if ge $pubs_len 1 }}
+      <h2>{{ (i18n "publications") }}</h2>
+      {{ range $items }}
+        {{ if eq $page.Site.Params.projects.publication_format 1 }}
+          {{ partial "publication_li_detailed" . }}
+        {{ else if eq $page.Site.Params.projects.publication_format 2 }}
+          {{ partial "publication_li_apa" . }}
+        {{ else if eq $page.Site.Params.projects.publication_format 3 }}
+          {{ partial "publication_li_mla" . }}
+        {{ else if eq $page.Site.Params.projects.publication_format 4 }}
+          {{ partial "publication_li_stream" . }}
+        {{ else }}
+          {{ partial "publication_li_simple" . }}
         {{ end }}
       {{ end }}
+    {{ end }}
 
-      {{ $items := where (where .Site.RegularPages "Type" "talk") ".Params.projects" "intersect" (slice $project) }}
-      {{ $items := $items | union (where (where .Site.RegularPages "Type" "talk") ".Params.url_project" $project_path) }}
-      {{ $talks_len := len $items }}
-      {{ if ge $talks_len 1 }}
-        <h2>{{ (i18n "talks") }}</h2>
-        {{ range sort $items ".Params.time_start" "desc" }}
-          {{ if eq $page.Site.Params.projects.talk_format 1 }}
-            {{ partial "talk_li_detailed" . }}
-          {{ else if eq $page.Site.Params.projects.talk_format 2 }}
-            {{ partial "talk_li_stream" . }}
-          {{ else }}
-            {{ partial "talk_li_simple" . }}
-          {{ end }}
+    {{ $items := where (where .Site.RegularPages "Type" "talk") ".Params.projects" "intersect" (slice $project) }}
+    {{ $talks_len := len $items }}
+    {{ if ge $talks_len 1 }}
+      <h2>{{ (i18n "talks") }}</h2>
+      {{ range sort $items ".Params.time_start" "desc" }}
+        {{ if eq $page.Site.Params.projects.talk_format 1 }}
+          {{ partial "talk_li_detailed" . }}
+        {{ else if eq $page.Site.Params.projects.talk_format 2 }}
+          {{ partial "talk_li_stream" . }}
+        {{ else }}
+          {{ partial "talk_li_simple" . }}
         {{ end }}
       {{ end }}
     {{ end }}

+ 3 - 15
layouts/publication/single.html

@@ -18,9 +18,11 @@
         <div class="row">
           <div class="col-12 col-md-3 pub-row-heading">{{ i18n "publication_type" }}</div>
           <div class="col-12 col-md-9">
+            {{ partial "pub_types.html" $ }}
+            {{ $pub_types := $.Scratch.Get "pub_types" }}
             {{ range $index, $pubtype := .Params.publication_types }}
             <a href="{{ ($.Site.GetPage "section" "publication").RelPermalink }}#{{ . | urlize }}">
-              {{ index $.Site.Params.publication_types (int .) }}
+              {{ index $pub_types (int .) }}
             </a>
             {{ end }}
           </div>
@@ -45,20 +47,6 @@
     <div class="d-md-none space-below"></div>
     {{ end }}
 
-    <div class="row">
-      <div class="col-md-1"></div>
-      <div class="col-md-10">
-        <div class="row">
-          <div class="col-12 col-md-3 pub-row-heading">{{ i18n "date" }}</div>
-          <div class="col-12 col-md-9" itemprop="datePublished">
-            {{ .Date.Format ($.Site.Params.publications.date_format | default "January, 2006") }}
-          </div>
-        </div>
-      </div>
-      <div class="col-md-1"></div>
-    </div>
-    <div class="d-sm-none space-below"></div>
-
     <div class="space-below"></div>
 
     <div class="article-style">{{ .Content }}</div>

+ 3 - 1
layouts/section/publication.html

@@ -24,9 +24,11 @@
         <div class="col-auto">
           <select class="pub-filters pubtype-select form-control form-control-sm" data-filter-group="pubtype">
             <option value="*">{{ i18n "filter_all" }}</option>
+            {{ partial "pub_types.html" $ }}
             {{ range $index, $taxonomy := .Site.Taxonomies.publication_types }}
             <option value=".pubtype-{{ (int $index) }}">
-              {{ index $.Site.Params.publication_types (int $index) }}
+              {{ $pub_types := $.Scratch.Get "pub_types" }}
+              {{ index $pub_types (int $index) }}
             </option>
             {{ end }}
           </select>

+ 3 - 1
layouts/shortcodes/alert.html

@@ -1,3 +1,5 @@
 <div class="alert alert-{{ .Get 0 }}">
-  {{ .Inner }}
+  <div>
+    {{ .Inner }}
+  </div>
 </div>

+ 1 - 1
layouts/talk/single.html

@@ -22,7 +22,7 @@
             {{ $date := .Params.time_start | default .Date }}
             {{ (time $date).Format $.Site.Params.date_format }}
             <div class="talk-time">
-              {{ if $.Site.Params.talks.time }}
+              {{ if not .Params.all_day }}
                 {{ (time $date).Format ($.Site.Params.time_format | default "3:04 PM") }}
                 {{ with .Params.time_end }}
                   &mdash; {{ (time .).Format ($.Site.Params.time_format | default "3:04 PM") }}

+ 12 - 0
netlify.toml

@@ -0,0 +1,12 @@
+[build]
+  command = "hugo --themesDir ../../"
+  base    = "exampleSite"
+  publish = "exampleSite/public"
+
+[build.environment]
+  HUGO_THEME = "repo"
+  HUGO_VERSION = "0.53"
+  HUGO_ENABLEGITINFO = "true"
+
+[context.production.environment]
+  HUGO_ENV = "production"

BIN
static/img/icon-192.png


BIN
static/img/icon.png


+ 1 - 1
theme.toml

@@ -3,7 +3,7 @@ license = "MIT"
 licenselink = "https://github.com/gcushen/hugo-academic/blob/master/LICENSE.md"
 description = "The website designer for Hugo. Build anything and deploy with one click! Fully customizable with themes, plugins, and language packs."
 homepage = "https://sourcethemes.com/academic/"
-min_version = "0.50"
+min_version = "0.53"
 tags = ["academic",
         "portfolio",
         "responsive",