Initial commit
This commit is contained in:
35
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
35
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
name: 🐞 Bug
|
||||||
|
description: File a bug/issue
|
||||||
|
title: '<title>'
|
||||||
|
labels: [bug]
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Current Behavior
|
||||||
|
description: A description of what you're experiencing.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps To Reproduce
|
||||||
|
description: Link to a repository with steps to reproduce the behavior.
|
||||||
|
placeholder: |
|
||||||
|
As you can see in this code example/repository
|
||||||
|
1. Using this component...
|
||||||
|
2. With these properties...
|
||||||
|
3. Click '...'
|
||||||
|
4. See error...
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Bug Reports with a link to a repository or specific example can be answered far quicker, so please consider including as much information as possible!
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Anything else?
|
||||||
|
description: |
|
||||||
|
Links? References? Anything that will give us more context about the issue you are encountering!
|
||||||
|
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
11
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
11
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: CollectionBuilder Documentation
|
||||||
|
url: https://collectionbuilder.github.io/cb-docs/
|
||||||
|
about: Search our comprehensive, step by step documentation about how to use CollectionBuilder.
|
||||||
|
- name: CollectionBuilder Discussions
|
||||||
|
url: https://github.com/orgs/CollectionBuilder/discussions
|
||||||
|
about: Ask questions, provide feedback, post ideas, and share with the community. This is the best place to get help!
|
||||||
|
- name: CollectionBuilder Home
|
||||||
|
url: https://collectionbuilder.github.io/
|
||||||
|
about: Learn more about CollectionBuilder and the community.
|
||||||
23
.github/ISSUE_TEMPLATE/docs_issue.yml
vendored
Normal file
23
.github/ISSUE_TEMPLATE/docs_issue.yml
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
name: 📗 Report Docs Issue
|
||||||
|
description: See a typo? Outdated or incorrect information? Let us know!
|
||||||
|
title: '<title>'
|
||||||
|
labels: [documentation]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: Sometimes something slips through the cracks, and the documentation is not quite right. Thanks for letting us know!
|
||||||
|
- type: input
|
||||||
|
id: link
|
||||||
|
attributes:
|
||||||
|
label: Link to the Page
|
||||||
|
- type: textarea
|
||||||
|
id: quote
|
||||||
|
attributes:
|
||||||
|
label: Describe the Issue
|
||||||
|
- type: dropdown
|
||||||
|
id: participate
|
||||||
|
attributes:
|
||||||
|
label: Are you able to create a Pull Request with the fix?
|
||||||
|
options:
|
||||||
|
- 'Yes'
|
||||||
|
- 'No'
|
||||||
22
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
22
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
name: 🛠️ Request New Feature
|
||||||
|
description: Let us know what we should add.
|
||||||
|
labels: ['feature request']
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: Describe what feature you'd like. Pseudo-code, mockups, or screenshots of similar solutions are encouraged!
|
||||||
|
- type: dropdown
|
||||||
|
id: category
|
||||||
|
attributes:
|
||||||
|
label: What type of pull request would this be?
|
||||||
|
options:
|
||||||
|
- 'New Feature'
|
||||||
|
- 'Enhancement'
|
||||||
|
- 'Guide'
|
||||||
|
- 'Docs'
|
||||||
|
- 'Other'
|
||||||
|
- type: textarea
|
||||||
|
id: references
|
||||||
|
attributes:
|
||||||
|
label: Any links to similar examples or other references we should review?
|
||||||
22
.github/pull_request_template.md
vendored
Normal file
22
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Pull request
|
||||||
|
|
||||||
|
## Proposed changes
|
||||||
|
|
||||||
|
<!-- Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue. -->
|
||||||
|
|
||||||
|
## Types of changes
|
||||||
|
|
||||||
|
<!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
|
||||||
|
|
||||||
|
- [ ] New feature (non-breaking change which adds functionality).
|
||||||
|
- [ ] Enhancement (non-breaking change which enhances functionality)
|
||||||
|
- [ ] Bug Fix (non-breaking change which fixes an issue).
|
||||||
|
- [ ] Breaking change (fix or feature that would cause existing functionality to change).
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
<!-- Go over all the following points, and put an `x` in all the boxes that apply. If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
|
||||||
|
|
||||||
|
- [ ] I have read the **[CONTRIBUTING](./CONTRIBUTING.md)** document.
|
||||||
|
- [ ] My change requires a change to the documentation.
|
||||||
|
- [ ] I have updated the documentation accordingly.
|
||||||
19
.gitignore
vendored
Normal file
19
.gitignore
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Ignore metadata generated by Jekyll
|
||||||
|
_site/
|
||||||
|
.sass-cache/
|
||||||
|
.jekyll-cache/
|
||||||
|
.jekyll-metadata
|
||||||
|
|
||||||
|
# Ignore folders generated by Bundler
|
||||||
|
.bundle/
|
||||||
|
vendor/
|
||||||
|
|
||||||
|
# Ignore mac files
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# temporarily ignore gemfile.lock
|
||||||
|
Gemfile.lock
|
||||||
|
|
||||||
|
# Ignore objects directory to avoid committing binary files (other than demo files)
|
||||||
|
# if you would like to commit your objects to github, delete the line below!
|
||||||
|
objects/
|
||||||
22
404.html
Normal file
22
404.html
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
title: Page Not Found
|
||||||
|
layout: page
|
||||||
|
permalink: /404.html
|
||||||
|
# this creates a 404 page automatically handled by GitHub Pages
|
||||||
|
# the cow is from the linux program "cowsay"
|
||||||
|
---
|
||||||
|
|
||||||
|
<h1>404?</h1>
|
||||||
|
<p>Sorry, but the page you were trying to view does not exist.</p>
|
||||||
|
|
||||||
|
<pre><code>
|
||||||
|
____________
|
||||||
|
< Sorry, 404 >
|
||||||
|
------------
|
||||||
|
\ ^__^
|
||||||
|
\ (oo)\_______
|
||||||
|
(__)\ )\/\
|
||||||
|
||----w |
|
||||||
|
|| ||
|
||||||
|
|
||||||
|
</code></pre>
|
||||||
25
CITATION.cff
Normal file
25
CITATION.cff
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
cff-version: 1.2.0
|
||||||
|
message: "If you use this software, please cite it as below."
|
||||||
|
title: "CollectionBuilder-CSV"
|
||||||
|
type: software
|
||||||
|
authors:
|
||||||
|
- family-names: Williamson
|
||||||
|
given-names: Evan Peter
|
||||||
|
orcid: https://orcid.org/0000-0002-7990-9924
|
||||||
|
- family-names: Becker
|
||||||
|
given-names: Devin
|
||||||
|
orcid: https://orcid.org/0000-0002-0974-9064
|
||||||
|
- family-names: Wikle
|
||||||
|
given-names: Olivia
|
||||||
|
orcid: https://orcid.org/0000-0001-8122-4169
|
||||||
|
repository-code: 'https://github.com/CollectionBuilder/collectionbuilder-csv'
|
||||||
|
url: 'https://collectionbuilder.github.io/'
|
||||||
|
license: MIT
|
||||||
|
version: 1+
|
||||||
|
date-released: '2021-04-25'
|
||||||
|
abstract: >-
|
||||||
|
CollectionBuilder is an open source tool for
|
||||||
|
creating digital collection and exhibit websites
|
||||||
|
that are driven by metadata and powered by modern
|
||||||
|
static web technology.
|
||||||
|
license: MIT
|
||||||
76
CODE_OF_CONDUCT.md
Normal file
76
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
A primary goal of the CollectionBuilder community is to be inclusive to the largest number of contributors, with the most varied and diverse backgrounds possible. As community participants, we pledge to make participation in our project and community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
||||||
|
|
||||||
|
We invite all those who participate in the CollectionBuilder project and community to help us create safe and positive experiences for everyone.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This code of conduct outlines our expectations for everyone who participates in our community, as well as the consequences for unacceptable behavior.
|
||||||
|
|
||||||
|
We expect all community participants (community organizers; project maintainers; contributors, paid or otherwise; sponsors; and others) to abide by this Code of Conduct, which applies in all community venues, online and in-person; in one-on-one or group communications pertaining to community business; and within project spaces and in public spaces when an individual is representing the project or its community.
|
||||||
|
Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
|
||||||
|
Representation of a project may be further defined and clarified by community organizers.
|
||||||
|
|
||||||
|
Participants are also expected to uphold the [GitHub Community Guidelines](https://help.github.com/en/articles/github-community-guidelines) for all behavior and content on the platform.
|
||||||
|
|
||||||
|
## Expected Behavior
|
||||||
|
|
||||||
|
The following behaviors are expected of all community participants:
|
||||||
|
|
||||||
|
- Using inclusive, respectful, and welcoming language
|
||||||
|
- Being respectful of differing viewpoints and experiences
|
||||||
|
- Gracefully accepting constructive criticism
|
||||||
|
- Focusing on what is best for the community
|
||||||
|
- Showing empathy towards other community members
|
||||||
|
|
||||||
|
## Unacceptable Behavior
|
||||||
|
|
||||||
|
The following behaviors are unacceptable within our community:
|
||||||
|
|
||||||
|
- Violence, threats of violence, or violent language directed against another person
|
||||||
|
- Sexist, racist, homophobic, transphobic, ableist, or otherwise discriminatory jokes and language
|
||||||
|
- Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
- The use of sexualized language or imagery and unwelcome sexual attention or advances
|
||||||
|
- Posting or displaying sexually explicit or violent material
|
||||||
|
- Publishing or threatening to publish others' private information, such as a physical or electronic address, without explicit permission ("doxing")
|
||||||
|
- Public or private harassment
|
||||||
|
- Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Community organizers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
## Consequences for Unacceptable Behavior
|
||||||
|
|
||||||
|
Unacceptable behavior from any community member, including sponsors and those with decision-making authority, will not be tolerated.
|
||||||
|
|
||||||
|
Anyone asked to stop unacceptable behavior is expected to comply immediately.
|
||||||
|
|
||||||
|
Community organizers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban (temporarily or permanently) any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful without warning (and without refund in the case of a paid event).
|
||||||
|
|
||||||
|
## Reporting Guidelines
|
||||||
|
|
||||||
|
If you are subject to or witness unacceptable behavior, or have any other concerns, please notify community organizers as soon as possible at collectionbuilder.team@gmail.com which is maintained by evanwill, dcnb, owikle, and juliastone0729.
|
||||||
|
If these are not appropriate contacts, please consider [reporting directly to GitHub](https://github.com/contact/report-abuse) or an administrative contact in the project's home at [University of Idaho Library](https://www.lib.uidaho.edu/about/directory.html).
|
||||||
|
|
||||||
|
All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances.
|
||||||
|
Community organizers are obligated to uphold confidentiality with regard to the reporter of an incident.
|
||||||
|
|
||||||
|
Additionally, any abuse, harassment, and other harmful behavior taking place on GitHub can be reported directly:
|
||||||
|
https://github.com/contact/report-abuse
|
||||||
|
|
||||||
|
## Contact info
|
||||||
|
|
||||||
|
- email: collectionbuilder.team@gmail.com
|
||||||
|
- [CollectionBuilder GitHub organization](https://github.com/CollectionBuilder)
|
||||||
|
- [CollectionBuilder home page](https://collectionbuilder.github.io/)
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from two sources:
|
||||||
|
|
||||||
|
1. The [Contributor Covenant](https://www.contributor-covenant.org/), version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html. For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq.
|
||||||
|
2. The Citizen Code of Conduct, Revision 2.3 2017, which is distributed by [Stumptown Syndicate](http://stumptownsyndicate.org/) under a [Creative Commons Attribution-ShareAlike license](http://creativecommons.org/licenses/by-sa/3.0/). Portions of text from the Citizen Code of Conduct are derived from the [Django Code of Conduct](https://www.djangoproject.com/conduct/) and the [Geek Feminism Anti-Harassment Policy](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy).
|
||||||
52
CONTRIBUTING.md
Normal file
52
CONTRIBUTING.md
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
# How to Contribute to CollectionBuilder
|
||||||
|
|
||||||
|
Thank you for contributing to CollectionBuilder!
|
||||||
|
|
||||||
|
CollectionBuilder prioritizes pragmatic, sustainable, and simplified approaches to infrastructure to ensure the tool is "do-able" and approachable for digital knowledge workers in libraries and museums, empowering them to take control of their web systems.
|
||||||
|
The core team is *not* full time developers--we are librarians.
|
||||||
|
Thus, we are focused on creating a supportive, inclusive community with low barriers to contributing (please see our [Code of Conduct](https://github.com/CollectionBuilder/collectionbuilder-csv/blob/main/CODE_OF_CONDUCT.md)).
|
||||||
|
|
||||||
|
Honestly, we do a lot of stuff the slow/old/inefficient/wrong way... but we make it work and invite you to learn/teach with us!
|
||||||
|
|
||||||
|
## Project resources
|
||||||
|
|
||||||
|
- Email contact: <collectionbuilder.team@gmail.com>
|
||||||
|
- [Main project site](https://collectionbuilder.github.io/)
|
||||||
|
- [User Documentation - CB-Docs](https://collectionbuilder.github.io/cb-docs/)
|
||||||
|
- Technical Documentation is found in individual project repositories in the "/docs" folder.
|
||||||
|
- General project tracking takes place in Issues in individual template repositories, or the [CollectionBuilder home repository](https://github.com/CollectionBuilder/collectionbuilder.github.io/issues)
|
||||||
|
- [CollectionBuilder Discussions](https://github.com/orgs/CollectionBuilder/discussions)
|
||||||
|
|
||||||
|
## Issues
|
||||||
|
|
||||||
|
Since this is a relatively small project, we are informal in using GitHub Issues and welcome you to open one to get in touch.
|
||||||
|
Issues should be opened in the repository of the specific template you are using for bug reports, feature ideas, and requests for missing documentation.
|
||||||
|
The team also uses Issues for project management related to the CollectionBuilder project.
|
||||||
|
|
||||||
|
For questions related to your own project using a CB template, it is best to ask for help in the main [CollectionBuilder Discussions form](https://github.com/orgs/CollectionBuilder/discussions) rather than opening an Issue.
|
||||||
|
|
||||||
|
Here are some tips:
|
||||||
|
|
||||||
|
- [How to use GitHub Issues](https://guides.github.com/features/issues/)
|
||||||
|
- Please focus on clear communication, providing plenty of detail and links so that we can understand the bug or proposal.
|
||||||
|
- Search the Issues to see if a related report has already been opened (if so add a comment or reaction!).
|
||||||
|
- Check our [documentation](https://collectionbuilder.github.io/cb-docs/) resources for solutions and other ways to get in touch.
|
||||||
|
- You can more informally ask questions and share ideas in the main [CollectionBuilder Discussions forum](https://github.com/orgs/CollectionBuilder/discussions). Discussions is often the best place to post questions about debugging metadata or pages in your own projects (rather than issues with the template code).
|
||||||
|
|
||||||
|
## Pull Requests
|
||||||
|
|
||||||
|
CollectionBuilder welcomes [Pull Requests](https://help.github.com/en/articles/about-pull-requests) from outside contributors.
|
||||||
|
Please provide plenty of detail in the PR so that the project team fully understands your contribution.
|
||||||
|
|
||||||
|
- [How to create a PR](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request)
|
||||||
|
|
||||||
|
## Conventions
|
||||||
|
|
||||||
|
- Include lots of inline comments documenting code! The entire CollectionBuilder project has a educational outlook.
|
||||||
|
- Keep code structure *relatively* simple. The templates are intended to be comprehensible for digital librarians and DH practitioners to use and modify, not necessarily fully optimized solutions.
|
||||||
|
- Include spaces for readability. For example, in Liquid `{% if site.example %}{{ site.example }}{% endif %}`, not `{%if site.example%}{{site.example}}{%endif%}`.
|
||||||
|
- To improve readability, avoid excess white space and random indentations.
|
||||||
|
- Indent using spaces. HTML, JS, CSS and related files should be indented using 4 spaces. YAML with 2 spaces.
|
||||||
|
- Use `;` in metadata to denote multi-valued fields.
|
||||||
|
- New features should be progressive--adding features, while maintaining backwards compatibility with existing data setups. If possible, sane defaults should be set in Liquid and JS, so that projects lacking updated config variables will still function.
|
||||||
|
- Main branch should be code that is ready to go. Use feature branches for development and provide meaningful commit messages.
|
||||||
20
Gemfile
Normal file
20
Gemfile
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
# needed for Jekyll
|
||||||
|
gem 'jekyll'
|
||||||
|
gem 'webrick'
|
||||||
|
gem 'logger'
|
||||||
|
gem 'base64'
|
||||||
|
gem 'ostruct'
|
||||||
|
|
||||||
|
# needed for Rake tasks
|
||||||
|
gem 'rake'
|
||||||
|
gem 'csv'
|
||||||
|
gem 'fileutils'
|
||||||
|
gem 'mini_magick'
|
||||||
|
unless Gem.win_platform?
|
||||||
|
gem 'image_optim'
|
||||||
|
gem 'image_optim_pack'
|
||||||
|
end
|
||||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 CollectionBuilder contributors, evanwill, dcnb, owikle, jylisadoney, University of Idaho Library Digital Initiatives, https://www.lib.uidaho.edu/digital/
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
42
README.md
Normal file
42
README.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# CollectionBuilder-CSV
|
||||||
|
|
||||||
|
CollectionBuilder-CSV is a robust and flexible "stand alone" template for creating digital collection and exhibit websites using Jekyll and a metadata CSV.
|
||||||
|
Driven by your collection metadata, the template generates engaging visualizations to browse and explore your objects.
|
||||||
|
The resulting static site can be hosted on any basic web server (or built automatically using GitHub Actions).
|
||||||
|
|
||||||
|
Visit the [CollectionBuilder Docs](https://collectionbuilder.github.io/cb-docs/) for step-by-step details for getting started and building collections!
|
||||||
|
|
||||||
|
## Brief Overview of Building a Collection
|
||||||
|
|
||||||
|
The [CollectionBuilder Docs](https://collectionbuilder.github.io/cb-docs/) contain detailed information about building a collection from start to finish--including installing software, using Git/GitHub, preparing digital objects, and formatting metadata.
|
||||||
|
However, here is a super quick overview of the process:
|
||||||
|
|
||||||
|
- Make your own copy of this template repository by clicking the green "Use this Template" button on GitHub (see [repository set up docs](https://collectionbuilder.github.io/cb-docs/docs/repository/)). This copy of the template is the starting point for your "project repository", i.e. the source code for your digital collection site!
|
||||||
|
- Prepare your collection metadata following the CB-CSV template (see our demo [metadata template on Google Sheets](https://docs.google.com/spreadsheets/d/1nN_k4JQB4LJraIzns7WcM3OXK-xxGMQhW1shMssflNM/edit?usp=sharing) and [metadata docs](https://collectionbuilder.github.io/cb-docs/docs/metadata/csv_metadata/)). Your metadata will include links to your digital files (images, pdfs, videos, etc) and thumbnails wherever they are hosted.
|
||||||
|
- Add your metadata as a CSV to your project repository's "_data" folder (see [upload metadata docs](https://collectionbuilder.github.io/cb-docs/docs/metadata/uploading/)).
|
||||||
|
- Edit your project's "_config.yml" with your collection information (see [site configuration docs](https://collectionbuilder.github.io/cb-docs/docs/config/)). Additional customization is done via a theme file, configuration files, CSS tweaks, and more--however, once your "_config.yml" is edited your site is ready to be previewed.
|
||||||
|
- Generate your site using Jekyll! (see docs for how to [use Jekyll locally](https://collectionbuilder.github.io/cb-docs/docs/repository/generate/) and [deploy on the web](https://collectionbuilder.github.io/cb-docs/docs/deploy/))
|
||||||
|
|
||||||
|
Please feel free to ask questions in the main [CollectionBuilder discussion forum](https://github.com/CollectionBuilder/collectionbuilder.github.io/discussions).
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
## CollectionBuilder
|
||||||
|
|
||||||
|
<https://collectionbuilder.github.io/>
|
||||||
|
|
||||||
|
CollectionBuilder is a project of University of Idaho Library's [Digital Initiatives](https://www.lib.uidaho.edu/digital/) and the [Center for Digital Inquiry and Learning](https://cdil.lib.uidaho.edu) (CDIL) following the [Lib-Static](https://lib-static.github.io/) methodology.
|
||||||
|
Powered by the open source static site generator [Jekyll](https://jekyllrb.com/) and a modern static web stack, it puts collection metadata to work building beautiful sites.
|
||||||
|
|
||||||
|
The basic theme is created using [Bootstrap](https://getbootstrap.com/).
|
||||||
|
Metadata visualizations are built using open source libraries such as [DataTables](https://datatables.net/), [Leafletjs](http://leafletjs.com/), [Spotlight gallery](https://github.com/nextapps-de/spotlight), [lazysizes](https://github.com/aFarkas/lazysizes), and [Lunr.js](https://lunrjs.com/).
|
||||||
|
Object metadata is exposed using [Schema.org](http://schema.org) and [Open Graph protocol](http://ogp.me/) standards.
|
||||||
|
|
||||||
|
Questions can be directed to **collectionbuilder.team@gmail.com**
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
CollectionBuilder documentation and general web content is licensed [Creative Commons Attribution-ShareAlike 4.0 International](http://creativecommons.org/licenses/by-sa/4.0/).
|
||||||
|
This license does *NOT* include any objects or images used in digital collections, which may have individually applied licenses described by a "rights" field.
|
||||||
|
CollectionBuilder code is licensed [MIT](https://github.com/CollectionBuilder/collectionbuilder-csv/blob/master/LICENSE).
|
||||||
|
This license does not include external dependencies included in the `assets/lib` directory, which are covered by their individual licenses.
|
||||||
33
Rakefile
Normal file
33
Rakefile
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# CollectionBuilder Rake Utilities
|
||||||
|
#
|
||||||
|
# See "docs/rake_tasks/" for documentation.
|
||||||
|
# See "rakelib" for individual rake tasks!
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
require 'csv'
|
||||||
|
require 'fileutils'
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Helper Functions
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
def prompt_user_for_confirmation(message)
|
||||||
|
response = nil
|
||||||
|
loop do
|
||||||
|
print "#{message} (Y/n): "
|
||||||
|
$stdout.flush
|
||||||
|
response = case $stdin.gets.chomp.downcase
|
||||||
|
when '', 'y' then true
|
||||||
|
when 'n' then false
|
||||||
|
end
|
||||||
|
break unless response.nil?
|
||||||
|
|
||||||
|
puts 'Please enter "y" or "n"'
|
||||||
|
end
|
||||||
|
response
|
||||||
|
end
|
||||||
11
SECURITY.md
Normal file
11
SECURITY.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
CollectionBuilder-CSV is a template repository used to start other projects.
|
||||||
|
External projects are not automatically updated from the central template--security issues relating to existing projects *created with CollectionBuilder* should be reported to the individual repository/project owners.
|
||||||
|
Security issues found in the main branch of the current CollectionBuilder-CSV template and its assets should be reported to CollectionBuilder team directly.
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
To report a security issue, please email <collectionbuilder.team@gmail.com> with a description of the issue, the steps you took to create the issue, affected versions, and, if known, mitigations for the issue. This project follows a 90 day disclosure timeline.
|
||||||
79
_config.yml
Normal file
79
_config.yml
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
##########
|
||||||
|
# collectionbuilder-csv
|
||||||
|
# Jekyll Digital Collection Generator
|
||||||
|
# https://github.com/CollectionBuilder/collectionbuilder-csv
|
||||||
|
##########
|
||||||
|
|
||||||
|
##########
|
||||||
|
# URL VARIABLES
|
||||||
|
#
|
||||||
|
# site domain, full URL to the production location of your collection
|
||||||
|
url:
|
||||||
|
# path to location on the domain if necessary e.g. /digital/hjccc
|
||||||
|
baseurl:
|
||||||
|
# location of code, the full url to your github repository
|
||||||
|
source-code: https://github.com/CollectionBuilder/collectionbuilder-csv
|
||||||
|
|
||||||
|
##########
|
||||||
|
# SITE SETTINGS
|
||||||
|
#
|
||||||
|
# title of site appears in banner
|
||||||
|
title: CollectionBuilder CSV
|
||||||
|
# tagline, a short phrase that will appear throughout the site in the top banner
|
||||||
|
tagline: Digital Collection Magic with Static Web Technologies
|
||||||
|
# description appears in meta tags and other locations
|
||||||
|
# this description might appear in search result lists, keep around 160 characters max
|
||||||
|
description: "CollectionBuilder-CSV is a template for creating digital collection exhibits using static web technology."
|
||||||
|
# keywords, a short list of subjects describing the collection, separated by semicolon, to appear in rich markup
|
||||||
|
keywords: idaho; history; inland northwest
|
||||||
|
# creator of the digital collection, to appear in meta tags; we typically use our GitHub usernames but feel free to just use your name
|
||||||
|
author: CollectionBuilder
|
||||||
|
|
||||||
|
##########
|
||||||
|
# COLLECTION SETTINGS
|
||||||
|
#
|
||||||
|
# Set the metadata for your collection (the name of the CSV file in your _data directory that describes the objects in your collection)
|
||||||
|
# Use the filename of your CSV **without** the ".csv" extension! E.g. _data/demo-metadata.csv --> "demo-metadata"
|
||||||
|
metadata: demo-compoundobjects-metadata
|
||||||
|
# page generation settings [optional!]
|
||||||
|
# [optional: only used if you need to tweak CB defaults or generate from more than one data file]
|
||||||
|
# page_gen:
|
||||||
|
# - data: 'demo-metadata'
|
||||||
|
# template: 'item'
|
||||||
|
# name: 'objectid'
|
||||||
|
# dir: 'items'
|
||||||
|
# extension: 'html'
|
||||||
|
# filter: 'objectid'
|
||||||
|
|
||||||
|
##########
|
||||||
|
# ORGANIZATION SETTINGS
|
||||||
|
#
|
||||||
|
# Enter name and link for your organization (replacing the name and links below)
|
||||||
|
# These values will be used in attribution and data
|
||||||
|
organization-name: "Center for Digital Inquiry and Learning (CDIL)"
|
||||||
|
organization-link: https://cdil.lib.uidaho.edu/
|
||||||
|
# Add logo image links if you would like them to appear in banner and footer. Delete or leave blank to remove logos.
|
||||||
|
organization-logo-banner: https://www.lib.uidaho.edu/collectionbuilder/cdil-black.png
|
||||||
|
organization-logo-nav: https://www.lib.uidaho.edu/collectionbuilder/cdil-white.png
|
||||||
|
|
||||||
|
##########
|
||||||
|
# ROBOTS EXCLUDE
|
||||||
|
#
|
||||||
|
# set noindex to true if you do NOT want Google to index your site
|
||||||
|
# noindex: true
|
||||||
|
|
||||||
|
##########
|
||||||
|
# BUILD SETTINGS
|
||||||
|
#
|
||||||
|
# Note: use environment variable on build command to include analytics
|
||||||
|
# JEKYLL_ENV=production jekyll build
|
||||||
|
# (this is done automatically by gh-pages build)
|
||||||
|
#
|
||||||
|
# Library directory location. This allows you to customize where the standard assets are found.
|
||||||
|
# provide a relative path in this repository or full url
|
||||||
|
lib-assets: /assets/lib
|
||||||
|
# ignore stuff
|
||||||
|
exclude: [docs/, Rakefile, rakelib/, README.md, LICENSE, CITATION.cff, CODE_OF_CONDUCT.md, CONTRIBUTING.md, SECURITY.md]
|
||||||
|
# compress CSS output
|
||||||
|
sass:
|
||||||
|
style: compressed
|
||||||
7
_data/config-browse.csv
Normal file
7
_data/config-browse.csv
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
field,display_name,btn,hidden,sort_name,facet_name
|
||||||
|
date,Date,,,Date Created
|
||||||
|
description,,,true,
|
||||||
|
creator,Creator,,,
|
||||||
|
subject,,true
|
||||||
|
location,,true,,,Location Depicted
|
||||||
|
identifier,,,true,Identifier
|
||||||
|
5
_data/config-map.csv
Normal file
5
_data/config-map.csv
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
field,display_name,search
|
||||||
|
date,Date,true
|
||||||
|
creator,Creator,true
|
||||||
|
subject,Subjects,true
|
||||||
|
location,Location,true
|
||||||
|
15
_data/config-metadata.csv
Normal file
15
_data/config-metadata.csv
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
field,display_name,browse_link,external_link,dc_map,schema_map
|
||||||
|
title,Title,,,DCTERMS.title,headline
|
||||||
|
creator,Creator,,,DCTERMS.creator,creator
|
||||||
|
date,Date Created,,,DCTERMS.date,dateCreated
|
||||||
|
description,Description,,,DCTERMS.description,description
|
||||||
|
subject,Subjects,true,,DCTERMS.subject,keywords
|
||||||
|
location,Location,,,,contentLocation
|
||||||
|
latitude,Latitude,,,,
|
||||||
|
longitude,Longitude,,,,
|
||||||
|
source,Source,,,,
|
||||||
|
identifier,Source Identifier,,,,
|
||||||
|
type,Type,,,DCTERMS.type,
|
||||||
|
format,Format,,,,encodingFormat
|
||||||
|
language,Language,,,DCTERMS.language,
|
||||||
|
rightsstatement,,,,DCTERMS.rights,license
|
||||||
|
9
_data/config-nav.csv
Normal file
9
_data/config-nav.csv
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
display_name,stub,dropdown_parent
|
||||||
|
Home,/,
|
||||||
|
Browse,/browse.html,
|
||||||
|
Subjects,/subjects.html,
|
||||||
|
Locations,/locations.html,
|
||||||
|
Map,/map.html,
|
||||||
|
Timeline,/timeline.html,
|
||||||
|
Data,/data.html,
|
||||||
|
About,/about.html,
|
||||||
|
7
_data/config-search.csv
Normal file
7
_data/config-search.csv
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
field,index,display
|
||||||
|
title,true,true
|
||||||
|
date,true,true
|
||||||
|
creator,true,false
|
||||||
|
description,true,true
|
||||||
|
subject,true,true
|
||||||
|
location,true,false
|
||||||
|
5
_data/config-table.csv
Normal file
5
_data/config-table.csv
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
field,display_name
|
||||||
|
title,Title
|
||||||
|
date,Date
|
||||||
|
description,Description
|
||||||
|
subject,Subjects
|
||||||
|
9
_data/config-theme-colors.csv
Normal file
9
_data/config-theme-colors.csv
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
color_class,color
|
||||||
|
primary,
|
||||||
|
secondary,
|
||||||
|
success,
|
||||||
|
info,
|
||||||
|
warning,
|
||||||
|
danger,
|
||||||
|
light,
|
||||||
|
dark,
|
||||||
|
51
_data/demo-compoundobjects-allmedia.csv
Normal file
51
_data/demo-compoundobjects-allmedia.csv
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
objectid,parentid,title,creator,date,date-is-approximate?,description,subject,location,latitude,longitude,source,identifier,type,format,language,rights,rightsstatement,display_template,object_location,image_small,image_thumb,image_alt_text,object_transcript
|
||||||
|
demo_001,demo_008,"Administration Building, University of Idaho, No. 30",Pacific Photo Co.,1910,,"Example locally hosted image item. Photographic postcard of the University of Idaho administration building in Moscow, Idaho.",universities; buildings; campuses; picture postcards,"Moscow, Idaho",46.725562,-117.009633,"PG 9, Postcard Collection, Special Collections and Archives, University of Idaho Library",pg_9_12_01bl,Image;StillImage,image/jpeg,eng,Public Domain,https://creativecommons.org/publicdomain/mark/1.0/,image,/objects/demo_001.jpg,/objects/small/demo_001_sm.jpg,/objects/thumbs/demo_001_th.jpg,historic sepia photograph depicting a formal brick and stone building in the College Gothic style,
|
||||||
|
demo_002,demo_008,"Spokane County Court House, Spokane, Washington",Spokane Post Card Co.,1912-09-08,,"Example locally hosted PDF item. Postcard is of the Spokane County Courthouse in Spokane, Washington. Postmark 9/8/1912, Spokane, WA. Destination San Francisco, CA.",public buildings; county courthouses; trees; picture postcards,"Spokane, Washington",47.66432,-117.428031,"PG 107, Knowles Postcard Collection, Special Collections and Archives, University of Idaho Library",Postcard_032,Image;StillImage,application/pdf,eng,Public Domain,https://creativecommons.org/publicdomain/mark/1.0/,pdf,/objects/demo_002.pdf,/objects/small/demo_002_sm.jpg,/objects/thumbs/demo_002_th.jpg,historic colorized postcard depicting a formal building with a large central tower in the French Renaissance revival style,
|
||||||
|
demo_003,demo_008,Good News – Power (Radio Episode Excerpt),"Robinson, Frank B.",1947,,Example locally hosted audio item. A short excerpt from a Psychiana radio program episode that begins with assurance that there is a Power that can get people what they desire. Robinson then discusses his early life failures and childhood seeking of some force that could turn his failures into success. He asserts the God-Power can turn our failures into success and bring us material and spiritual abundance.,Frank B. Robinson; Failure; Success; Material Abundance,"Moscow, Idaho",46.733001,-116.991779,"Psychiana Digital Collection, Digital Initiatives, University of Idaho Library, https://www.lib.uidaho.edu/digital/psychiana/",Good_News_08,Audio,audio/mp3,eng,"In Copyright - Educational Use Permitted. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,audio,/objects/demo_003.mp3,/objects/small/demo_003_sm.jpg,/objects/thumbs/demo_003_th.jpg,"portrait of a man in a suit, with the text 'the amazing story of Psychiana' below","[slightly scratchy recording of a radio broadcast. A organ plays dramatic intro music, then continues quietly behind speaker voice]
|
||||||
|
|
||||||
|
[Dramatic male speaking voice]:
|
||||||
|
|
||||||
|
As an army terrible with batters sweeping before it the black shades of night, routing despair, comes the flaming truth of the God law.
|
||||||
|
|
||||||
|
Why do you suffer the indignities of life, when you can control life? Your fate is in your hands now, for at last, the way is open, if you will but take it.
|
||||||
|
When Dr. Frank B Robinson first realized the dynamic implications of Psychiana, he was in debt, a humble drug clerk with no future, no hope. Now he possesses all that he wants of wealth, his mind is at peace, and he is accorded praise and renown as an outstanding and famous psychologist. The same forces that raised him out of the depths, to stand on a high plane among men, can be put to work for you."
|
||||||
|
demo_004,demo_008,"University of Idaho vs. University of Southern California (Football), 10/30/1925",Vandal Athletics,1925-10-30,,"Example YouTube video item. Idaho Football vs. University of Southern California 10/30/1925 at Neale Stadium in Moscow, ID. Score: 7 - 51 (L). Silent film footage.",American Football,"Moscow, Idaho",46.726113,-117.015671,"Vandal Video Collection, Digital Initiatives, University of Idaho Library, https://www.lib.uidaho.edu/digital/vandalvideo/","MG 23, Item 29",Image;MovingImage,video/mp4,eng,"In Copyright - Educational Use Permitted. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,video,https://youtu.be/CVXQ3X6Q8oU,https://img.youtube.com/vi/CVXQ3X6Q8oU/hqdefault.jpg,https://img.youtube.com/vi/CVXQ3X6Q8oU/mqdefault.jpg,grainy image from historic film depicting fans heading to football game,
|
||||||
|
demo_005,demo_008,Interview with K. Silem Mohammad,"Becker, Devin",2014-06-16,,Example Vimeo video item. Oral history interview with poet K. Silem Mohammad discussing recent changes in writing practices that occurred due to the advent of the computer and the arrival of the digital age.,Poetry,"Ashland, OR",42.1916714,-122.728533,"CTRL+Shift, Center for Digital Inquiry and Learning, University of Idaho Library, https://ctrl-shift.org/",,Image;MovingImage,video/mp4,eng,"In Copyright - Educational Use Permitted. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,video,https://vimeo.com/464555587,,,,"/objects/demo_005.txt"
|
||||||
|
demo_006,demo_008,Ford pumper used for slash burning control,"Thompson, J. B.",1932-09-01,,Example image item externally hosted. Ford pumper used for slash burning control. September 1932. From the photo series depicting the broadcast burn at the mouth of Benton Creek.,forestry,Bonner County;Priest River Experimental Forest;Benton Creek,48.34472222,-116.8483333,"Experimental Forest and Savenac Nursery Archive, Digital Initiatives, University of Idaho Library, https://www.lib.uidaho.edu/digital/expforest/",FirePump1,Image;StillImage,image/jpeg,eng,"Material produced by the United States Forest Service and is in Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,image,https://www.lib.uidaho.edu/collectionbuilder/demo-objects/demo_006.jpg,https://www.lib.uidaho.edu/collectionbuilder/demo-objects/small/demo_006_sm.jpg,https://www.lib.uidaho.edu/collectionbuilder/demo-objects/thumbs/demo_006_th.jpg,man standing with pump machinery next to a river with trees and mountains in the distance,
|
||||||
|
demo_007,demo_008,Influence of Fishway Placement on Fallback of Adult Salmon at the Bonneville Dam on the Columbia River,"Reischel, T.S.; Bjornn, T.C.",2003,,Example metadata-only record with link to external source. Journal article.,fisheries management,Bonneville Dam,45.6442837,-121.9428256,"North American Journal of Fisheries Management, vol. 23, issue 4, p. 1215-1224. DOI: 10.1577/M02-113",DOI:10.1577/M02-113,Text,application/pdf,eng,"Metadata-only record, please check publication for rights",,record,https://www.doi.org/10.1577/M02-113,,,,
|
||||||
|
demo_008,,Hell's Half Acre,Keeping Watch,,,"Example compound object. Hells Half Acre is an R-6 cabin that is easily accessible by road in the Selway-Bitterroot Wilderness. Originally a platform on top of a forty-foot-tall tower, the original Hell's Half Acre cabin was an L-4. Now one of the most popular lookouts in Idaho or Montana, it sits above a snag forest of mostly lodgepole pine. A sign at the base of the summit informs drivers that the tower opens at 9 am. Unsure if this refers to mountain or pacific time, we wait at the sign and drink our coffee.",,,45.64579,-114.62838,Keeping Watch Fire Tower Oral HIstory Project,,record,compound_object,eng,"In Copyright - Educational Use Permitted. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,compound_object,,https://cdil.lib.uidaho.edu/keeping-watch/objects/small/outside_shot_hells_half_sm.jpg,https://cdil.lib.uidaho.edu/keeping-watch/objects/thumbs/outside_shot_hells_half_th.jpg,fire lookout tower with a flag pole and American flag,
|
||||||
|
demo_009,demo_008,Hell's Half Acre Lookout 360 Image,Keeping Watch,2021-07-13,,Example child object. 360 Image of the Interior of Hell's Half Acre Fire Tower,,Hell's Half Acre,45.64579,-114.62838,,,Image;StillImage,image/jpeg,eng,,,panorama,/objects/hells_half_theta.jpg,https://cdil.lib.uidaho.edu/keeping-watch/objects/small/hells_half_theta_sm.jpg,https://cdil.lib.uidaho.edu/keeping-watch/objects/thumbs/hells_half_theta_th.jpg,interior of a fire lookout tower with map in center and windows in all directions,
|
||||||
|
demo_010,demo_008,Patrick McMarron Records Fire Conditions at Hell's Half Acre Lookout,Keeping Watch,2021-07-13,,Example child object. Video of Patrick McMarron recording fire conditions in July of 2021 on Hells Half Acre Fire Lookout,,Hell's Half Acre,45.64579,-114.62838,,,Image;MovingImage,video/mp4,eng,,,video,https://cdil.lib.uidaho.edu/keeping-watch/objects/videos/patrick_records_weather.MP4,,,man in fire lookout tower records conditions in notebook,"[Unknown speaker reports on slightly fuzzy radio while as Patrick McMarron writes notes]
|
||||||
|
|
||||||
|
Temperatures 85 to 90 in valleys, 70 to 75 ridges.
|
||||||
|
Minimum humidity 15 to 25 percent valleys and 22 to 32 percent ridges.
|
||||||
|
20 foot winds at lower elevations Northwest, 5 to 15 miles per hour.
|
||||||
|
Ridge top, Northwest, 5 to 15 miles per hour.
|
||||||
|
Hains index 4 low. LAL 4.
|
||||||
|
Chance of rain zero percent.
|
||||||
|
Break.
|
||||||
|
|
||||||
|
Tonight’s sky weather, mostly clear, smoke.
|
||||||
|
Minimum temperature 45 to 55 valleys...
|
||||||
|
|
||||||
|
[video ends abruptly]"
|
||||||
|
demo_011,demo_008,Outside shot of Hells Half Acre Lookout,Keeping Watch,2021-07-13,,Example child object. Outside shot of Hells Half Acre Lookout,,Hell's Half Acre,45.64579,-114.62838,,,Image;StillImage,image/jpeg,eng,,,image,https://cdil.lib.uidaho.edu/keeping-watch/objects/hell-s-half-acre/outside_shot_hells_half.JPG,https://cdil.lib.uidaho.edu/keeping-watch/objects/small/outside_shot_hells_half_sm.jpg,https://cdil.lib.uidaho.edu/keeping-watch/objects/thumbs/outside_shot_hells_half_th.jpg,fire lookout tower with a flag pole and American flag,
|
||||||
|
demo_012,demo_008,Patrick McMarron Discusses the Importance of Human Beings on the Lookout,Keeping Watch,2021-07-13,,Example child object. Video of Patrick McMarron discussing the importance of human beings staffing fire lookouts,Patrick McMarron; Hell's Half Acre,Hell's Half Acre,45.64579,-114.62838,,,Image;MovingImage,video/mp4,eng,,,video,https://cdil.lib.uidaho.edu/keeping-watch/objects/videos/patrick_the_human_being.mp4,,,Patrick McMarron Discusses the Importance of Human Beings on the Lookout,"/objects/demo_012.md"
|
||||||
|
demo_013,,Peeled Tree,,,,Example multiple. A cross section of a peeled tree from the Payette National Forest. The inner bark was utilized as a food resource by Indigenous Tribe.,Peeled Tree; Payette National Forest; Indigenous Tribe,,,,,,record,image/jpeg,eng,"Educational use includes non-commercial use of text and images in materials for teaching and research purposes. Digital reproduction permissions granted by University of Idaho Library Special Collections and Archives Department. For other uses beyond free use, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://rightsstatements.org/vocab/InC-EDU/1.0/,multiple,,https://objects.lib.uidaho.edu/collectionbuilder/demo/small/dsc_0136_sm.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/thumbs/dsc_0136_th.jpg,log cross section showing tree rings and one side of tree bark peeled,
|
||||||
|
demo_014,demo_013,Peeled Tree View 1,,,,,,,,,,,Image;StillImage,image/jpeg,,,,image,https://objects.lib.uidaho.edu/collectionbuilder/demo/dsc_0136.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/small/dsc_0136_sm.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/thumbs/dsc_0136_th.jpg,log cross section showing tree rings and one side of tree bark peeled,
|
||||||
|
demo_015,demo_013,Peeled Tree View 2,,,,,,,,,,,Image;StillImage,image/jpeg,,,,image,https://objects.lib.uidaho.edu/collectionbuilder/demo/dsc_0137.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/small/dsc_0137_sm.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/thumbs/dsc_0137_th.jpg,log cross section showing where tree bark was peeled,
|
||||||
|
demo_016,demo_013,Peeled Tree View 3,,,,,,,,,,,Image;StillImage,image/jpeg,,,,image,https://objects.lib.uidaho.edu/collectionbuilder/demo/dsc_0138.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/small/dsc_0138_sm.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/thumbs/dsc_0138_th.jpg,log cross section showing where tree bark was peeled,
|
||||||
|
demo_017,,Hell's Half Acre Lookout 360 Image,Keeping Watch,2021-07-13,,Example panorama. 360 Image of the Interior of Hell's Half Acre Fire Tower,,Hell's Half Acre,45.64579,-114.62838,,,Image;StillImage,image/jpeg,eng,,,panorama,/objects/hells_half_theta.jpg,https://cdil.lib.uidaho.edu/keeping-watch/objects/small/hells_half_theta_sm.jpg,https://cdil.lib.uidaho.edu/keeping-watch/objects/thumbs/hells_half_theta_th.jpg,interior of a fire lookout tower with map in center and windows in all directions,
|
||||||
|
demo_018,,"Spokane's Great Restaurant, Washington","Mitchell, Edward H.",1909,,"Example postcard using display template 'multiple.' Postcard is of the Davenport Hotel's Restaurant in Spokane, Washington.",restaurants; automobiles; buildings; picture postcards; flagpoles; flags,"Spokane, WA",47.65710758,-117.4249084,"PG 9, Postcard Collection, University of Idaho Library Special Collections and Archives, http://www.lib.uidaho.edu/special-collections/",Postcard_038,record,postcard,eng,"Educational use includes non-commercial use of text and images in materials for teaching and research purposes. Digital reproduction rights granted by University of Idaho Library. For other uses beyond educational use, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,multiple,,/objects/small/210a_sm.jpg,/objects/thumbs/210a_th.jpg,historic colorized postcard depicting a fancy multi-story white building with several early cars parked in front,
|
||||||
|
demo_019,demo_018,postcard front,,,,,,,,,,210a,Image;StillImage,image/jpeg,,,,image,/objects/210a.jpg,/objects/small/210a_sm.jpg,/objects/thumbs/210a_th.jpg,historic colorized postcard depicting a fancy multi-story white building with several early cars parked in front,
|
||||||
|
demo_020,demo_018,postcard back,,,,,,,,,,210b,Image;StillImage,image/jpeg,,,,image,/objects/210b.jpg,/objects/small/210b_sm.jpg,/objects/thumbs/210b_th.jpg,"back of historic postcard dated Sept 5, 1909 with very difficult to read cursive writing in pencil",
|
||||||
|
demo_021,,"Jennie Eva Hughes, the First Black Graduate of the University of Idaho",,1899,yes,"Example compound object. Items from the Black History at University of Idaho that feature Jennie Eva Hughes, the first black graduate of the University of Idaho",Jennie Eva Hughes; Black History; University of Idaho,"Moscow, ID",46.725562,-117.009633,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,,record,compound_object,eng,,,compound_object,,https://www.lib.uidaho.edu/blackhistory/objects/small/ma2000_29_001_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/ma2000_29_001_th.jpg,"University of Idaho enrollment form filled in with handwritten cursive script saying ""Jennie Eva Hughes, Sept 23, 1898""",
|
||||||
|
demo_022,demo_021,Portrait of Jennie Eva Hughes [1],,1899,yes,Example child object. Black and white portrait of Jennie Eva Hughes.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,mg5758_001,Image;StillImage,image/jpeg,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,image,https://www.lib.uidaho.edu/blackhistory/objects/mg5758_001.jpg,https://www.lib.uidaho.edu/blackhistory/objects/small/mg5758_001_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/mg5758_001_th.jpg,black and white portrait of an African American woman in a dress,
|
||||||
|
demo_023,demo_021,Portrait of Jennie Eva Hughes [2],,1899,yes,Example child object. Black and white standing portrait of Jennie Eva Hughes dressed in white. Hughes holds a scroll in her left hand.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,mg5758_002,Image;StillImage,image/jpeg,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,image,https://www.lib.uidaho.edu/blackhistory/objects/mg5758_002.jpg,https://www.lib.uidaho.edu/blackhistory/objects/small/mg5758_002_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/mg5758_002_th.jpg,black and white full length portrait of an African American woman in a formal white dress with flowers and holding a scroll in her hand,
|
||||||
|
demo_024,demo_021,"""The Uncrowned King"" by Jennie Eva Hughes","Hughes, Jennie Eva",1898-04-15,,"Example child object. This speech won her the medal oration on April 15, 1898 at University of Idaho.",,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,mg5758_003,text,application/pdf,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,pdf,https://www.lib.uidaho.edu/blackhistory/objects/mg5758_003.pdf,https://www.lib.uidaho.edu/blackhistory/objects/small/mg5758_003_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/mg5758_003_th.jpg,"""The Uncrowned King"" by Jennie Eva Hughes",
|
||||||
|
demo_025,demo_021,Spokesman article about Jennie Eva Hughes' oration win,The Spokesman-Review,1898,yes,Example child object. Spokesman-Review article about the oratorical event event and Jennie Eva Hughes' win.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,mg5758_004,text,application/pdf,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,pdf,https://www.lib.uidaho.edu/blackhistory/objects/mg5758_004.pdf,https://www.lib.uidaho.edu/blackhistory/objects/small/mg5758_004_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/mg5758_004_th.jpg,aged newspaper clipping of a Spokesman article about Jennie Eva Hughes' oration win,
|
||||||
|
demo_026,demo_021,University of Idaho class of 1899,,1898,yes,"Example child object. Back row (left to right): Fred Merriam, Clara Playfair, Eva Nichols, Clem Herbert, Guy Wolfe, Ava Sweet, Fred Moore. Front row (left to right): Kate Hanley, Maude Mix, Charles Armstrong, Will Stillinger, Jennie Eva Hughes, Gilbert Hogue.",,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,pg2_110_1,Image;StillImage,image/jpeg,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,image,https://www.lib.uidaho.edu/blackhistory/objects/pg2_110_1.jpg,https://www.lib.uidaho.edu/blackhistory/objects/small/pg2_110_1_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/pg2_110_1_th.jpg,black and white group portrait of 6 women and 7 men in formal clothing with Jennie Eva Hughes seated in the front row,
|
||||||
|
demo_027,demo_021,Jennie Eva Hughes' 1898 registration card at University of Idaho,,1898-09-23,,Example child object. Jennie Eva Hughes' registration card for 1898 for the University of Idaho.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,ma2000_29_001,text,application/pdf,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,pdf,https://www.lib.uidaho.edu/blackhistory/objects/ma2000_29_001.pdf,https://www.lib.uidaho.edu/blackhistory/objects/small/ma2000_29_001_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/ma2000_29_001_th.jpg,"University of Idaho enrollment form filled in with handwritten cursive script saying ""Jennie Eva Hughes, Sept 23, 1898""",
|
||||||
|
demo_028,demo_021,Jennie Eva Hughes' 1899 registration card at University of Idaho,,1899-02-15,,Example child object. Jennie Eva Hughes' registration card for 1899 for the University of Idaho.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,ma2000_29_002,text,application/pdf,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,pdf,https://www.lib.uidaho.edu/blackhistory/objects/ma2000_29_002.pdf,https://www.lib.uidaho.edu/blackhistory/objects/small/ma2000_29_002_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/ma2000_29_002_th.jpg,"University of Idaho enrollment form filled in with handwritten cursive script saying ""Jennie Eva Hughes, Feb 15, 1899""",
|
||||||
|
demo_029,demo_021,Innovation of Class Day,,1899-06-01,,Example child object. Argonaut article about Class Day with mention of the oration given by Jennie Eva Hughes.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,arg-1899-06-01_p181-innovation,text,application/pdf,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,pdf,https://www.lib.uidaho.edu/blackhistory/objects/arg-1899-06-01_p181-innovation.pdf,https://www.lib.uidaho.edu/blackhistory/objects/small/arg-1899-06-01_p181-innovation_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/arg-1899-06-01_p181-innovation_th.jpg,Innovation of Class Day,
|
||||||
|
demo_030,demo_021,The First Black Graduate - Jennie Eva Hughes,"Shannon, Michelle",2022,,Example child object. Article summarizing the history of Jennie Eva Hughes at the Univeritiy of Idaho.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,https://www.lib.uidaho.edu/blackhistory/features/hughes.html,text,text/html,eng,"In Copyright - Educational Use Permitted. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,record,https://www.lib.uidaho.edu/blackhistory/features/hughes.html,/objects/small/hughes_article_sm.jpg,/objects/thumbs/hughes_article_th.jpg,"screenshot showing web essay titled ""The First Black Graduate - Jennie Eva Hughes""",
|
||||||
|
55
_data/demo-compoundobjects-metadata.csv
Normal file
55
_data/demo-compoundobjects-metadata.csv
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
objectid,parentid,title,creator,date,date-is-approximate?,description,subject,location,latitude,longitude,source,identifier,type,format,language,rights,rightsstatement,display_template,object_location,image_small,image_thumb,image_alt_text,object_transcript
|
||||||
|
demo_001,,"Administration Building, University of Idaho, No. 30",Pacific Photo Co.,1910,,"Example locally hosted image item. Photographic postcard of the University of Idaho administration building in Moscow, Idaho.",universities; buildings; campuses; picture postcards,"Moscow, Idaho",46.725562,-117.009633,"PG 9, Postcard Collection, Special Collections and Archives, University of Idaho Library",pg_9_12_01bl,Image;StillImage,image/jpeg,eng,Public Domain,https://creativecommons.org/publicdomain/mark/1.0/,image,/objects/demo_001.jpg,/objects/small/demo_001_sm.jpg,/objects/thumbs/demo_001_th.jpg,historic sepia photograph depicting a formal brick and stone building in the College Gothic style,
|
||||||
|
demo_002,,"Spokane County Court House, Spokane, Washington",Spokane Post Card Co.,1912-09-08,,"Example locally hosted PDF item. Postcard is of the Spokane County Courthouse in Spokane, Washington. Postmark 9/8/1912, Spokane, WA. Destination San Francisco, CA.",public buildings; county courthouses; trees; picture postcards,"Spokane, Washington",47.66432,-117.428031,"PG 107, Knowles Postcard Collection, Special Collections and Archives, University of Idaho Library",Postcard_032,Image;StillImage,application/pdf,eng,Public Domain,https://creativecommons.org/publicdomain/mark/1.0/,pdf,/objects/demo_002.pdf,/objects/small/demo_002_sm.jpg,/objects/thumbs/demo_002_th.jpg,historic colorized postcard depicting a formal building with a large central tower in the French Renaissance revival style,
|
||||||
|
demo_003,,Good News – Power (Radio Episode Excerpt),"Robinson, Frank B.",1947,,Example locally hosted audio item. A short excerpt from a Psychiana radio program episode that begins with assurance that there is a Power that can get people what they desire. Robinson then discusses his early life failures and childhood seeking of some force that could turn his failures into success. He asserts the God-Power can turn our failures into success and bring us material and spiritual abundance.,Frank B. Robinson; Failure; Success; Material Abundance,"Moscow, Idaho",46.733001,-116.991779,"Psychiana Digital Collection, Digital Initiatives, University of Idaho Library, https://www.lib.uidaho.edu/digital/psychiana/",Good_News_08,Audio,audio/mp3,eng,"In Copyright - Educational Use Permitted. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,audio,/objects/demo_003.mp3,/objects/small/demo_003_sm.jpg,/objects/thumbs/demo_003_th.jpg,"portrait of a man in a suit, with the text 'the amazing story of Psychiana' below","[slightly scratchy recording of a radio broadcast. A organ plays dramatic intro music, then continues quietly behind speaker voice]
|
||||||
|
|
||||||
|
[Dramatic male speaking voice]:
|
||||||
|
|
||||||
|
As an army terrible with batters sweeping before it the black shades of night, routing despair, comes the flaming truth of the God law.
|
||||||
|
|
||||||
|
Why do you suffer the indignities of life, when you can control life? Your fate is in your hands now, for at last, the way is open, if you will but take it.
|
||||||
|
When Dr. Frank B Robinson first realized the dynamic implications of Psychiana, he was in debt, a humble drug clerk with no future, no hope. Now he possesses all that he wants of wealth, his mind is at peace, and he is accorded praise and renown as an outstanding and famous psychologist. The same forces that raised him out of the depths, to stand on a high plane among men, can be put to work for you."
|
||||||
|
demo_004,,"University of Idaho vs. University of Southern California (Football), 10/30/1925",Vandal Athletics,1925-10-30,,"Example YouTube video item. Idaho Football vs. University of Southern California 10/30/1925 at Neale Stadium in Moscow, ID. Score: 7 - 51 (L). Silent film footage.",American Football,"Moscow, Idaho",46.726113,-117.015671,"Vandal Video Collection, Digital Initiatives, University of Idaho Library, https://www.lib.uidaho.edu/digital/vandalvideo/","MG 23, Item 29",Image;MovingImage,video/mp4,eng,"In Copyright - Educational Use Permitted. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,video,https://youtu.be/CVXQ3X6Q8oU,https://img.youtube.com/vi/CVXQ3X6Q8oU/hqdefault.jpg,https://img.youtube.com/vi/CVXQ3X6Q8oU/mqdefault.jpg,grainy image from historic film depicting fans heading to football game,
|
||||||
|
demo_005,,Interview with K. Silem Mohammad,"Becker, Devin",2014-06-16,,Example Vimeo video item. Oral history interview with poet K. Silem Mohammad discussing recent changes in writing practices that occurred due to the advent of the computer and the arrival of the digital age.,Poetry,"Ashland, OR",42.1916714,-122.728533,"CTRL+Shift, Center for Digital Inquiry and Learning, University of Idaho Library, https://ctrl-shift.org/",,Image;MovingImage,video/mp4,eng,"In Copyright - Educational Use Permitted. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,video,https://vimeo.com/464555587,,,,"/objects/demo_005.txt"
|
||||||
|
demo_006,,Ford pumper used for slash burning control,"Thompson, J. B.",1932-09-01,,Example image item externally hosted. Ford pumper used for slash burning control. September 1932. From the photo series depicting the broadcast burn at the mouth of Benton Creek.,forestry,Bonner County;Priest River Experimental Forest;Benton Creek,48.34472222,-116.8483333,"Experimental Forest and Savenac Nursery Archive, Digital Initiatives, University of Idaho Library, https://www.lib.uidaho.edu/digital/expforest/",FirePump1,Image;StillImage,image/jpeg,eng,"Material produced by the United States Forest Service and is in Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,image,https://www.lib.uidaho.edu/collectionbuilder/demo-objects/demo_006.jpg,https://www.lib.uidaho.edu/collectionbuilder/demo-objects/small/demo_006_sm.jpg,https://www.lib.uidaho.edu/collectionbuilder/demo-objects/thumbs/demo_006_th.jpg,man standing with pump machinery next to a river with trees and mountains in the distance,
|
||||||
|
demo_007,,Influence of Fishway Placement on Fallback of Adult Salmon at the Bonneville Dam on the Columbia River,"Reischel, T.S.; Bjornn, T.C.",2003,,Example metadata-only record with link to external source. Journal article.,fisheries management,Bonneville Dam,45.6442837,-121.9428256,"North American Journal of Fisheries Management, vol. 23, issue 4, p. 1215-1224. DOI: 10.1577/M02-113",DOI:10.1577/M02-113,Text,application/pdf,eng,"Metadata-only record, please check publication for rights",,record,https://www.doi.org/10.1577/M02-113,,,,
|
||||||
|
demo_008,,Hell's Half Acre,Keeping Watch,,,"Example compound object. Hells Half Acre is an R-6 cabin that is easily accessible by road in the Selway-Bitterroot Wilderness. Originally a platform on top of a forty-foot-tall tower, the original Hell's Half Acre cabin was an L-4. Now one of the most popular lookouts in Idaho or Montana, it sits above a snag forest of mostly lodgepole pine. A sign at the base of the summit informs drivers that the tower opens at 9 am. Unsure if this refers to mountain or pacific time, we wait at the sign and drink our coffee.",,,45.64579,-114.62838,Keeping Watch Fire Tower Oral HIstory Project,,record,compound_object,eng,"In Copyright - Educational Use Permitted. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,compound_object,,https://cdil.lib.uidaho.edu/keeping-watch/objects/small/outside_shot_hells_half_sm.jpg,https://cdil.lib.uidaho.edu/keeping-watch/objects/thumbs/outside_shot_hells_half_th.jpg,fire lookout tower with a flag pole and American flag,
|
||||||
|
demo_009,demo_008,Hell's Half Acre Lookout 360 Image,Keeping Watch,2021-07-13,,Example child object. 360 Image of the Interior of Hell's Half Acre Fire Tower,,Hell's Half Acre,45.64579,-114.62838,,,Image;StillImage,image/jpeg,eng,,,panorama,/objects/hells_half_theta.jpg,https://cdil.lib.uidaho.edu/keeping-watch/objects/small/hells_half_theta_sm.jpg,https://cdil.lib.uidaho.edu/keeping-watch/objects/thumbs/hells_half_theta_th.jpg,interior of a fire lookout tower with map in center and windows in all directions,
|
||||||
|
demo_010,demo_008,Patrick McMarron Records Fire Conditions at Hell's Half Acre Lookout,Keeping Watch,2021-07-13,,Example child object. Video of Patrick McMarron recording fire conditions in July of 2021 on Hells Half Acre Fire Lookout,,Hell's Half Acre,45.64579,-114.62838,,,Image;MovingImage,video/mp4,eng,,,video,https://cdil.lib.uidaho.edu/keeping-watch/objects/videos/patrick_records_weather.MP4,,,man in fire lookout tower records conditions in notebook,"[Unknown speaker reports on slightly fuzzy radio while as Patrick McMarron writes notes]
|
||||||
|
|
||||||
|
Temperatures 85 to 90 in valleys, 70 to 75 ridges.
|
||||||
|
Minimum humidity 15 to 25 percent valleys and 22 to 32 percent ridges.
|
||||||
|
20 foot winds at lower elevations Northwest, 5 to 15 miles per hour.
|
||||||
|
Ridge top, Northwest, 5 to 15 miles per hour.
|
||||||
|
Hains index 4 low. LAL 4.
|
||||||
|
Chance of rain zero percent.
|
||||||
|
Break.
|
||||||
|
|
||||||
|
Tonight’s sky weather, mostly clear, smoke.
|
||||||
|
Minimum temperature 45 to 55 valleys...
|
||||||
|
|
||||||
|
[video ends abruptly]"
|
||||||
|
demo_011,demo_008,Outside shot of Hells Half Acre Lookout,Keeping Watch,2021-07-13,,Example child object. Outside shot of Hells Half Acre Lookout,,Hell's Half Acre,45.64579,-114.62838,,,Image;StillImage,image/jpeg,eng,,,image,https://cdil.lib.uidaho.edu/keeping-watch/objects/hell-s-half-acre/outside_shot_hells_half.JPG,https://cdil.lib.uidaho.edu/keeping-watch/objects/small/outside_shot_hells_half_sm.jpg,https://cdil.lib.uidaho.edu/keeping-watch/objects/thumbs/outside_shot_hells_half_th.jpg,fire lookout tower with a flag pole and American flag,
|
||||||
|
demo_012,demo_008,Patrick McMarron Discusses the Importance of Human Beings on the Lookout,Keeping Watch,2021-07-13,,Example child object. Video of Patrick McMarron discussing the importance of human beings staffing fire lookouts,Patrick McMarron; Hell's Half Acre,Hell's Half Acre,45.64579,-114.62838,,,Image;MovingImage,video/mp4,eng,,,video,https://cdil.lib.uidaho.edu/keeping-watch/objects/videos/patrick_the_human_being.mp4,,,Patrick McMarron Discusses the Importance of Human Beings on the Lookout,"/objects/demo_012.md"
|
||||||
|
demo_013,,Peeled Tree,,,,Example multiple. A cross section of a peeled tree from the Payette National Forest. The inner bark was utilized as a food resource by Indigenous Tribe.,Peeled Tree; Payette National Forest; Indigenous Tribe,,,,,,record,image/jpeg,eng,"Educational use includes non-commercial use of text and images in materials for teaching and research purposes. Digital reproduction permissions granted by University of Idaho Library Special Collections and Archives Department. For other uses beyond free use, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://rightsstatements.org/vocab/InC-EDU/1.0/,multiple,,https://objects.lib.uidaho.edu/collectionbuilder/demo/small/dsc_0136_sm.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/thumbs/dsc_0136_th.jpg,log cross section showing tree rings and one side of tree bark peeled,
|
||||||
|
demo_014,demo_013,Peeled Tree View 1,,,,,,,,,,,Image;StillImage,image/jpeg,,,,image,https://objects.lib.uidaho.edu/collectionbuilder/demo/dsc_0136.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/small/dsc_0136_sm.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/thumbs/dsc_0136_th.jpg,log cross section showing tree rings and one side of tree bark peeled,
|
||||||
|
demo_015,demo_013,Peeled Tree View 2,,,,,,,,,,,Image;StillImage,image/jpeg,,,,image,https://objects.lib.uidaho.edu/collectionbuilder/demo/dsc_0137.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/small/dsc_0137_sm.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/thumbs/dsc_0137_th.jpg,log cross section showing where tree bark was peeled,
|
||||||
|
demo_016,demo_013,Peeled Tree View 3,,,,,,,,,,,Image;StillImage,image/jpeg,,,,image,https://objects.lib.uidaho.edu/collectionbuilder/demo/dsc_0138.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/small/dsc_0138_sm.jpg,https://objects.lib.uidaho.edu/collectionbuilder/demo/thumbs/dsc_0138_th.jpg,log cross section showing where tree bark was peeled,
|
||||||
|
demo_017,,Hell's Half Acre Lookout 360 Image,Keeping Watch,2021-07-13,,Example panorama. 360 Image of the Interior of Hell's Half Acre Fire Tower,,Hell's Half Acre,45.64579,-114.62838,,,Image;StillImage,image/jpeg,eng,,,panorama,/objects/hells_half_theta.jpg,https://cdil.lib.uidaho.edu/keeping-watch/objects/small/hells_half_theta_sm.jpg,https://cdil.lib.uidaho.edu/keeping-watch/objects/thumbs/hells_half_theta_th.jpg,interior of a fire lookout tower with map in center and windows in all directions,
|
||||||
|
demo_018,,"Spokane's Great Restaurant, Washington","Mitchell, Edward H.",1909,,"Example postcard using display template 'multiple.' Postcard is of the Davenport Hotel's Restaurant in Spokane, Washington.",restaurants; automobiles; buildings; picture postcards; flagpoles; flags,"Spokane, WA",47.65710758,-117.4249084,"PG 9, Postcard Collection, University of Idaho Library Special Collections and Archives, http://www.lib.uidaho.edu/special-collections/",Postcard_038,record,multiple,eng,"Educational use includes non-commercial use of text and images in materials for teaching and research purposes. Digital reproduction rights granted by University of Idaho Library. For other uses beyond educational use, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,multiple,,/objects/small/210a_sm.jpg,/objects/thumbs/210a_th.jpg,historic colorized postcard depicting a fancy multi-story white building with several early cars parked in front,
|
||||||
|
demo_019,demo_018,postcard front,,,,,,,,,,210a,Image;StillImage,image/jpeg,,,,image,/objects/210a.jpg,/objects/small/210a_sm.jpg,/objects/thumbs/210a_th.jpg,historic colorized postcard depicting a fancy multi-story white building with several early cars parked in front,
|
||||||
|
demo_020,demo_018,postcard back,,,,,,,,,,210b,Image;StillImage,image/jpeg,,,,image,/objects/210b.jpg,/objects/small/210b_sm.jpg,/objects/thumbs/210b_th.jpg,"back of historic postcard dated Sept 5, 1909 with very difficult to read cursive writing in pencil",
|
||||||
|
demo_021,,"Jennie Eva Hughes, the First Black Graduate of the University of Idaho",,1899,yes,"Example compound object. Items from the Black History at University of Idaho that feature Jennie Eva Hughes, the first black graduate of the University of Idaho",Jennie Eva Hughes; Black History; University of Idaho,"Moscow, ID",46.725562,-117.009633,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,,record,compound_object,eng,,,compound_object,,https://www.lib.uidaho.edu/blackhistory/objects/small/ma2000_29_001_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/ma2000_29_001_th.jpg,"University of Idaho enrollment form filled in with handwritten cursive script saying ""Jennie Eva Hughes, Sept 23, 1898""",
|
||||||
|
demo_022,demo_021,Portrait of Jennie Eva Hughes [1],,1899,yes,Example child object. Black and white portrait of Jennie Eva Hughes.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,mg5758_001,Image;StillImage,image/jpeg,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,image,https://www.lib.uidaho.edu/blackhistory/objects/mg5758_001.jpg,https://www.lib.uidaho.edu/blackhistory/objects/small/mg5758_001_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/mg5758_001_th.jpg,black and white portrait of an African American woman in a dress,
|
||||||
|
demo_023,demo_021,Portrait of Jennie Eva Hughes [2],,1899,yes,Example child object. Black and white standing portrait of Jennie Eva Hughes dressed in white. Hughes holds a scroll in her left hand.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,mg5758_002,Image;StillImage,image/jpeg,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,image,https://www.lib.uidaho.edu/blackhistory/objects/mg5758_002.jpg,https://www.lib.uidaho.edu/blackhistory/objects/small/mg5758_002_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/mg5758_002_th.jpg,black and white full length portrait of an African American woman in a formal white dress with flowers and holding a scroll in her hand,
|
||||||
|
demo_024,demo_021,"""The Uncrowned King"" by Jennie Eva Hughes","Hughes, Jennie Eva",1898-04-15,,"Example child object. This speech won her the medal oration on April 15, 1898 at University of Idaho.",,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,mg5758_003,text,application/pdf,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,pdf,https://www.lib.uidaho.edu/blackhistory/objects/mg5758_003.pdf,https://www.lib.uidaho.edu/blackhistory/objects/small/mg5758_003_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/mg5758_003_th.jpg,"""The Uncrowned King"" by Jennie Eva Hughes",
|
||||||
|
demo_025,demo_021,Spokesman article about Jennie Eva Hughes' oration win,The Spokesman-Review,1898,yes,Example child object. Spokesman-Review article about the oratorical event event and Jennie Eva Hughes' win.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,mg5758_004,text,application/pdf,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,pdf,https://www.lib.uidaho.edu/blackhistory/objects/mg5758_004.pdf,https://www.lib.uidaho.edu/blackhistory/objects/small/mg5758_004_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/mg5758_004_th.jpg,aged newspaper clipping of a Spokesman article about Jennie Eva Hughes' oration win,
|
||||||
|
demo_026,demo_021,University of Idaho class of 1899,,1898,yes,"Example child object. Back row (left to right): Fred Merriam, Clara Playfair, Eva Nichols, Clem Herbert, Guy Wolfe, Ava Sweet, Fred Moore. Front row (left to right): Kate Hanley, Maude Mix, Charles Armstrong, Will Stillinger, Jennie Eva Hughes, Gilbert Hogue.",,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,pg2_110_1,Image;StillImage,image/jpeg,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,image,https://www.lib.uidaho.edu/blackhistory/objects/pg2_110_1.jpg,https://www.lib.uidaho.edu/blackhistory/objects/small/pg2_110_1_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/pg2_110_1_th.jpg,black and white group portrait of 6 women and 7 men in formal clothing with Jennie Eva Hughes seated in the front row,
|
||||||
|
demo_027,demo_021,Jennie Eva Hughes' 1898 registration card at University of Idaho,,1898-09-23,,Example child object. Jennie Eva Hughes' registration card for 1898 for the University of Idaho.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,ma2000_29_001,text,application/pdf,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,pdf,https://www.lib.uidaho.edu/blackhistory/objects/ma2000_29_001.pdf,https://www.lib.uidaho.edu/blackhistory/objects/small/ma2000_29_001_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/ma2000_29_001_th.jpg,"University of Idaho enrollment form filled in with handwritten cursive script saying ""Jennie Eva Hughes, Sept 23, 1898""",
|
||||||
|
demo_028,demo_021,Jennie Eva Hughes' 1899 registration card at University of Idaho,,1899-02-15,,Example child object. Jennie Eva Hughes' registration card for 1899 for the University of Idaho.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,ma2000_29_002,text,application/pdf,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,pdf,https://www.lib.uidaho.edu/blackhistory/objects/ma2000_29_002.pdf,https://www.lib.uidaho.edu/blackhistory/objects/small/ma2000_29_002_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/ma2000_29_002_th.jpg,"University of Idaho enrollment form filled in with handwritten cursive script saying ""Jennie Eva Hughes, Feb 15, 1899""",
|
||||||
|
demo_029,demo_021,Innovation of Class Day,,1899-06-01,,Example child object. Argonaut article about Class Day with mention of the oration given by Jennie Eva Hughes.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,arg-1899-06-01_p181-innovation,text,application/pdf,eng,"In Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,pdf,https://www.lib.uidaho.edu/blackhistory/objects/arg-1899-06-01_p181-innovation.pdf,https://www.lib.uidaho.edu/blackhistory/objects/small/arg-1899-06-01_p181-innovation_sm.jpg,https://www.lib.uidaho.edu/blackhistory/objects/thumbs/arg-1899-06-01_p181-innovation_th.jpg,Innovation of Class Day,
|
||||||
|
demo_030,demo_021,The First Black Graduate - Jennie Eva Hughes,"Shannon, Michelle",2022,,Example child object. Article summarizing the history of Jennie Eva Hughes at the Univeritiy of Idaho.,,,,,<a href='https://www.lib.uidaho.edu/blackhistory/'>Black History at the University of Idaho Digital Collection</a>,https://www.lib.uidaho.edu/blackhistory/features/hughes.html,text,text/html,eng,"In Copyright - Educational Use Permitted. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,record,https://www.lib.uidaho.edu/blackhistory/features/hughes.html,/objects/small/hughes_article_sm.jpg,/objects/thumbs/hughes_article_th.jpg,"screenshot showing web essay titled ""The First Black Graduate - Jennie Eva Hughes""",
|
||||||
|
demo_031,,Mounted forest patrol looks across Middle Fork of Salmon River,"Benedict, M.S.",1937,,"Mounted forest patrol looks across Middle Fork of Salmon River in the Salmon-Challis National Forest.",national forests; horses; rivers; riders; rangers; patrol; campsite; camp fire,"Salmon-Challis National Forest, Idaho",45.239376,-114.497639,"Archival Idaho Digital Collection, https://www.lib.uidaho.edu/digital/archivalidaho/items/archivalidaho1161.html",IntermtnPics97,Image;StillImage,image/jpeg,eng,"In Copyright - Educational Use Permitted. Please note these materials are not held by University of Idaho Library Special Collections and Archives. For more information, please contact the institution listed in the Source.",http://rightsstatements.org/vocab/InC-EDU/1.0/,image,https://objects.lib.uidaho.edu/archivalidaho/archivalidaho1161.jpg,https://objects.lib.uidaho.edu/archivalidaho/small/archivalidaho1161_sm.jpg,https://objects.lib.uidaho.edu/archivalidaho/thumbs/archivalidaho1161_th.jpg,"black and white photograph depicts uniformed person on a white horse looking up a valley forested by ponderosa pines",
|
||||||
|
demo_032,,"Combined harvester, Moscow, Idaho","Inland Printing Co.",1920,,"Postcard of a combine harvesting grain in fields near Moscow, Idaho.",combines; fields (land); Equus caballus (species); men; picture postcards,"Moscow, Idaho",46.714253,-116.983777,"PG 9, Postcard Collection, University of Idaho Library Special Collections and Archives, https://www.lib.uidaho.edu/digital/postcards/items/nwpostcards1547.html",pg_9_16_01a,Image;StillImage,image/jpeg,eng,"Material determined to be in Public Domain based on date of publication. Material made available by the University of Idaho Library. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",https://creativecommons.org/publicdomain/mark/1.0/,multiple,,https://objects.lib.uidaho.edu/postcards/small/pg_9_16_01a_sm.jpg,https://objects.lib.uidaho.edu/postcards/thumbs/pg_9_16_01a_th.jpg,"Colored post card depicts golden rows of wheat on rolling hills with harvest machine being pushed by large horses",
|
||||||
|
demo_033,demo_032,,,,,,,,,,,pg_9_16_01a,,image/jpeg,,,,image,https://objects.lib.uidaho.edu/postcards/pg_9_16_01a.jpg,https://objects.lib.uidaho.edu/postcards/small/pg_9_16_01a_sm.jpg,https://objects.lib.uidaho.edu/postcards/thumbs/pg_9_16_01a_th.jpg,"Colored post card depicts golden rows of wheat on rolling hills with harvest machine being pushed by large horses",
|
||||||
|
demo_034,demo_032,,,,,,,,,,,pg_9_16_01a_b,,image/jpeg,,,,image,https://objects.lib.uidaho.edu/postcards/pg_9_16_01a_b.jpg,https://objects.lib.uidaho.edu/postcards/small/pg_9_16_01a_b_sm.jpg,https://objects.lib.uidaho.edu/postcards/thumbs/pg_9_16_01a_b_th.jpg,"Back side of postcard provides for message and address. Message says published in Spokane Washington",
|
||||||
|
15
_data/demo-metadata.csv
Normal file
15
_data/demo-metadata.csv
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
objectid,title,creator,date,description,subject,location,latitude,longitude,source,identifier,type,format,language,rights,rightsstatement,display_template,object_location,image_small,image_thumb,image_alt_text,object_transcript
|
||||||
|
demo_001,"Administration Building, University of Idaho, No. 30",Pacific Photo Co.,1910,"Example locally hosted image item. Photographic postcard of the University of Idaho administration building in Moscow, Idaho.",universities; buildings; campuses; picture postcards,"Moscow, Idaho",46.725562,-117.009633,"PG 9, Postcard Collection, Special Collections and Archives, University of Idaho Library",pg_9_12_01bl,Image;StillImage,image/jpeg,eng,,http://rightsstatements.org/vocab/NoC-US/1.0/,image,/objects/demo_001.jpg,/objects/small/demo_001_sm.jpg,/objects/thumbs/demo_001_th.jpg,historic sepia photograph depicting a formal brick and stone building in the College Gothic style,
|
||||||
|
demo_002,"Spokane County Court House, Spokane, Washington",Spokane Post Card Co.,1912-09-08,"Example locally hosted PDF item. Postcard is of the Spokane County Courthouse in Spokane, Washington. Postmark 9/8/1912, Spokane, WA. Destination San Francisco, CA.",public buildings; county courthouses; trees; picture postcards,"Spokane, Washington",47.66432,-117.428031,"PG 107, Knowles Postcard Collection, Special Collections and Archives, University of Idaho Library",Postcard_032,Image;StillImage,application/pdf,eng,,http://rightsstatements.org/vocab/NoC-US/1.0/,pdf,/objects/demo_002.pdf,/objects/small/demo_002_sm.jpg,/objects/thumbs/demo_002_th.jpg,historic colorized postcard depicting a formal building with a large central tower in the French Renaissance revival style,
|
||||||
|
demo_003,Good News – Power (radio episode),Frank B. Robinson,1947,Example locally hosted audio item. Psychiana radio program episode begins with assurance that there is a Power that can get people what they desire. Robinson then discusses his early life failures and childhood seeking of some force that could turn his failures into success. He asserts the God-Power can turn our failures into success and bring us material and spiritual abundance.,Frank B. Robinson; Failure; Success; Material Abundance,"Moscow, Idaho",46.733001,-116.991779,"Psychiana Digital Collection, Digital Initiatives, University of Idaho Library, https://www.lib.uidaho.edu/digital/psychiana/",Good_News_08,Audio,audio/mpeg,eng,,http://rightsstatements.org/vocab/InC-EDU/1.0/,audio,/objects/demo_003.mp3,/objects/small/demo_003_sm.jpg,/objects/thumbs/demo_003_th.jpg,"portrait of a thoughtful man in a suit, with the text 'the amazing story of Psychiana' in green letters below","[slightly scratchy recording of a radio broadcast. A organ plays dramatic intro music, then continues quietly behind speaker voice]
|
||||||
|
|
||||||
|
[Dramatic male speaking voice]:
|
||||||
|
|
||||||
|
As an army terrible with batters sweeping before it the black shades of night, routing despair, comes the flaming truth of the God law.
|
||||||
|
|
||||||
|
Why do you suffer the indignities of life, when you can control life? Your fate is in your hands now, for at last, the way is open, if you will but take it.
|
||||||
|
When Dr. Frank B Robinson first realized the dynamic implications of Psychiana, he was in debt, a humble drug clerk with no future, no hope. Now he possesses all that he wants of wealth, his mind is at peace, and he is accorded praise and renown as an outstanding and famous psychologist. The same forces that raised him out of the depths, to stand on a high plane among men, can be put to work for you."
|
||||||
|
demo_004,"University of Idaho vs. University of Southern California (Football), 10/30/1925",Vandal Athletics,1925-10-30,"Example YouTube video item. Idaho Football vs. University of Southern California 10/30/1925 at Neale Stadium in Moscow, ID. Score: 7 - 51 (L).",American Football,"Moscow, Idaho",46.726113,-117.015671,"Vandal Video Collection, Digital Initiatives, University of Idaho Library, https://www.lib.uidaho.edu/digital/vandalvideo/","MG 23, Item 29",Image;MovingImage,video/mp4,eng,"In Copyright - Educational Use Permitted. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,video,https://youtu.be/CVXQ3X6Q8oU,https://img.youtube.com/vi/CVXQ3X6Q8oU/hqdefault.jpg,https://img.youtube.com/vi/CVXQ3X6Q8oU/mqdefault.jpg,grainy image from historic film depicting fans heading to football game,
|
||||||
|
demo_005,Interview with K. Silem Mohammad,Devin Becker,2014-06-16,Example Vimeo video item. Oral history interview with poet K. Silem Mohammad discussing recent changes in writing practices that occurred due to the advent of the computer and the arrival of the digital age.,Poetry,"Ashland, OR",42.1916714,-122.728533,"CTRL+Shift, Center for Digital Inquiry and Learning, University of Idaho Library, https://ctrl-shift.org/",,Image;MovingImage,video/mp4,eng,"In Copyright - Educational Use Permitted. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/InC-EDU/1.0/,video,https://vimeo.com/464555587,,,,/objects/demo_005.txt
|
||||||
|
demo_006,Ford pumper used for slash burning control,"Thompson, J. B.",1932-09-01,Example image item externally hosted. Ford pumper used for slash burning control. September 1932. From the photo series depicting the broadcast burn at the mouth of Benton Creek.,forestry,Bonner County;Priest River Experimental Forest;Benton Creek,48.34472222,-116.8483333,"Experimental Forest and Savenac Nursery Archive, Digital Initiatives, University of Idaho Library, https://www.lib.uidaho.edu/digital/expforest/",FirePump1,Image;StillImage,image/jpeg,eng,"Material produced by the United States Forest Service and is in Public Domain. For more information, please contact University of Idaho Library Special Collections and Archives Department at libspec@uidaho.edu.",http://rightsstatements.org/vocab/NoC-US/1.0/,image,https://www.lib.uidaho.edu/collectionbuilder/demo-objects/demo_006.jpg,https://www.lib.uidaho.edu/collectionbuilder/demo-objects/small/demo_006_sm.jpg,https://www.lib.uidaho.edu/collectionbuilder/demo-objects/thumbs/demo_006_th.jpg,man standing with pump machinery next to a river with trees and mountains in the distance,
|
||||||
|
demo_007,Influence of Fishway Placement on Fallback of Adult Salmon at the Bonneville Dam on the Columbia River,"Reischel, T.S.; Bjornn, T.C.",2003,Example metadata-only record with link to external source. Journal article.,fisheries management,Bonneville Dam,45.6442837,-121.9428256,"North American Journal of Fisheries Management, vol. 23, issue 4, p. 1215-1224. DOI: 10.1577/M02-113",DOI:10.1577/M02-113,Text,application/pdf,eng,"metadata-only record, please check publication for rights",,record,https://www.doi.org/10.1577/M02-113,,,,
|
||||||
|
130
_data/theme.yml
Normal file
130
_data/theme.yml
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
##########
|
||||||
|
# CollectionBuilder Theme Customization
|
||||||
|
# values set here help configure details of individual pages in the website
|
||||||
|
##########
|
||||||
|
|
||||||
|
##########
|
||||||
|
# HOME PAGE
|
||||||
|
#
|
||||||
|
# featured image is used in home page banner and in meta markup to represent the collection
|
||||||
|
# use either an objectid (from an item in this collect), a relative location of an image in this repo, or a full url to an image elsewhere
|
||||||
|
featured-image: demo_033
|
||||||
|
featured-image-alt-text: # add alt text if using url for featured-image (objectid will be automatic from metadata)
|
||||||
|
# optional: add extra padding around collection title for a larger image feature.
|
||||||
|
home-title-y-padding: 10em # the margin from the top your title portion will appear.
|
||||||
|
# optional: change position of background image, center, top, bottom
|
||||||
|
home-banner-image-position: center # Default is top
|
||||||
|
|
||||||
|
|
||||||
|
##########
|
||||||
|
# Browse PAGE
|
||||||
|
#
|
||||||
|
# see _data/browse-config.csv to define the metadata fields that will display.
|
||||||
|
advanced-search: true # true / false, adds advanced search options to search, which are generated by clicking the advanced search button above the search box (this opens a modal in which the search can be constructed)
|
||||||
|
faceted-search: true # true / false, adds a field option to the left of the search results that allows users to filter results by metadata field
|
||||||
|
default-sort-field: # if a value is entered here, it must match one of the field values (first column) in the browse-config.csv file. If left blank or the value doesn't match a value in config-browse.csv's first column, the default sort will be a random sort
|
||||||
|
|
||||||
|
|
||||||
|
##########
|
||||||
|
# ITEM PAGE
|
||||||
|
#
|
||||||
|
# see _data/metadata-config.csv to define the metadata fields that will display.
|
||||||
|
browse-buttons: true # true / false, adds previous/next arrows to items, but increases build time
|
||||||
|
|
||||||
|
##########
|
||||||
|
# SUBJECTS PAGE
|
||||||
|
#
|
||||||
|
subjects-fields: subject;creator # set of fields separated by ; to be featured in the cloud (leave blank or comment out to not generate)
|
||||||
|
subjects-min: 1 # min size for subject cloud, too many terms = slow load time!
|
||||||
|
subjects-stopwords: # set of subjects separated by ; that will be removed from display, e.g. boxers;boxing
|
||||||
|
|
||||||
|
##########
|
||||||
|
# LOCATIONS PAGE
|
||||||
|
#
|
||||||
|
locations-fields: location # set of fields separated by ; to be featured in the cloud (leave blank or comment out to not generate)
|
||||||
|
locations-min: 1 # min size for subject cloud, too many terms = slow load time!
|
||||||
|
locations-stopwords: # set of subjects separated by ; that will be removed from display, e.g. boxers;boxing
|
||||||
|
|
||||||
|
##########
|
||||||
|
# MAP PAGE
|
||||||
|
#
|
||||||
|
# see _data/map-config.csv for field display options
|
||||||
|
auto-center-map: true # have the map auto fit all features into its view
|
||||||
|
latitude: 46.727485 # to manually center map if not using auto-center-map option
|
||||||
|
longitude: -117.014185 # to manually center map if not using auto-center-map option
|
||||||
|
zoom-level: 5 # zoom level for map if not using auto-center-map option
|
||||||
|
map-base: Esri_WorldStreetMap # set default base map, choose from: Esri_WorldStreetMap, Esri_NatGeoWorldMap, Esri_WorldImagery, OpenStreetMap_Mapnik
|
||||||
|
map-search: true # not suggested with large collections
|
||||||
|
map-search-fuzziness: 0.35 # fuzzy search range from 1 = anything to 0 = exact match only
|
||||||
|
map-cluster: true # suggested for large collection or with many items in same location
|
||||||
|
map-cluster-radius: 25 # size of clusters, from ~ 10 to 80
|
||||||
|
|
||||||
|
##########
|
||||||
|
# TIMELINE PAGE
|
||||||
|
#
|
||||||
|
# set either year-navigation or year-nav-increment to generate a year nav dropdown
|
||||||
|
year-navigation: #"1900;1905;1910;1915;1920" # manually set years to appear in dropdown nav
|
||||||
|
year-nav-increment: 5 # set increments to auto gen nav years
|
||||||
|
|
||||||
|
##########
|
||||||
|
# DATA
|
||||||
|
#
|
||||||
|
# add metadata fields for export in data downloads (tip: paste in first row of csv)
|
||||||
|
# comma delimited list, reference url is automatic
|
||||||
|
metadata-export-fields: "title,creator,date,description,subject,location,latitude,longitude,source,identifier,type,format,language,rights,rightsstatement"
|
||||||
|
# generate a facets list for given fields, comma delimited
|
||||||
|
metadata-facets-fields: "subject,creator,format"
|
||||||
|
|
||||||
|
##########
|
||||||
|
# Compound Objects
|
||||||
|
#
|
||||||
|
# Ignore this section if you are not including any compound objects
|
||||||
|
# Note, like other items, child objects will only appear in visualizations if they have the correct metadata (lat long for map; date for timeline)
|
||||||
|
# select true below if you'd like your compound object's child objects to appear in any of the pages or features listed
|
||||||
|
map-child-objects: true # true / false - if true, and if child item has latitude and longitude, child objects will be displayed on map
|
||||||
|
timeline-child-objects: true # true / false - if true, and if child object has date, child objects will appear as thumbnails on timeline page
|
||||||
|
data-child-objects: false # true / false - if true, child objects will appear linked in table on data page
|
||||||
|
browse-child-objects: false # true / false - if true, child objects will appear on browse page and child objects' metadata will populate cloud pages like Subjects page and Locations page, as well as featured terms boxes on the home page
|
||||||
|
search-child-objects: true # true / false - if true, child objects will appear on on search page along with parent objects
|
||||||
|
|
||||||
|
|
||||||
|
##########
|
||||||
|
# ADVANCED OPTIONS
|
||||||
|
#
|
||||||
|
|
||||||
|
# NAVBAR COLORS [optional!]
|
||||||
|
# navbar text color
|
||||||
|
# Choose from "navbar-light" for use with light background colors, or "navbar-dark" for dark background colors
|
||||||
|
navbar-color: navbar-dark
|
||||||
|
# navbar background color
|
||||||
|
# Choose from bg-primary, bg-secondary, bg-success, bg-danger, bg-warning, bg-info, bg-light, bg-dark, bg-white
|
||||||
|
navbar-background: bg-dark
|
||||||
|
|
||||||
|
# BOOTSWATCH THEMES [optional!]
|
||||||
|
# You can replace the standard Bootstrap theme with a Bootswatch (https://github.com/thomaspark/bootswatch) option
|
||||||
|
# Choose from: cerulean; cosmo; cyborg; darkly; flatly; journal; litera; lumen; lux; materia; minty; pulse; sandstone; simplex; sketchy; slate; solar; spacelab; superhero; united; yeti
|
||||||
|
bootswatch: # leave blank or comment out for plain bootstrap
|
||||||
|
|
||||||
|
# THEME FONTS [optional!]
|
||||||
|
base-font-size: 1.2em
|
||||||
|
text-color: "#191919"
|
||||||
|
link-color: "#0d6efd"
|
||||||
|
base-font-family: # comment out for bootstrap defaults. e.g. Roboto
|
||||||
|
font-cdn: # add font stylesheet, e.g. <link href="https://fonts.googleapis.com/css?family=Roboto&display=swap" rel="stylesheet">
|
||||||
|
|
||||||
|
# THEME ICONS [optional!]
|
||||||
|
# default icons can be overridden or new icons can be added using "icons" object
|
||||||
|
# the template uses Bootstrap Icons, https://icons.getbootstrap.com/
|
||||||
|
# find the names on the BI icons page, e.g. file-image
|
||||||
|
#
|
||||||
|
# icons:
|
||||||
|
# icon-image: image
|
||||||
|
# icon-audio: soundwave
|
||||||
|
# icon-video: film
|
||||||
|
# icon-pdf: file-pdf
|
||||||
|
# icon-record: file-text
|
||||||
|
# icon-panorama: image-alt
|
||||||
|
# icon-compound-object: collection
|
||||||
|
# icon-multiple: postcard
|
||||||
|
# icon-default: file-earmark # fall back icon
|
||||||
|
# icon-back-to-top: arrow-up-square
|
||||||
70
_includes/advanced-search-modal.html
Normal file
70
_includes/advanced-search-modal.html
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<button type="button" class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#advancedSearchModal">
|
||||||
|
Advanced<span class="d-none d-md-inline"> Search</span>
|
||||||
|
</button>
|
||||||
|
<div class="modal fade" id="advancedSearchModal" tabindex="-1">
|
||||||
|
<div class="modal-dialog modal-lg">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h1 class="modal-title h4" id="advancedSearchModalLabel">Advanced Search</h1>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<form id="advancedSearchForm">
|
||||||
|
<div id="searchRows">
|
||||||
|
<!-- Initial search rows will be inserted here -->
|
||||||
|
</div>
|
||||||
|
<div class="mt-3">
|
||||||
|
<button type="button" class="btn btn-outline-secondary btn-sm" onclick="addSearchRow()">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plus-circle" viewBox="0 0 16 16">
|
||||||
|
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16"/>
|
||||||
|
<path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4"/>
|
||||||
|
</svg>
|
||||||
|
Add Another Field
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
||||||
|
<button type="button" class="btn btn-primary" onclick="submitAdvancedSearch()">Search</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Template for search row -->
|
||||||
|
<template id="searchRowTemplate">
|
||||||
|
<div class="search-row mb-4">
|
||||||
|
<div class="row align-items-center">
|
||||||
|
<div class="col-4 col-md-2">
|
||||||
|
<select class="form-select form-select-sm boolean-operator">
|
||||||
|
<option value="AND">AND</option>
|
||||||
|
<option value="OR">OR</option>
|
||||||
|
<option value="NOT">NOT</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-5 col-md-3">
|
||||||
|
<select class="form-select form-select-sm field-select">
|
||||||
|
<option value="all">All Fields</option>
|
||||||
|
<option value="title">Title</option>
|
||||||
|
{% for f in site.data.config-browse %}{% assign cap-field = f.field | capitalize %}
|
||||||
|
<option value="{{ f.field }}">{{ f.facet_name | default: f.display_name | default: cap-field }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-10 col-md-6">
|
||||||
|
<input type="text" class="form-control form-control-sm search-input" placeholder="Enter search term">
|
||||||
|
<div class="date-range-inputs">
|
||||||
|
<div class="date-input-group">
|
||||||
|
<input type="text" class="form-control form-control-sm start-date" placeholder="Start Date">
|
||||||
|
<span class="date-separator">to</span>
|
||||||
|
<input type="text" class="form-control form-control-sm end-date" placeholder="End Date">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-2 col-md-1">
|
||||||
|
<button type="button" class="btn btn-outline-danger btn-sm remove-row" aria-label="Remove condition">×</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
83
_includes/cb/about_the_about.md
Normal file
83
_includes/cb/about_the_about.md
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
{% comment %}
|
||||||
|
Find some sample images or use defaults for About demos
|
||||||
|
{% endcomment %}
|
||||||
|
{% assign imagesample = site.data[site.metadata] | where_exp: 'item','item.format contains "image"' | first %}
|
||||||
|
{% capture imagesampleid %}{{ imagesample.objectid | default: "https://www.lib.uidaho.edu/collectionbuilder/demo-objects/mg101_b6_photographs_01.jpg" }}{% endcapture %}
|
||||||
|
{% assign pdfsample = site.data[site.metadata] | where_exp: 'item','item.format contains "pdf"' | first %}
|
||||||
|
{% capture pdfsampleid %}{{ pdfsample.objectid | default: "https://www.lib.uidaho.edu/collectionbuilder/demo-objects/uiext21768.pdf" }}{% endcapture %}
|
||||||
|
{% assign videosample = site.data[site.metadata] | where_exp: 'item','item.format contains "video"' | first %}
|
||||||
|
{% capture videosampleid %}{{ videosample.objectid | default: "https://cdil.lib.uidaho.edu/storying-extinction/objects/trailcams/videos/ballcreek-cedarrub-birdonpath.mp4" }}{% endcapture %}
|
||||||
|
{% assign audiosample = site.data[site.metadata] | where_exp: 'item','item.format contains "audio"' | first %}
|
||||||
|
{% capture audiosampleid %}{{ audiosample.objectid | default: "https://www.lib.uidaho.edu/digital/mp3s/Clouds.mp3" }}{% endcapture %}
|
||||||
|
|
||||||
|
## About the About Page
|
||||||
|
|
||||||
|
We want to make engaging interpretive pages easier to create, so CollectionBuilder gives you tools to write *with* your collection content!
|
||||||
|
|
||||||
|
The template comes with a customizable "About" page layout designed for long form content with rich media embeds.
|
||||||
|
Content is written in [Markdown](https://guides.github.com/features/mastering-markdown/) and enhanced using "includes" that pull in collection content, external media, and [Bootstrap](https://getbootstrap.com/) features like cards and modals.
|
||||||
|
We hope this makes it easier for site builders to develop the collection AND add interesting and engaging contextual information.
|
||||||
|
|
||||||
|
Each "include" file has several options, which are documented in the files themselves--copy the examples to see how it works with your content!
|
||||||
|
In the demo below, we've given display widths of 25% and 50% to save space, but you can feature the entire image or document.
|
||||||
|
|
||||||
|
You can also see a page featuring [a bonanza of feature includes options](https://collectionbuilder.github.io/collectionbuilder-gh/feature_options.html) on our CollectionBuilder-GH demo site.
|
||||||
|
|
||||||
|
{% include feature/button.html text="Feature *Includes* Bonanza page" link="https://collectionbuilder.github.io/collectionbuilder-gh/feature_options.html" color="primary" size="lg" centered=true %}
|
||||||
|
|
||||||
|
### Include Collection Items
|
||||||
|
|
||||||
|
The template provides includes to pull your collection objects and metadata into your interpretive page, allowing you to write with your materials directly embedded in the content.
|
||||||
|
|
||||||
|
#### Include an Image
|
||||||
|
|
||||||
|
- Image --> `{% raw %}{% include feature/image.html objectid="demo_001" width="75" %}{% endraw %}`
|
||||||
|
|
||||||
|
{% include feature/image.html objectid=imagesampleid width="75" %}
|
||||||
|
|
||||||
|
#### Include a PDF
|
||||||
|
|
||||||
|
- PDF -- > `{% raw %}{% include feature/pdf.html objectid="demo_002" width="50" %}{% endraw %}`
|
||||||
|
|
||||||
|
{% include feature/pdf.html objectid=pdfsampleid width="50" %}
|
||||||
|
|
||||||
|
#### Include a Video
|
||||||
|
|
||||||
|
- Video: `{% raw %}{% include feature/video.html objectid="demo_004" %}{% endraw %}`
|
||||||
|
|
||||||
|
{% include feature/video.html objectid=videosampleid width="75" %}
|
||||||
|
|
||||||
|
#### Include an Audio File
|
||||||
|
|
||||||
|
- Audio: `{% raw %}{% include feature/audio.html objectid="demo_003" %}{% endraw %}`
|
||||||
|
|
||||||
|
{% include feature/audio.html objectid=audiosampleid %}
|
||||||
|
|
||||||
|
### Include Bootstrap Features
|
||||||
|
|
||||||
|
The template also provides includes to make it easier to add [Bootstrap](https://getbootstrap.com/) components to your Markdown writing.
|
||||||
|
These features allow you to better organize and highlight your content.
|
||||||
|
|
||||||
|
#### Include a Card
|
||||||
|
|
||||||
|
- Card -- > `{% raw %}{% include feature/card.html header="This is a Card" text="The card features an image from the collection as a cap" objectid="demo004" width="25" centered=true %}{% endraw %}`
|
||||||
|
|
||||||
|
{% include feature/card.html header="This is a Card" text="The card features an image from the collection as a cap" objectid=imagesampleid width="50" centered=true %}
|
||||||
|
|
||||||
|
#### Include a Button
|
||||||
|
|
||||||
|
- Buttons -- > `{% raw %}{% include feature/button.html text="Button Link to Somewhere" link="https://collectionbuilder.github.io/" color="success" %}{% endraw %}`
|
||||||
|
|
||||||
|
{% include feature/button.html text="Button Link to Somewhere" link="https://collectionbuilder.github.io/" color="success" centered=true %}
|
||||||
|
|
||||||
|
#### Include an Alert
|
||||||
|
|
||||||
|
- Alerts -- > `{% raw %}{% include feature/alert.html text="this is an *alert* that 'warns' a user" color="warning" align="center" %}{% endraw %}`
|
||||||
|
|
||||||
|
{% include feature/alert.html text="This is an *alert* that 'warns' a user with centrally aligned text." color="warning" align="center" %}
|
||||||
|
|
||||||
|
#### Include a Modal
|
||||||
|
|
||||||
|
- Modals -- > `{% raw %}{% include feature/modal.html button="This is a modal using a 'primary' colored button to invite clicking" title="when clicked:" text="A Modal will pop out a box with some more information" color="primary" %}{% endraw %}`
|
||||||
|
|
||||||
|
{% include feature/modal.html button="This is a modal using a 'primary' colored button to invite clicking" title="When clicked:" text="A Modal will pop out a box with some more information" color="primary" %}
|
||||||
17
_includes/cb/credits.html
Normal file
17
_includes/cb/credits.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<div class="container-fluid mt-4 mb-n3 bg-light p-4 " id="technical">
|
||||||
|
<div class="container mt-4 border rounded p-4 bg-white">
|
||||||
|
<h3>Technical Credits - CollectionBuilder</h3>
|
||||||
|
<div class="row my-2 justify-content-center">
|
||||||
|
<div class="col-md-8 p-4">
|
||||||
|
<p>This digital collection is built with <a href="https://collectionbuilder.github.io/">CollectionBuilder</a>, an open source framework for creating digital collection and exhibit websites that is developed by faculty librarians at the University of Idaho Library following the <a href="https://lib-static.github.io">Lib-Static</a> methodology.</p>
|
||||||
|
|
||||||
|
<p>Using the <a href="https://github.com/CollectionBuilder/collectionbuilder-csv">CollectionBuilder-CSV</a> template and the static website generator <a href="https://jekyllrb.com/">Jekyll</a>, this project creates an engaging interface to explore driven by metadata.</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4 text-center">
|
||||||
|
<a href="https://collectionbuilder.github.io/" title="CollectionBuilder">
|
||||||
|
<img src="{{ '/assets/img/collectionbuilder-logo.png' | relative_url }}" class="img-fluid" alt="CollectionBuilder" >
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
230
_includes/cb/feature_options.md
Normal file
230
_includes/cb/feature_options.md
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
## Feature *Includes* Bonanza page
|
||||||
|
|
||||||
|
Check all the includes. Steal Code!
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
### Image Options
|
||||||
|
|
||||||
|
#### Image from Collection (auto caption)
|
||||||
|
|
||||||
|
{% include feature/image.html objectid="demo_001" width="75" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/image.html objectid="demo_001" width="75" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### Image from Collection (with a caption)
|
||||||
|
|
||||||
|
{% include feature/image.html objectid="demo_001" width="75" caption="an image" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/image.html objectid="demo_001" width="75" caption="an image" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### Multiple Images from the Collection (auto caption)
|
||||||
|
|
||||||
|
{% include feature/image.html objectid="demo_001;demo_004;demo_002" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/image.html objectid="demo_001;demo_004;demo_002" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### Multiple Images from the Collection (with captions)
|
||||||
|
|
||||||
|
{% include feature/image.html objectid="demo_001;demo_004;demo_002" width="75" caption="demo1;nother" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/image.html objectid="demo_001;demo_004;demo_002" width="75" caption="demo1;nother" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### External Image (without a caption)
|
||||||
|
|
||||||
|
{% include feature/image.html objectid="https://www.lib.uidaho.edu/collectionbuilder/demo-objects/mg101_b6_photographs_01.jpg" width="75" alt="Frank B. Robinson at the Organ" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/image.html objectid="https://www.lib.uidaho.edu/collectionbuilder/demo-objects/mg101_b6_photographs_01.jpg" width="75" alt="Frank B. Robinson at the Organ" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### External Image (with a caption)
|
||||||
|
|
||||||
|
{% include feature/image.html objectid="https://www.lib.uidaho.edu/collectionbuilder/demo-objects/mg101_b6_photographs_01.jpg" width="75" alt="Frank B. Robinson at the Organ" caption="This guy is good!"%}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/image.html objectid="https://www.lib.uidaho.edu/collectionbuilder/demo-objects/mg101_b6_photographs_01.jpg" width="75" alt="Frank B. Robinson at the Organ" caption="This guy is good!"%}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### Multiple External Images (with captions and a link)
|
||||||
|
|
||||||
|
{% include feature/image.html objectid="https://www.lib.uidaho.edu/collectionbuilder/demo-objects/mg101_b6_photographs_01.jpg;https://www.lib.uidaho.edu/collectionbuilder/demo-objects/mg101_b6_psychiana_photographs_010.jpg" caption="this guy!;(was nothing without these women!)" link="https://www.lib.uidaho.edu/digital/psychiana/items/psychiana519.html;https://www.lib.uidaho.edu/digital/psychiana/items/psychiana547.html" alt="Frank B. Robinson at the Organ;Women staff members of Psychiana lined up outside the Psychiana headquarters" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/image.html objectid="https://www.lib.uidaho.edu/collectionbuilder/demo-objects/mg101_b6_photographs_01.jpg;https://www.lib.uidaho.edu/collectionbuilder/demo-objects/mg101_b6_psychiana_photographs_010.jpg" caption="this guy!;(was nothing without these women!)" link="https://www.lib.uidaho.edu/digital/psychiana/items/psychiana519.html;https://www.lib.uidaho.edu/digital/psychiana/items/psychiana547.html" alt="Frank B. Robinson at the Organ;Women staff members of Psychiana lined up outside the Psychiana headquarters" %}{% endraw %}`
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
### PDF Options
|
||||||
|
|
||||||
|
#### PDF from Collection (auto caption)
|
||||||
|
|
||||||
|
{% include feature/pdf.html objectid="demo_002" width="50" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/pdf.html objectid="demo_002" width="50" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### PDF from the Collection (with a caption)
|
||||||
|
|
||||||
|
{% include feature/pdf.html objectid="demo_002" width="50" caption="a pdf from the collection" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/pdf.html objectid="demo_002" width="50" caption="a pdf from the collection" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### External PDF (without a caption)
|
||||||
|
|
||||||
|
{% include feature/pdf.html objectid="https://www.lib.uidaho.edu/collectionbuilder/demo-objects/uiext21768.pdf" width="50" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/pdf.html objectid="https://www.lib.uidaho.edu/collectionbuilder/demo-objects/uiext21768.pdf" width="50" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### External PDF (with a caption)
|
||||||
|
|
||||||
|
{% include feature/pdf.html objectid="https://www.lib.uidaho.edu/collectionbuilder/demo-objects/uiext21768.pdf" width="50" caption="Safe Chainsawing is Important!" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/pdf.html objectid="https://www.lib.uidaho.edu/collectionbuilder/demo-objects/uiext21768.pdf" width="50" caption="Safe Chainsawing is Important!" %}{% endraw %}`
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
### Video Options
|
||||||
|
|
||||||
|
#### Video from Collection (auto caption)
|
||||||
|
|
||||||
|
{% include feature/video.html objectid="demo_004" width="75" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/video.html objectid="demo_004" width="75" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### Video from the Collection (with a caption)
|
||||||
|
|
||||||
|
{% include feature/video.html objectid="demo_005" width="50" caption="a video from the collection" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/video.html objectid="demo_004" width="50" caption="a video from the collection" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### External Video File (without a caption)
|
||||||
|
|
||||||
|
{% include feature/video.html objectid="https://cdil.lib.uidaho.edu/storying-extinction/objects/trailcams/videos/ballcreek-cedarrub-birdonpath.mp4" width="50"%}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/video.html objectid="https://cdil.lib.uidaho.edu/storying-extinction/objects/trailcams/videos/ballcreek-cedarrub-birdonpath.mp4" width="50"%}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### External Video File (with a caption)
|
||||||
|
|
||||||
|
{% include feature/video.html objectid="https://cdil.lib.uidaho.edu/storying-extinction/objects/trailcams/videos/ballcreek-cedarrub-birdonpath.mp4" caption="Bears are Important!" width="50" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/video.html objectid="https://cdil.lib.uidaho.edu/storying-extinction/objects/trailcams/videos/ballcreek-cedarrub-birdonpath.mp4" caption="Bears are Important!" width="50" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### External Vimeo Video
|
||||||
|
|
||||||
|
{% include feature/video.html objectid="https://vimeo.com/464555587" width="50" caption="vimeo caption" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/video.html objectid="https://vimeo.com/464555587" width="50" caption="vimeo caption" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### External Youtube Video
|
||||||
|
|
||||||
|
{% include feature/video.html objectid="https://www.youtube.com/watch?v=dbKNr3wuiuQ" width="50" caption="youtube caption" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/video.html objectid="https://www.youtube.com/watch?v=dbKNr3wuiuQ" width="50" caption="youtube caption" %}{% endraw %}`
|
||||||
|
|
||||||
|
#### Video Modal from Collection
|
||||||
|
|
||||||
|
{% include feature/video-modal.html objectid="demo_004" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/video-modal.html objectid="demo_004" %}{% endraw %}`
|
||||||
|
|
||||||
|
#### Video Modal External Item
|
||||||
|
|
||||||
|
{% include feature/video-modal.html objectid="https://cdil.lib.uidaho.edu/storying-extinction/objects/trailcams/videos/ballcreek-cedarrub-birdonpath.mp4" caption="Bears are Important!" transcript="Example transcript text, this should be better!" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/video-modal.html objectid="https://cdil.lib.uidaho.edu/storying-extinction/objects/trailcams/videos/ballcreek-cedarrub-birdonpath.mp4" caption="Bears are Important!" transcript="Example transcript text, this should be better!" %}{% endraw %}`
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
### Audio Options
|
||||||
|
|
||||||
|
#### Audio from Collection (auto caption)
|
||||||
|
|
||||||
|
{% include feature/audio.html objectid="demo_003" width="50" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/audio.html objectid="demo_003" width="50" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### Audio from the Collection (with a caption)
|
||||||
|
|
||||||
|
{% include feature/audio.html objectid="demo_003" width="50" caption="a mp3 from the collection" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/audio.html objectid="demo_003" width="50" caption="a mp3 from the collection" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### External Audio (without a caption)
|
||||||
|
|
||||||
|
{% include feature/audio.html objectid="https://www.lib.uidaho.edu/digital/mp3s/Clouds.mp3" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/audio.html objectid="https://www.lib.uidaho.edu/digital/mp3s/Clouds.mp3" %}{% endraw %}`
|
||||||
|
|
||||||
|
|
||||||
|
#### External Audio (with a caption)
|
||||||
|
|
||||||
|
{% include feature/audio.html objectid="https://www.lib.uidaho.edu/digital/mp3s/Clouds.mp3" width="50" caption="Clouds are Important!" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/audio.html objectid="https://www.lib.uidaho.edu/digital/mp3s/Clouds.mp3" width="50" caption="Clouds are Important!" %}{% endraw %}`
|
||||||
|
|
||||||
|
#### Audio Modal from Collection
|
||||||
|
|
||||||
|
{% include feature/audio-modal.html objectid="demo_003" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/audio-modal.html objectid="demo_003" %}{% endraw %}`
|
||||||
|
|
||||||
|
#### Audio Modal External Item
|
||||||
|
|
||||||
|
{% include feature/audio-modal.html objectid="https://www.lib.uidaho.edu/digital/mp3s/Clouds.mp3" title="Clouds" caption="A reading." transcript="Example transcript text, this should be better!" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/audio-modal.html objectid="https://www.lib.uidaho.edu/digital/mp3s/Clouds.mp3" title="Clouds" caption="A reading." transcript="Example transcript text, this should be better!" %}{% endraw %}`
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
### Other Features
|
||||||
|
|
||||||
|
#### Cloud Include
|
||||||
|
|
||||||
|
{% include feature/cloud.html fields="subject" min="1" background="dark" button="outline-warning" %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/cloud.html fields="subject" min="1" background="dark" button="outline-warning" %}{% endraw %}`
|
||||||
|
|
||||||
|
#### TimelineJS
|
||||||
|
|
||||||
|
{% include feature/timelinejs.html %}
|
||||||
|
|
||||||
|
Example Code --> `{% raw %}{% include feature/timelinejs.html %}{% endraw %}`
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
### [Bootstrap](https://getbootstrap.com/) Features
|
||||||
|
|
||||||
|
#### Include a Card
|
||||||
|
|
||||||
|
- Card -- > `{% raw %}{% include feature/card.html header="This is a Card" text="The card features an image from the collection as a cap" objectid="demo004" width="25" centered=true %}{% endraw %}`
|
||||||
|
|
||||||
|
{% include feature/card.html header="This is a Card" text="The card features an image from the collection as a cap" objectid="demo_001" width="25" centered=true %}
|
||||||
|
|
||||||
|
#### Include a Button
|
||||||
|
|
||||||
|
- Buttons -- > `{% raw %}{% include feature/button.html text="Button Link to Somewhere" link="https://collectionbuilder.github.io/" color="success" %}{% endraw %}`
|
||||||
|
|
||||||
|
{% include feature/button.html text="Button Link to Somewhere" link="https://collectionbuilder.github.io/" color="success" centered=true %}
|
||||||
|
|
||||||
|
#### Include an Alert
|
||||||
|
|
||||||
|
- Alerts -- > `{% raw %}{% include feature/alert.html text="this is an *alert* that 'warns' a user" color="warning" align="center" %}{% endraw %}`
|
||||||
|
|
||||||
|
{% include feature/alert.html text="This is an *alert* that 'warns' a user with centrally aligned text." color="warning" align="center" %}
|
||||||
|
|
||||||
|
#### Include a Modal
|
||||||
|
|
||||||
|
- Modals -- > `{% raw %}{% include feature/modal.html button="This is a modal using a 'primary' colored button to invite clicking" title="when clicked:" text="A Modal will pop out a box with some more information" color="primary" %}{% endraw %}`
|
||||||
|
|
||||||
|
{% include feature/modal.html button="This is a modal using a 'primary' colored button to invite clicking" title="When clicked:" text="A Modal will pop out a box with some more information" color="primary" %}
|
||||||
189
_includes/cb/jekyll-toc.html
Normal file
189
_includes/cb/jekyll-toc.html
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
{% capture tocWorkspace %}
|
||||||
|
{% comment %}
|
||||||
|
Copyright (c) 2017 Vladimir "allejo" Jimenez
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person
|
||||||
|
obtaining a copy of this software and associated documentation
|
||||||
|
files (the "Software"), to deal in the Software without
|
||||||
|
restriction, including without limitation the rights to use,
|
||||||
|
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following
|
||||||
|
conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
{% endcomment %}
|
||||||
|
{% comment %}
|
||||||
|
Version 1.2.0
|
||||||
|
https://github.com/allejo/jekyll-toc
|
||||||
|
|
||||||
|
"...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{% include toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %}
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
* html (string) - the HTML of compiled markdown generated by kramdown in Jekyll
|
||||||
|
|
||||||
|
Optional Parameters:
|
||||||
|
* sanitize (bool) : false - when set to true, the headers will be stripped of any HTML in the TOC
|
||||||
|
* class (string) : '' - a CSS class assigned to the TOC
|
||||||
|
* id (string) : '' - an ID to assigned to the TOC
|
||||||
|
* h_min (int) : 1 - the minimum TOC header level to use; any header lower than this value will be ignored
|
||||||
|
* h_max (int) : 6 - the maximum TOC header level to use; any header greater than this value will be ignored
|
||||||
|
* ordered (bool) : false - when set to true, an ordered list will be outputted instead of an unordered list
|
||||||
|
* item_class (string) : '' - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level
|
||||||
|
* submenu_class (string) : '' - add custom class(es) for each child group of headings; has support for '%level%' placeholder which is the current "submenu" heading level
|
||||||
|
* base_url (string) : '' - add a base url to the TOC links for when your TOC is on another page than the actual content
|
||||||
|
* anchor_class (string) : '' - add custom class(es) for each anchor element
|
||||||
|
* skip_no_ids (bool) : false - skip headers that do not have an `id` attribute
|
||||||
|
|
||||||
|
Output:
|
||||||
|
An ordered or unordered list representing the table of contents of a markdown block. This snippet will only
|
||||||
|
generate the table of contents and will NOT output the markdown given to it
|
||||||
|
|
||||||
|
Modified:
|
||||||
|
Functionality was modified for CollectionBuilder's context to allow site's creator to trigger a link to the technical credits in the side nav. Additions include lines 165-167 in this file, and the addition of an optional "credits" parameter in the include. credits=true will add "Technical" to the side nav with a link to the #technical anchor. credits=false or not including credits will remove "Technical" from the side nav.
|
||||||
|
{% endcomment %}
|
||||||
|
|
||||||
|
{% capture newline %}
|
||||||
|
{% endcapture %}
|
||||||
|
{% assign newline = newline | rstrip %} <!-- Remove the extra spacing but preserve the newline -->
|
||||||
|
|
||||||
|
{% capture deprecation_warnings %}{% endcapture %}
|
||||||
|
|
||||||
|
{% if include.baseurl %}
|
||||||
|
{% capture deprecation_warnings %}{{ deprecation_warnings }}<!-- jekyll-toc :: "baseurl" has been deprecated, use "base_url" instead -->{{ newline }}{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if include.skipNoIDs %}
|
||||||
|
{% capture deprecation_warnings %}{{ deprecation_warnings }}<!-- jekyll-toc :: "skipNoIDs" has been deprecated, use "skip_no_ids" instead -->{{ newline }}{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% capture jekyll_toc %}{% endcapture %}
|
||||||
|
{% assign orderedList = include.ordered | default: false %}
|
||||||
|
{% assign baseURL = include.base_url | default: include.baseurl | default: '' %}
|
||||||
|
{% assign skipNoIDs = include.skip_no_ids | default: include.skipNoIDs | default: false %}
|
||||||
|
{% assign minHeader = include.h_min | default: 1 %}
|
||||||
|
{% assign maxHeader = include.h_max | default: 6 %}
|
||||||
|
{% assign nodes = include.html | strip | split: '<h' %}
|
||||||
|
|
||||||
|
{% assign firstHeader = true %}
|
||||||
|
{% assign currLevel = 0 %}
|
||||||
|
{% assign lastLevel = 0 %}
|
||||||
|
|
||||||
|
{% capture listModifier %}{% if orderedList %}ol{% else %}ul{% endif %}{% endcapture %}
|
||||||
|
|
||||||
|
{% for node in nodes %}
|
||||||
|
{% if node == "" %}
|
||||||
|
{% continue %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% assign currLevel = node | replace: '"', '' | slice: 0, 1 | times: 1 %}
|
||||||
|
|
||||||
|
{% if currLevel < minHeader or currLevel > maxHeader %}
|
||||||
|
{% continue %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% assign _workspace = node | split: '</h' %}
|
||||||
|
|
||||||
|
{% assign _idWorkspace = _workspace[0] | split: 'id="' %}
|
||||||
|
{% assign _idWorkspace = _idWorkspace[1] | split: '"' %}
|
||||||
|
{% assign htmlID = _idWorkspace[0] %}
|
||||||
|
|
||||||
|
{% assign _classWorkspace = _workspace[0] | split: 'class="' %}
|
||||||
|
{% assign _classWorkspace = _classWorkspace[1] | split: '"' %}
|
||||||
|
{% assign htmlClass = _classWorkspace[0] %}
|
||||||
|
|
||||||
|
{% if htmlClass contains "no_toc" %}
|
||||||
|
{% continue %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if firstHeader %}
|
||||||
|
{% assign minHeader = currLevel %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% capture _hAttrToStrip %}{{ _workspace[0] | split: '>' | first }}>{% endcapture %}
|
||||||
|
{% assign header = _workspace[0] | replace: _hAttrToStrip, '' %}
|
||||||
|
|
||||||
|
{% if include.item_class and include.item_class != blank %}
|
||||||
|
{% capture listItemClass %} class="{{ include.item_class | replace: '%level%', currLevel | split: '.' | join: ' ' }}"{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if include.submenu_class and include.submenu_class != blank %}
|
||||||
|
{% assign subMenuLevel = currLevel | minus: 1 %}
|
||||||
|
{% capture subMenuClass %} class="{{ include.submenu_class | replace: '%level%', subMenuLevel | split: '.' | join: ' ' }}"{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% capture anchorBody %}{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}{% endcapture %}
|
||||||
|
|
||||||
|
{% if htmlID %}
|
||||||
|
{% capture anchorAttributes %} href="{% if baseURL %}{{ baseURL }}{% endif %}#{{ htmlID }}"{% endcapture %}
|
||||||
|
|
||||||
|
{% if include.anchor_class %}
|
||||||
|
{% capture anchorAttributes %}{{ anchorAttributes }} class="{{ include.anchor_class | split: '.' | join: ' ' }}"{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% capture listItem %}<a{{ anchorAttributes }}>{{ anchorBody }}</a>{% endcapture %}
|
||||||
|
{% elsif skipNoIDs == true %}
|
||||||
|
{% continue %}
|
||||||
|
{% else %}
|
||||||
|
{% capture listItem %}{{ anchorBody }}{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if currLevel > lastLevel %}
|
||||||
|
{% capture jekyll_toc %}{{ jekyll_toc }}<{{ listModifier }}{{ subMenuClass }}>{% endcapture %}
|
||||||
|
{% elsif currLevel < lastLevel %}
|
||||||
|
{% assign repeatCount = lastLevel | minus: currLevel %}
|
||||||
|
|
||||||
|
{% for i in (1..repeatCount) %}
|
||||||
|
{% capture jekyll_toc %}{{ jekyll_toc }}</li></{{ listModifier }}>{% endcapture %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% capture jekyll_toc %}{{ jekyll_toc }}</li>{% endcapture %}
|
||||||
|
{% else %}
|
||||||
|
{% capture jekyll_toc %}{{ jekyll_toc }}</li>{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% capture jekyll_toc %}{{ jekyll_toc }}<li{{ listItemClass }}>{{ listItem }}{% endcapture %}
|
||||||
|
|
||||||
|
{% assign lastLevel = currLevel %}
|
||||||
|
{% assign firstHeader = false %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% assign repeatCount = minHeader | minus: 1 %}
|
||||||
|
{% assign repeatCount = lastLevel | minus: repeatCount %}
|
||||||
|
|
||||||
|
{% for i in (1..repeatCount) %}
|
||||||
|
{% if i == repeatCount and include.credits == true %}
|
||||||
|
{% capture jekyll_toc %}{{ jekyll_toc }}<li><a href="#technical">Technical</a>{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
{% capture jekyll_toc %}{{ jekyll_toc }}</li></{{ listModifier }}>{% endcapture %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% if jekyll_toc != '' %}
|
||||||
|
{% assign rootAttributes = '' %}
|
||||||
|
{% if include.class and include.class != blank %}
|
||||||
|
{% capture rootAttributes %} class="{{ include.class | split: '.' | join: ' ' }}"{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if include.id and include.id != blank %}
|
||||||
|
{% capture rootAttributes %}{{ rootAttributes }} id="{{ include.id }}"{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if rootAttributes %}
|
||||||
|
{% assign nodes = jekyll_toc | split: '>' %}
|
||||||
|
{% capture jekyll_toc %}<{{ listModifier }}{{ rootAttributes }}>{{ nodes | shift | join: '>' }}>{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endcapture %}{% assign tocWorkspace = '' %}{{ deprecation_warnings }}{{ jekyll_toc -}}
|
||||||
52
_includes/collection-banner.html
Normal file
52
_includes/collection-banner.html
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
{% if page.layout == "home-infographic" and site.data.theme.featured-image %}
|
||||||
|
<style>
|
||||||
|
#home-banner {
|
||||||
|
background-image: url('{{ site.data.featured_item.src | relative_url }}');
|
||||||
|
background-size: cover;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: {{ site.data.theme.home-banner-image-position | default: 'center' }};
|
||||||
|
}
|
||||||
|
#home-title-box {
|
||||||
|
padding-top: {{ site.data.theme.home-title-y-padding | default: '5em' }};
|
||||||
|
padding-bottom: {{ site.data.theme.home-title-y-padding | default: '5em' }};
|
||||||
|
}
|
||||||
|
@media screen and (max-width: 576px) {
|
||||||
|
#home-title-box {
|
||||||
|
padding-top: min({{ site.data.theme.home-title-y-padding | default: '5em' }}, 32vh);
|
||||||
|
padding-bottom: min({{ site.data.theme.home-title-y-padding | default: '5em' }}, 32vh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div id="home-banner" class="container-fluid mb-0 p-0">
|
||||||
|
<div id="home-title-box" class="position-relative" >
|
||||||
|
<div class="p-2 text-center text-white bg-dark bg-opacity-75">
|
||||||
|
{% if site.organization-logo-nav %}
|
||||||
|
<a class="d-none d-md-block" href="{{ site.organization-link }}">
|
||||||
|
<img id="home-banner-logo" src="{{ site.organization-logo-nav | relative_url }}" alt="{{ site.organization-name | escape }} home" >
|
||||||
|
</a>{% endif %}
|
||||||
|
<h1 class="display-4">{{ site.title }}</h1>
|
||||||
|
{% if site.tagline %}<p class="mb-0">{{ site.tagline }}</p>{% endif %}
|
||||||
|
</div>
|
||||||
|
{% unless site.data.theme.featured-image contains '/' %}
|
||||||
|
<div class="position-absolute bottom-0 end-0 px-2 bg-dark bg-opacity-75">
|
||||||
|
<a class="text-white fs-6" href="{{ site.data.featured_item.link | relative_url }}" title="{{ site.data.featured_item.alt | escape }}">Featured Image</a>
|
||||||
|
</div>{% endunless %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{%- else -%}
|
||||||
|
<div class="container">
|
||||||
|
<div class="row align-items-center">
|
||||||
|
<div id="title" class="{% if site.organization-logo-banner %}col-md-9{% else %}col-12{% endif %}">
|
||||||
|
<h1 class="mt-2"><a class="text-dark" href="{{ '/' | relative_url }}" >{{ site.title }}</a></h1>
|
||||||
|
{% if site.tagline %}<p>{{ site.tagline }}</p>{% endif %}
|
||||||
|
</div>
|
||||||
|
{% if site.organization-logo-banner %}
|
||||||
|
<div class="col-md-3 d-none d-lg-block text-end">
|
||||||
|
<a class="btn btn-outline-light" href="{{ site.organization-link }}">
|
||||||
|
<img class="img-fluid" src="{{ site.organization-logo-banner | relative_url }}" title="{{ site.organization-name }}" alt="{{ site.organization-name | escape }} home" >
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{%- endif -%}
|
||||||
40
_includes/collection-nav.html
Normal file
40
_includes/collection-nav.html
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<nav class="navbar navbar-expand-lg {{ site.data.theme.navbar-color | default: 'navbar-dark' }} {{ site.data.theme.navbar-background | default: 'bg-dark' }}">
|
||||||
|
<div class="container">
|
||||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#page-nav" aria-controls="page-nav" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
{% if site.organization-logo-nav %}<span class="d-lg-none text-end">
|
||||||
|
<a href="{{ site.organization-link }}">
|
||||||
|
<img class="img-fluid" id="mobile-nav-image" src="{{ site.organization-logo-nav | relative_url }}" title="{{ site.organization-name }}" alt="{{ site.organization-name | escape }} home" >
|
||||||
|
</a>
|
||||||
|
</span>{% endif %}
|
||||||
|
|
||||||
|
<div class="collapse navbar-collapse" id="page-nav">
|
||||||
|
<ul class="navbar-nav me-auto">
|
||||||
|
{%- assign navItems = site.data.config-nav | where_exp: 'item', 'item.display_name and item.dropdown_parent == nil' -%}
|
||||||
|
{% for nav in navItems %}
|
||||||
|
{% if nav.stub %}
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link{% if page.url == nav.stub %} active{% endif %}" href="{{ nav.stub | relative_url }}">{{ nav.display_name }}</a>
|
||||||
|
</li>
|
||||||
|
{%- else -%}
|
||||||
|
<li class="nav-item dropdown">
|
||||||
|
{% assign navChildren = site.data.config-nav | where_exp: 'item', 'item.dropdown_parent == nav.display_name' %}
|
||||||
|
{%- assign childStubs = navChildren | map: 'stub' -%}
|
||||||
|
<a class="nav-link dropdown-toggle{% if childStubs contains page.url %} active{% endif %}" data-bs-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">{{ nav.display_name }}</a>
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
{% for c in navChildren %}
|
||||||
|
<a class="dropdown-item {% if page.url == c.stub %}active{% endif %}" href="{{ c.stub | relative_url }}">{{ c.display_name }}</a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{%- endfor -%}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{% include nav-search-lunr.html %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
214
_includes/data-download-modal.html
Normal file
214
_includes/data-download-modal.html
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
{% comment %}
|
||||||
|
This include creates a modal pop up with data export options.
|
||||||
|
The logic of which formats appear is based on config-nav stubs:
|
||||||
|
if subject.html, map.html, location.html, or timeline.html are present,
|
||||||
|
corresponding data formats will be available for download.
|
||||||
|
{%- endcomment -%}
|
||||||
|
|
||||||
|
{%- assign stubs = site.data.config-nav | map: 'stub' | join: ';' -%}
|
||||||
|
<button type="button" class="btn btn-primary btn-lg float-md-end" data-bs-toggle="modal" data-bs-target="#dataModal">Download Data</button>
|
||||||
|
<!-- Modal -->
|
||||||
|
<div class="modal fade" id="dataModal" tabindex="-1" role="dialog" aria-labelledby="dataModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h1 class="modal-title" id="dataModalLabel">Collection Data</h1>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
|
||||||
|
<p>Download this collection's data in a variety of reusable formats.</p>
|
||||||
|
|
||||||
|
{% if site.data.theme.metadata-export-fields %}
|
||||||
|
<div class="card my-3">
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="card-title h4">Complete Metadata</h2>
|
||||||
|
<p class="card-text">All metadata fields for all collection items, available as a CSV spreadsheet (usable in Excel, Google Sheets, and similar programs) or JSON file (often used with web applications).</p>
|
||||||
|
<a href="{{ '/assets/data/metadata.csv' | relative_url }}" class="btn btn-outline-dark" download>Metadata CSV</a>
|
||||||
|
<a href="{{ '/assets/data/metadata.json' | relative_url }}" class="btn btn-outline-dark" target="_blank">Metadata JSON</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{%- endif -%}
|
||||||
|
{% if site.data.theme.metadata-facets-fields %}
|
||||||
|
<div class="card my-3">
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="card-title h4">Metadata Facets</h2>
|
||||||
|
<p class="card-text">List of unique values and their count for specific metadata fields, useful for understanding content of the fields.</p>
|
||||||
|
<a href="{{ '/assets/data/facets.json' | relative_url }}" class="btn btn-outline-dark" target="_blank">Facets JSON</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{%- endif -%}
|
||||||
|
{% if stubs contains "subject" %}
|
||||||
|
<div class="card my-3">
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="card-title h4">Subject Metadata</h2>
|
||||||
|
<p class="card-text">Unique values and counts of subject metadata, useful for further analyzing the content of this collection.</p>
|
||||||
|
<a href="{{ '/assets/data/subjects.csv' | relative_url }}" class="btn btn-outline-dark" download>Subjects CSV</a>
|
||||||
|
<a href="{{ '/assets/data/subjects.json' | relative_url }}" class="btn btn-outline-dark" target="_blank">Subjects JSON</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if stubs contains "location" %}
|
||||||
|
<div class="card my-3">
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="card-title h4">Locations</h2>
|
||||||
|
<p class="card-text">Unique values and counts of location metadata, useful for further visualization and analysis of this collection's place names.</p>
|
||||||
|
<a href="{{ '/assets/data/locations.csv' | relative_url }}" class="btn btn-outline-dark" download>Locations CSV</a>
|
||||||
|
<a href="{{ '/assets/data/locations.json' | relative_url }}" class="btn btn-outline-dark" target="_blank">Locations JSON</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{%- endif -%}
|
||||||
|
{% if stubs contains "map" %}
|
||||||
|
<div class="card my-3">
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="card-title h4">GeoJSON</h2>
|
||||||
|
<p class="card-text">Metadata for all collection items that have geographic coordinates in <a href="https://en.wikipedia.org/wiki/GeoJSON">GeoJSON</a> format, useful for further exploration and analysis of this collection through a geographical lense.</p>
|
||||||
|
<a href="{{ '/assets/data/geodata.json' | relative_url }}" class="btn btn-outline-dark" target="_blank">Geodata JSON</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{%- endif -%}
|
||||||
|
{% if stubs contains "timeline" %}
|
||||||
|
<div class="card my-3">
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="card-title h4">Timeline</h2>
|
||||||
|
<p class="card-text">A time-focused JSON data export designed for use with <a href="https://timeline.knightlab.com/">TimelineJS</a>.</p>
|
||||||
|
<a href="{{ '/assets/data/timelinejs.json' | relative_url }}" class="btn btn-outline-dark" target="_blank">TimelineJS JSON</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{%- endif -%}
|
||||||
|
<div class="card my-3">
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="card-title h4">Website Source Code</h2>
|
||||||
|
<p class="card-text">GitHub repository containing source code for this project built with <a href="https://github.com/CollectionBuilder/collectionbuilder-csv">CollectionBuilder-CSV</a>.</p>
|
||||||
|
<a href="{{ site.source-code | default: 'https://github.com/CollectionBuilder/collectionbuilder-csv' }}" class="btn btn-outline-dark">Source Code</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context":"https://schema.org/",
|
||||||
|
"@type":"Dataset",
|
||||||
|
"name":"{{ site.title | escape }} Data",
|
||||||
|
"description":"Metadata and data derived from {{ site.title | escape }}. {{ site.description | escape }}",
|
||||||
|
{% if site.keywords %}"keywords": {% assign keywords = site.keywords | split: ';' %} {{ keywords | jsonify }},{% endif %}
|
||||||
|
"url":"{{ page.url | absolute_url }}",
|
||||||
|
"license" : "https://creativecommons.org/publicdomain/zero/1.0/",
|
||||||
|
"creator": [
|
||||||
|
{
|
||||||
|
"@type": "Organization",
|
||||||
|
"sameAs": "{{ site.organization-link }}",
|
||||||
|
"name": "{{ site.organization-name | escape }}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"hasPart" : [
|
||||||
|
{% if site.data.theme.metadata-facets-fields %}
|
||||||
|
{
|
||||||
|
"@type": "Dataset",
|
||||||
|
"name": "{{ site.title | escape }} Metadata Facets",
|
||||||
|
"description": "Unique values and counts of metadata facet fields.",
|
||||||
|
"license" : "https://creativecommons.org/publicdomain/zero/1.0/",
|
||||||
|
"distribution":[
|
||||||
|
{
|
||||||
|
"@type":"DataDownload",
|
||||||
|
"encodingFormat":"JSON",
|
||||||
|
"contentUrl":"{{ '/assets/data/facets.json' | absolute_url }}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{%- endif -%}
|
||||||
|
{% if stubs contains "subject" %}
|
||||||
|
{
|
||||||
|
"@type": "Dataset",
|
||||||
|
"name": "{{ site.title | escape }} metadata subject counts",
|
||||||
|
"description": "Unique values and counts of metadata subject fields.",
|
||||||
|
"license" : "https://creativecommons.org/publicdomain/zero/1.0/",
|
||||||
|
"distribution":[
|
||||||
|
{
|
||||||
|
"@type":"DataDownload",
|
||||||
|
"encodingFormat":"CSV",
|
||||||
|
"contentUrl":"{{ '/assets/data/subjects.csv' | absolute_url }}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type":"DataDownload",
|
||||||
|
"encodingFormat":"JSON",
|
||||||
|
"contentUrl":"{{ '/assets/data/subjects.json' | absolute_url }}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{%- endif -%}
|
||||||
|
{% if stubs contains "location" %}
|
||||||
|
{
|
||||||
|
"@type": "Dataset",
|
||||||
|
"name": "{{ site.title | escape }} metadata location counts",
|
||||||
|
"description": "Unique values and counts of metadata location fields.",
|
||||||
|
"license" : "https://creativecommons.org/publicdomain/zero/1.0/",
|
||||||
|
"distribution":[
|
||||||
|
{
|
||||||
|
"@type":"DataDownload",
|
||||||
|
"encodingFormat":"CSV",
|
||||||
|
"contentUrl":"{{ '/assets/data/locations.csv' | absolute_url }}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type":"DataDownload",
|
||||||
|
"encodingFormat":"JSON",
|
||||||
|
"contentUrl":"{{ '/assets/data/locations.json' | absolute_url }}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{%- endif -%}
|
||||||
|
{% if stubs contains "map" %}
|
||||||
|
{
|
||||||
|
"@type": "Dataset",
|
||||||
|
"name": "{{ site.title | escape }} geographic metadata",
|
||||||
|
"description": "Geojson data containing all objects with lat-longs and associated descriptive metadata.",
|
||||||
|
"license" : "https://creativecommons.org/publicdomain/zero/1.0/",
|
||||||
|
"distribution":[
|
||||||
|
{
|
||||||
|
"@type":"DataDownload",
|
||||||
|
"encodingFormat":"JSON",
|
||||||
|
"contentUrl":"{{ '/assets/data/geodata.json' | absolute_url }}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{%- endif -%}
|
||||||
|
{% if stubs contains "timeline" %}
|
||||||
|
{
|
||||||
|
"@type": "Dataset",
|
||||||
|
"name": "{{ site.title | escape }} timeline metadata",
|
||||||
|
"description": "Time-based metadata formatted for TimelineJS or other applications.",
|
||||||
|
"license" : "https://creativecommons.org/publicdomain/zero/1.0/",
|
||||||
|
"distribution":[
|
||||||
|
{
|
||||||
|
"@type":"DataDownload",
|
||||||
|
"encodingFormat":"JSON",
|
||||||
|
"contentUrl":"{{ '/assets/data/timelinejs.json' | absolute_url }}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{%- endif -%}
|
||||||
|
{
|
||||||
|
"@type": "Dataset",
|
||||||
|
"name": "{{ site.title | escape }} full metadata",
|
||||||
|
"description": "Complete metadata export for {{ site.title | escape }} objects.",
|
||||||
|
"license" : "https://creativecommons.org/publicdomain/zero/1.0/",
|
||||||
|
"distribution":[
|
||||||
|
{
|
||||||
|
"@type":"DataDownload",
|
||||||
|
"encodingFormat":"CSV",
|
||||||
|
"contentUrl":"{{ '/assets/data/metadata.csv' | absolute_url }}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type":"DataDownload",
|
||||||
|
"encodingFormat":"JSON",
|
||||||
|
"contentUrl":"{{ '/assets/data/metadata.json' | absolute_url }}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
</script>
|
||||||
55
_includes/feature/accordion.html
Normal file
55
_includes/feature/accordion.html
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Bootstrap accordion feature, https://getbootstrap.com/docs/5.1/components/accordion/
|
||||||
|
|
||||||
|
e.g. --> {% include feature/accordion.html title1="Example section" text1=example1 title2="Section two" text2=example2 title3="Section three" text3=example3 %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "title1", "title2", "title3" = title for each section of accordion (max three)
|
||||||
|
- "text1", "text2", "text3" = text for each section of accordion (max three). You will probably want to capture the text using a Liquid capture, then use the variable to provide text to this include.
|
||||||
|
- "open" = optional, by default is "false". Add "true" to have the first section of the accordion open.
|
||||||
|
- "heading_level" = customize the level of the heading if necessary for accessibility, choose "h1", "h2", "h3", etc (optional, default "h3")
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<div class="accordion mb-3 narrow-content" id="accordionInclude">
|
||||||
|
<div class="accordion-item">
|
||||||
|
<{{ include.heading_level | default: 'h3' | strip }} class="accordion-header" id="headingOne">
|
||||||
|
<button class="accordion-button{% unless include.open %} collapsed{% endunless %}" type="button" data-bs-toggle="collapse" data-bs-target="#collapseOne" aria-expanded="{% if include.open == true %}true{% else %}false{% endif %}" aria-controls="collapseOne">
|
||||||
|
{{ include.title1 }}
|
||||||
|
</button>
|
||||||
|
</{{ include.heading_level | default: 'h3' | strip }}>
|
||||||
|
<div id="collapseOne" class="accordion-collapse collapse{% if include.open == true %} show{% endif %}" aria-labelledby="headingOne" data-bs-parent="#accordionInclude">
|
||||||
|
<div class="accordion-body">
|
||||||
|
{{ include.text1 | markdownify }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if include.title2 %}
|
||||||
|
<div class="accordion-item">
|
||||||
|
<{{ include.heading_level | default: 'h3' | strip }} class="accordion-header" id="headingTwo">
|
||||||
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
|
||||||
|
{{ include.title2 }}
|
||||||
|
</button>
|
||||||
|
</{{ include.heading_level | default: 'h3' | strip }}>
|
||||||
|
<div id="collapseTwo" class="accordion-collapse collapse" aria-labelledby="headingTwo" data-bs-parent="#accordionInclude">
|
||||||
|
<div class="accordion-body">
|
||||||
|
{{ include.text2 | markdownify }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if include.title3 %}
|
||||||
|
<div class="accordion-item">
|
||||||
|
<{{ include.heading_level | default: 'h3' | strip }} class="accordion-header" id="headingThree">
|
||||||
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
|
||||||
|
{{ include.title3 }}
|
||||||
|
</button>
|
||||||
|
</{{ include.heading_level | default: 'h3' | strip }}>
|
||||||
|
<div id="collapseThree" class="accordion-collapse collapse" aria-labelledby="headingThree" data-bs-parent="#accordionInclude">
|
||||||
|
<div class="accordion-body">
|
||||||
|
{{ include.text3 | markdownify }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
17
_includes/feature/alert.html
Normal file
17
_includes/feature/alert.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Bootstrap Alert, https://getbootstrap.com/docs/5.1/components/alerts/
|
||||||
|
|
||||||
|
E.G. --> {% include feature/alert.html text="example text" color="warning" align="center" %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "text" = text for alert, can use Markdown.
|
||||||
|
- "color" = a Bootstrap color (primary, secondary, success, danger, warning, info, light, dark)
|
||||||
|
- "align" = text alignment (center, right, left)
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<div class="narrow-content">
|
||||||
|
<div class="alert alert-{{ include.color | default: 'primary' }} feature-alert {% if include.align %}text-{{ include.align | default: 'center' }}{% endif %}" role="alert">
|
||||||
|
{{ include.text | markdownify }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
97
_includes/feature/audio-modal.html
Normal file
97
_includes/feature/audio-modal.html
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Audio modal feature from an item's objectid or external link.
|
||||||
|
This include adds a card featuring the thumb image, title, and description of an audio item--when clicked it opens a modal containing the audio embed. The modal displays audio information, transcript, link to item. This is especially useful feature if you would like multiple videos on one page.
|
||||||
|
|
||||||
|
E.G. --> {% include feature/audio-modal.html objectid="demo_003" %}
|
||||||
|
|
||||||
|
It requires an "objectid" with the include, which is used to find the audio details. Alternatively, a URL to an external audio file can be used in "objectid".
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "objectid" = several options below (required)
|
||||||
|
- an objectid of an audio item in this collection, e.g. "demo_003"
|
||||||
|
- an external link to an MP3 file hosted elsewhere, e.g. "https://www.lib.uidaho.edu/digital/mp3s/Clouds.mp3"
|
||||||
|
- a relative link to an MP3 file somewhere else in this repository, e.g. "/assets/{{ includeid }}.mp3"
|
||||||
|
- "title" = by default automatically adds the title from item metadata, which will be used for the modal btn and modal title. Manually set by using the title option. (optional)
|
||||||
|
- "heading_level" = customize the level of the heading if necessary for accessibility, choose "h1", "h2", "h3", etc (optional, default "h2")
|
||||||
|
- "caption" = by default the figure include automatically uses the description of the item from your metadata. The caption option allows you to manually add a different caption, or give the value false for none. (optional)
|
||||||
|
- "image" = by default if using an objectid, if the item has a image_small value, the image will be used on the card. The image option allows you to manually add a image for non-collection videos. Give "false" to not display an image (optional)
|
||||||
|
- "transcript" = by default if using an objectid, if the item has a object_transcript value, the view transcript button will automatically be added. The transcript option allows you to manually add a different transcript or provide one for non-collection videos. (optional)
|
||||||
|
|
||||||
|
Note: if you have issues make sure the item is a audio item.
|
||||||
|
Audio file may not play correctly from dev server on Chrome browser! It will work in production.
|
||||||
|
|
||||||
|
{% endcomment %}
|
||||||
|
{% if include.objectid contains "/" %}
|
||||||
|
{%- capture src -%}{{ include.objectid | relative_url }}{%- endcapture -%}
|
||||||
|
{%- capture audio_link -%}{{ src }}{%- endcapture -%}
|
||||||
|
{%- capture audio_caption -%}{{ include.caption }}{%- endcapture -%}
|
||||||
|
{%- capture audio_title -%}{{ include.title }}{%- endcapture -%}
|
||||||
|
{% capture audio_transcript %}{{ include.transcript }}{% endcapture %}
|
||||||
|
{% capture audio_poster %}{% if include.image == false %}{% else %}{{ include.image | relative_url | default: '' }}{% endif %}{% endcapture %}
|
||||||
|
{% else %}
|
||||||
|
{%- assign item = site.data[site.metadata] | where: "objectid", include.objectid | first -%}
|
||||||
|
{%- capture audio_link -%}{{ '/items/' | relative_url }}{% if item.parentid %}{{ item.parentid }}.html#{{ item.objectid }}{% else %}{{ item.objectid }}.html{% endif %}{%- endcapture -%}
|
||||||
|
{%- capture src -%}{{ item.object_location | relative_url }}{% endcapture %}
|
||||||
|
{%- capture audio_caption -%}{% if include.caption %}{{ include.caption }}{% else %}{{ item.description }}{% endif %}{%- endcapture -%}
|
||||||
|
{%- capture audio_title -%}{% if include.title %}{{ include.title }}{% else %}{{ item.title }}{% endif %}{%- endcapture -%}
|
||||||
|
{% capture audio_transcript %}{{ include.transcript | default: item.object_transcript }}{% endcapture %}
|
||||||
|
{% capture audio_poster %}{% if include.image == false %}{% else %}{{ include.image | default: item.image_small | relative_url | default: '' }}{% endif %}{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
{% capture includeid %}{% if include.objectid.size > 10 %}{{ include.objectid | slice: -10, 10 | slugify }}{% else %}{{ include.objectid | slugify }}{% endif %}{% endcapture %}
|
||||||
|
<div class="card my-3 narrow-content">
|
||||||
|
{% if audio_poster != "" %}<img src="{{ audio_poster | relative_url }}" class="card-img-top" alt="{{ audio_title | escape }}">{% endif %}
|
||||||
|
<div class="card-body text-center">
|
||||||
|
<{{ include.heading_level | default: 'h2' | strip }} class="card-title h2">{{ audio_title }}</{{ include.heading_level | default: 'h2' | strip }}>
|
||||||
|
<p class="card-text">{{ audio_caption }}</p>
|
||||||
|
<button class="btn btn-sm btn-primary stretched-link" type="button" data-bs-toggle="modal" data-bs-target="#{{ includeid }}Modal">
|
||||||
|
Listen to Audio
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi icon-sprite" viewBox="0 0 16 16">
|
||||||
|
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16"/>
|
||||||
|
<path d="M6.271 5.055a.5.5 0 0 1 .52.038l3.5 2.5a.5.5 0 0 1 0 .814l-3.5 2.5A.5.5 0 0 1 6 10.5v-5a.5.5 0 0 1 .271-.445"/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal fade" id="{{ includeid }}Modal" tabindex="-1" aria-labelledby="{{ includeid }}ModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
|
||||||
|
<div class="modal-dialog modal-lg modal-dialog-centered">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h1 class="modal-title fs-5" id="{{ includeid }}ModalLabel">{{ audio_title }}</h1>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" onclick="document.querySelector('#{{ includeid }}ModalAudio').pause();"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<p class="text-center my-3">
|
||||||
|
<audio controls class="w-100" preload="metadata" id="{{ includeid }}ModalAudio">
|
||||||
|
<source src="{{ src }}" >
|
||||||
|
Your browser does not support the audio element, please <a href="{{ audio_link }}">download the file to listen</a>.
|
||||||
|
</audio>
|
||||||
|
{% if audio_poster != "" %}<img src="{{ audio_poster | relative_url }}" class="img-fluid" alt="{{ audio_title | escape }}">{% endif %}
|
||||||
|
{% unless include.caption == false %}<p class="figure-caption">
|
||||||
|
{{ audio_caption }}
|
||||||
|
</p>{% endunless %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
{% if audio_transcript != '' %}
|
||||||
|
<div class="collapse mt-3 w-100" id="collapseTranscript{{ includeid }}">
|
||||||
|
<div class="card card-body text-start">
|
||||||
|
{% assign transcript_type = audio_transcript | slice: 0,1 %}
|
||||||
|
{% if transcript_type == '/' %}
|
||||||
|
{% assign transcript_location = audio_transcript | remove_first: '/' %}
|
||||||
|
{% assign transcript = site.pages | where: 'path', transcript_location | first %}
|
||||||
|
{{ transcript.content | markdownify }}
|
||||||
|
{% else %}
|
||||||
|
{{ audio_transcript | markdownify }}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button class="btn btn-outline-primary m-2" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTranscript{{ includeid }}" aria-expanded="false" aria-controls="collapseTranscript{{ includeid }}">View Transcript</button>
|
||||||
|
{% endif %}
|
||||||
|
{% unless include.objectid contains '/' %}
|
||||||
|
<a href="{{ audio_link }}" class="btn btn-outline-dark m-2">Visit Item Page</a>{% endunless %}
|
||||||
|
<button type="button" class="btn btn-dark" data-bs-dismiss="modal" onclick="document.querySelector('#{{ includeid }}ModalAudio').pause();">Close</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
37
_includes/feature/audio.html
Normal file
37
_includes/feature/audio.html
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Audio embed from an item's objectid or external link.
|
||||||
|
This include adds a audio embed to the page using the html "audio" element.
|
||||||
|
|
||||||
|
E.G. --> {% include feature/audio.html objectid="demo_003" %}
|
||||||
|
|
||||||
|
It requires an "objectid" with the include, which is used to find the audio details. Alternatively, a URL to an external audio file can be used in "objectid".
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "objectid" = several options below (required)
|
||||||
|
- an objectid of an audio item in this collection, e.g. "demo_003"
|
||||||
|
- an external link to an MP3 file hosted elsewhere, e.g. "https://www.lib.uidaho.edu/digital/mp3s/Clouds.mp3"
|
||||||
|
- a relative link to an MP3 file somewhere else in this repository, e.g. "/assets/example.mp3"
|
||||||
|
- "caption" = by default the figure include automatically adds the title of the item from your metadata. The caption option allows you to manually add a different caption, or give the value false for none. (optional)
|
||||||
|
|
||||||
|
Note: if you have issues make sure the item is a audio item.
|
||||||
|
Audio file may not play correctly from dev server on Chrome browser! It will work in production.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{% if include.objectid contains "/" %}
|
||||||
|
{%- capture src -%}{{ include.objectid | relative_url }}{%- endcapture -%}
|
||||||
|
{%- capture audio_link -%}{{ src }}{%- endcapture -%}
|
||||||
|
{%- capture audio_caption -%}{{ include.caption }}{%- endcapture -%}
|
||||||
|
{% else %}
|
||||||
|
{%- assign item = site.data[site.metadata] | where: "objectid", include.objectid | first -%}
|
||||||
|
{%- capture audio_link -%}{{ '/items/' | relative_url }}{% if item.parentid %}{{ item.parentid }}.html#{{ item.objectid }}{% else %}{{ item.objectid }}.html{% endif %}{%- endcapture -%}
|
||||||
|
{%- capture src -%}{{ item.object_location | relative_url }}{% endcapture %}
|
||||||
|
{%- capture audio_caption -%}{% if include.caption %}{{ include.caption }}{% else %}{{ item.title }}{% endif %}{%- endcapture -%}
|
||||||
|
{% endif %}
|
||||||
|
<p class="text-center my-3">
|
||||||
|
<audio controls class="w-100">
|
||||||
|
<source src="{{ src }}" >
|
||||||
|
Your browser does not support the audio element.
|
||||||
|
</audio>
|
||||||
|
{% unless include.caption == false %}<small class="figure-caption"><a href="{{ audio_link }}">{{ audio_caption }}</a></small>{% endunless %}
|
||||||
|
</p>
|
||||||
23
_includes/feature/blockquote.html
Normal file
23
_includes/feature/blockquote.html
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Block quote
|
||||||
|
|
||||||
|
E.G. --> {% include feature/blockquote.html text="Knowledge comes, but wisdom lingers" speaker="Alfred Lord Tennyson" source="Locksley Hall" %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "text" = quote text, can use Markdown (required, hint: use a capture statement to add more complex text!)
|
||||||
|
- "speaker" = name of the person who said the quote (optional)
|
||||||
|
- "source" = title of the quote's source (optional)
|
||||||
|
- "link" = link to source, will be added to speaker/source (note: will not be added unless you have a speaker or source value!)
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<figure class="my-3 narrow-content">
|
||||||
|
<blockquote class="blockquote fs-3">
|
||||||
|
{{ include.text | markdownify }}
|
||||||
|
</blockquote>
|
||||||
|
{% if include.speaker or include.source %}
|
||||||
|
<figcaption class="blockquote-footer text-end fs-4">{% if include.link %}<a href="{{ include.link | relative_url }}">{% endif %}
|
||||||
|
{% if include.speaker %}{{ include.speaker }}{% if include.source %}, {% endif %}{% endif %}
|
||||||
|
{% if include.source %}<cite title="Source Title">{{ include.source }}</cite>{% endif %}
|
||||||
|
{% if include.link %}</a>{% endif %}</figcaption>{% endif %}
|
||||||
|
</figure>
|
||||||
19
_includes/feature/button.html
Normal file
19
_includes/feature/button.html
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Bootstrap button link, https://getbootstrap.com/docs/5.1/components/buttons/
|
||||||
|
|
||||||
|
E.G. --> {% include feature/button.html text="Example Button Link" link="https://example.com" color="success" %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "text" = main button text
|
||||||
|
- "link" = button link
|
||||||
|
- "color" = a bootstrap color (primary, secondary, success, danger, warning, info, light, dark)
|
||||||
|
- "size" = optional btn size, choose from "lg", "sm" (defaults to normal size)
|
||||||
|
- "width" = will use Bootstrap sizing to set the % size, choose from "25", "50", "75", or "100"
|
||||||
|
- "centered" = give "true" to add the button to a div and center on page
|
||||||
|
- "float" = will use Bootstrap float utility to add float, choose from "start" (left) or "end" (right) (not recommended)
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{% if include.centered %}<p class="text-center mb-3">{%- endif -%}
|
||||||
|
<a class="btn{% if include.size %} btn-{{ include.size }}{% endif %} btn-{{ include.color | default: 'secondary' }}{% if include.float %} float-{{ include.float }}{% endif %}{% if include.width %} w-{{ include.width }}{% endif %}" href="{{ include.link }}">{{ include.text }}</a>
|
||||||
|
{% if include.centered %}</p>{%- endif -%}
|
||||||
36
_includes/feature/card.html
Normal file
36
_includes/feature/card.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Bootstrap Card, https://getbootstrap.com/docs/5.1/components/card/
|
||||||
|
|
||||||
|
E.G. --> {% include feature/card.html text="Some text" header="Example item" objectid="demo_004" %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "text" = main card text, can use markdown formatting (tip: use a Liquid capture to add more complex content)
|
||||||
|
- "header" = card header text (in bar above card content)
|
||||||
|
- "title" = card title text inside card content area
|
||||||
|
- "heading_level" = customize the level of the heading if necessary for accessibility, choose "h1", "h2", "h3", etc (optional, default "h2")
|
||||||
|
- "objectid" = the given object or link to external image will create a card cap image
|
||||||
|
- "alt" = if adding an external image using objectid option, provide alt text for image
|
||||||
|
- "width" = will use responsive sizing to set the % size on desktop (will be 100% on mobile), choose from "25", "50", "75", or "100"
|
||||||
|
- "centered" = give "true" to add mx-auto class on the card to center it (don't use with float!)
|
||||||
|
- "float" = will use responsive float utility to add float on desktop (will not float on mobile), choose from "start" (left) or "end" (right)
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{%- if include.objectid contains '/' -%}
|
||||||
|
{%- capture src -%}{{ include.objectid | relative_url }}{% endcapture %}
|
||||||
|
{%- capture alt -%}{{ include.alt | default: include.title }}{% endcapture %}
|
||||||
|
{%- elsif include.objectid -%}
|
||||||
|
{%- assign item = site.data[site.metadata] | where: "objectid", include.objectid | first -%}
|
||||||
|
{%- capture src -%}{{ item.image_small | default: item.object_location | relative_url }}{% endcapture %}
|
||||||
|
{%- capture alt -%}{{ item.image_alt_text | default: item.description | default: item.title }}{% endcapture %}
|
||||||
|
{%- endif -%}
|
||||||
|
<div class="narrow-content">
|
||||||
|
<div class="card mb-3{% if include.float %} feature-float-{{ include.float }}{% endif %}{% if include.width %} feature-w-{{ include.width }}{% endif %}{% if include.centered %} mx-auto{% endif %}">
|
||||||
|
{% if src %}<img class="card-img-top" src="{{ src }}" alt="{{ alt | escape }}">{%- endif -%}
|
||||||
|
{% if include.header %}<{{ include.heading_level | default: 'h2' | strip }} class="card-header">{{ include.header }}</{{ include.heading_level | default: 'h2' | strip }}>{%- endif -%}
|
||||||
|
<div class="card-body">
|
||||||
|
{% if include.title %}<{{ include.heading_level | default: 'h2' | strip }} class="card-title">{{ include.title }}</{{ include.heading_level | default: 'h2' | strip }}>{%- endif -%}
|
||||||
|
<div class="card-text">{{ include.text | markdownify }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
19
_includes/feature/cloud.html
Normal file
19
_includes/feature/cloud.html
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Term cloud.
|
||||||
|
This include adds a word cloud feature based on one more metadata fields. Cloud will work best with multi-value (separated by semicolon ; ) controlled vocab type fields, such as "subject".
|
||||||
|
|
||||||
|
E.G. --> {% include feature/cloud.html fields="subject;creator" min=2 %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "fields" = one or more metadata fields to include in the cloud. (required)
|
||||||
|
- "min" = minimum number of times a term must appear in metadata to be displayed. Too many terms will increase load time and size of element. (optional, default 1)
|
||||||
|
- "stopwords" = words to remove from cloud terms (optional)
|
||||||
|
- "shuffle" = if "true" terms will be shuffled in random order (optional, default is alphabetical)
|
||||||
|
- "background" = change the background to a different a bootstrap color (primary, secondary, success, danger, warning, info, light, dark)
|
||||||
|
- "button" = change the button to a different a bootstrap button option (primary, secondary, success, danger, warning, info, light, dark, outline-primary, outline-secondary, outline-success, outline-danger, outline-warning, outline-info, outline-light, outline-dark)
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{% assign cloud_id = "cloud-div-" | append: include.fields | slugify %}
|
||||||
|
<div id="{{ cloud_id }}" class="text-center my-4 bg-{{ include.background | default: 'light' }} border rounded p-2"></div>
|
||||||
|
{% include js/cloud-js.html id=cloud_id fields=include.fields min=include.min stopwords=include.stopwords shuffle=include.shuffle button=include.button %}
|
||||||
22
_includes/feature/collapse.html
Normal file
22
_includes/feature/collapse.html
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Bootstrap collapse feature, https://getbootstrap.com/docs/5.3/components/collapse/
|
||||||
|
|
||||||
|
e.g. --> {% include feature/collapse.html button="Learn More" color="success" text="Such an interesting story!" %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "button" = text of the button that triggers the collapse to open (required)
|
||||||
|
- "text" = text inside the collapse, Markdown is supported (required, hint: use a capture statement to add more complex text!)
|
||||||
|
- "color" = color for the trigger button (optional, default: primary)
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<p>
|
||||||
|
<button class="btn btn-{{ include.color | default: 'primary' }}" type="button" data-bs-toggle="collapse" data-bs-target="#collapse{{ include.button | slugify }}" aria-expanded="false" aria-controls="collapse{{ include.button | slugify }}">
|
||||||
|
{{ include.button }}
|
||||||
|
</button>
|
||||||
|
</p>
|
||||||
|
<div class="collapse narrow-content mb-3" id="collapse{{ include.button | slugify }}">
|
||||||
|
<div class="card card-body">
|
||||||
|
{{ include.text | markdownify }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
73
_includes/feature/gallery.html
Normal file
73
_includes/feature/gallery.html
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
{% comment %}
|
||||||
|
Gallery, grid of images to be used as it's own page or within an about page.
|
||||||
|
|
||||||
|
E.G. --> (3 examples below)
|
||||||
|
|
||||||
|
{% include feature/gallery.html image-heading="demo_008" heading="Items after 1900" captions=false filter="item.date > '1900'" %}
|
||||||
|
|
||||||
|
{% include feature/gallery.html heading="All the Videos" child-objects=true gallery-type="video" %}
|
||||||
|
|
||||||
|
{% include feature/gallery.html image-heading="demo_018" heading="Items that have the subject postcard and are in Spokane" context="This uses a complex liquid filter to specify specif items." filter="item.subject contains 'postcard' and item.location contains 'Spokane'" %}
|
||||||
|
|
||||||
|
*Note that filters are CASE-SENSITIVE so if you're constructing one, either using the filter itself or the filter-field and filter-value you will need to match the case of the string search. this is unlike our browse page.*
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "filter" = logic statement (in the templating language liquid -- non liquid option indented below) that filters out most of the collection to display only select items. The first part of the statement must start with an "item." and then the category you'd like filtered, followed by an operator (https://shopify.github.io/liquid/basics/operators/) and the string or value you'd like to filter by e.g. "item.date contains '2019'".
|
||||||
|
If needed you can use the below options to construct a filter statement
|
||||||
|
- "filter-field" = the metadata field by which you'd like to filter items in your collection. i.e. title, subject, date, etc.
|
||||||
|
- "filter-value" = logic statement (in liquid) that filters out most of the collection to display only select items.
|
||||||
|
- "heading" = the heading text above the gallery (optional)
|
||||||
|
- "image-heading" = one objectid for a photo object in this collection, a relative path to an image in this project, or a full url to any image. This will include a feature/jumbotron.html includes at the top of the gallery
|
||||||
|
- "context" = a paragraph explanation of the gallery contents (optional)
|
||||||
|
- "caption" = If you don't want captions for your items, add --> captions=false with no quotations. Captions are on by default
|
||||||
|
- "item-size" = tiny, small, medium, large; default is medium, which is 3 items per row on a laptop screen size.
|
||||||
|
- "gallery-type" = this will determine how the items appear, so choosing 'video' will cause the gallery to display all items as embedded videos options: image, video, pdf, audio. Default is "image" (optional)
|
||||||
|
- container-styles = adds css classes to allow you to style the container in which the gallery appears, e.g. "w-75 mx-auto"
|
||||||
|
- item-styles = adds css classes to allow you to style the container in which the individual items appears, e.g. "card py-3"
|
||||||
|
- "image-size" - will adjust the size of the images used in the gallery, options: original, small, thumb. Default is "small" (optional)
|
||||||
|
- "child-objects" = include child items in count or only parents, true or false (optional, default false)
|
||||||
|
- "limit" will limit the number of items featured to the number included, default 50 (optional)
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
|
||||||
|
{% if include.child-objects == true %}
|
||||||
|
{%- assign gallery-items = site.data[site.metadata] | where_exp: 'item','item.objectid' -%}
|
||||||
|
{% else %}
|
||||||
|
{%- assign gallery-items = site.data[site.metadata] | where_exp: 'item','item.objectid and item.parentid == nil' -%}
|
||||||
|
{% endif %}
|
||||||
|
{% if include.gallery-type %}
|
||||||
|
{%- assign gallery-items = gallery-items | where_exp: "item","item.display_template == include.gallery-type" -%}
|
||||||
|
{% else %}
|
||||||
|
{%- assign gallery-items = gallery-items | where_exp: "item","item.image_small != nil or item.image_thumb != nil" -%}
|
||||||
|
{% endif %}
|
||||||
|
{%- if include.filter-field and include.filter-value -%}
|
||||||
|
{%- assign gallery-items = gallery-items | where_exp: 'item','item[include.filter-field] contains include.filter-value' -%}
|
||||||
|
{%- elsif include.filter -%}
|
||||||
|
{%- assign gallery-items = gallery-items | where_exp: 'item',include.filter -%}
|
||||||
|
{% endif %}
|
||||||
|
{% assign gallery-limit = include.limit | default: 50 %}
|
||||||
|
{% capture captions %}{{ include.captions | default: "true" }}{% endcapture %}
|
||||||
|
|
||||||
|
|
||||||
|
{% if include.image-heading and include.heading%}
|
||||||
|
{% include feature/jumbotron.html objectid=include.image-heading heading=include.heading text=false padding="5rem" %}
|
||||||
|
{% elsif include.image-heading %}
|
||||||
|
{% include feature/jumbotron.html objectid=include.image-heading %}
|
||||||
|
{% elsif include.heading %}
|
||||||
|
<h2>{{ include.heading }}</h2>{% endif %}
|
||||||
|
<div class="row my-3 py-3 {{ include.container-styles }}">
|
||||||
|
{% if include.context %}<p> {{include.context}} </p>{% endif %}
|
||||||
|
{% for item in gallery-items limit:gallery-limit %}
|
||||||
|
<div class="{% if include.item-size == 'tiny' %}col-lg-2 col-sm-4 col-xs-6{% elsif include.item-size == 'small' %}col-lg-3 col-sm-6{% elsif include.item-size == 'large' %}col-xl-4 col-lg-6{% else %}col-lg-4 col-sm-6{% endif %} {{ include.item-styles }}">
|
||||||
|
{% if include.gallery-type == "video" %}
|
||||||
|
{% include feature/video.html objectid=item.objectid caption=include.captions %}
|
||||||
|
{% elsif include.gallery-type == "pdf" %}
|
||||||
|
{% include feature/pdf.html objectid=item.objectid caption=include.captions %}
|
||||||
|
{% elsif include.gallery-type == "audio" %}
|
||||||
|
{% include feature/audio.html objectid=item.objectid caption=include.captions %}
|
||||||
|
{% else %}
|
||||||
|
{% include feature/image.html objectid=item.objectid caption=include.captions %}{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
15
_includes/feature/icon.html
Normal file
15
_includes/feature/icon.html
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{%- comment -%}
|
||||||
|
|
||||||
|
Bootstrap Icons, https://icons.getbootstrap.com/
|
||||||
|
|
||||||
|
This include adds a bootstrap icon using the SVG Sprite approach. This works similar to Icon Fonts. The svg will inherit font size and color from the parent, so can be used with other text.
|
||||||
|
|
||||||
|
E.G. --> {% include feature/icon.html icon="file-play" label="Audio file" %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "icon" = a Bootstrap Icon name, e.g. "file-image", "file-play"
|
||||||
|
- "label" = a label for accessibility (optional)
|
||||||
|
- "class" = extra classes to add directly to the svg element (optional)
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<svg class="bi icon-sprite {% if include.class %}{{ include.class }}{% endif %}" {% if include.label %}role="img" aria-label="{{ include.label | escape }}"{% else %}aria-hidden="true"{% endif %}><use xlink:href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/icons/bootstrap-icons.svg#{{ include.icon }}" href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/icons/bootstrap-icons.svg#{{ include.icon }}"></use></svg>
|
||||||
50
_includes/feature/image.html
Normal file
50
_includes/feature/image.html
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Image embed from an item's objectid or external link.
|
||||||
|
This include adds a figure to the page styled using bootstrap, https://getbootstrap.com/docs/5.1/content/figures/
|
||||||
|
|
||||||
|
It requires an "objectid" with the include, which is used to find the object title and image (for collection items). If multiple collection objectids are included (separated by ; ), they will be added to a "col-md" in a row which will automatically divided equally.
|
||||||
|
Alternatively, a URL to an external image can be used in "objectid".
|
||||||
|
|
||||||
|
E.G. --> {% include feature/image.html objectid="demo_001" %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "objectid" = several options below (required)
|
||||||
|
1. one or more objectids from this collection, separated by semicolon, e.g. "demo_001" or "demo_001;demo_005"
|
||||||
|
2. a full URL to an external image file, e.g. "https://www.lib.uidaho.edu/digital/images/fluffyclouds.jpg"
|
||||||
|
3. a relative link to an image file stored in this repository (that is not included in the collection), i.e. "/assets/img/evan.jpg"
|
||||||
|
IMPORTANT NOTE: Options 2 and 3 require you to add an "alt" option (or "alt" options for multiple images) in order to allow for the accessibility enabled by the "alt" tag
|
||||||
|
- "alt" = alternative text describing the image. This is a required accessibility feature IF you are using an external URL or a relative link (options 2 and 3 above)--it will be automatically filled if providing an objectid. For multiple alts, split using a semi-colon. If you do not fill this in but fill in the "caption" option, the "caption" will be included as the images alt value. (optional)
|
||||||
|
- "caption" = for option 1 above, the figure include automatically adds the title of the item from your metadata. The caption option allows you to manually add a different caption for that option, or give the value false ('caption=false' - no quotes around false) for none. For options 2 and 3, captions will only be added if the caption variable is set. For multiple images of any option, you can also use multiple captions, by splitting them with a semi-colons (optional)
|
||||||
|
- "link" = for option 1 above, the figure include automatically links to the item from your metadata. The link option allows you to manually add a different link for that image. For options 2 and 3, link will only be added if the link variable is set; otherwise, the link will be set to the external or relative image file. For multiple images of any option, you can also use multiple links, by splitting them with a semi-colons (optional)
|
||||||
|
- "width" = will use responsive sizing to set the % size on desktop (will be 100% on mobile), choose from "25", "50", "75", or "100" (optional)
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{%- assign figures = include.objectid | split: ";" %}
|
||||||
|
{%- assign figcount = figures | size -%}
|
||||||
|
{%- assign captions = include.caption | split: ";" %}
|
||||||
|
{%- assign alts = include.alt | split: ";" -%}
|
||||||
|
{%- assign links = include.link | split: ";" -%}
|
||||||
|
<div class="row feature-include">
|
||||||
|
{% for i in figures %}
|
||||||
|
{% if i contains "/" %}
|
||||||
|
{%- capture image_src -%}{{ i | relative_url }}{%- endcapture -%}
|
||||||
|
{%- capture image_caption -%}{{ captions[forloop.index0] }}{%- endcapture -%}
|
||||||
|
{%- capture image_alt -%}{{ alts[forloop.index0] }}{%- endcapture -%}
|
||||||
|
{%- capture image_link -%}{{ links[forloop.index0] | default: image_src }}{%- endcapture -%}
|
||||||
|
{% else %}
|
||||||
|
{%- assign figure = site.data[site.metadata] | where: "objectid", i | first -%}
|
||||||
|
{%- capture image_link -%}{{ '/items/' | relative_url }}{% if figure.parentid %}{{ figure.parentid }}.html#{{ figure.objectid }}{% else %}{{ figure.objectid }}.html{% endif %}{% endcapture %}
|
||||||
|
{%- capture image_caption -%}{{ captions[forloop.index0] | default: figure.title }}{%- endcapture -%}
|
||||||
|
{%- capture image_alt -%}{{ alts[forloop.index0] | default: figure.image_alt_text | default: figure.description | default: figure.title }}{%- endcapture -%}
|
||||||
|
{%- capture image_src -%}{{ figure.image_small | default: figure.object_location | relative_url }}{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
<div class="col-md {% if figcount == 1 %}{% elsif forloop.first %}text-md-end{% elsif forloop.last %}text-md-start{% else %}text-center{% endif %}">
|
||||||
|
<figure class="figure {% if include.width %}feature-w-{{ include.width }}{% endif %}">
|
||||||
|
<a href="{{ image_link | default: image_src }}">
|
||||||
|
<img class="figure-img img-fluid rounded lazyload w-100" alt="{{ image_alt | default: image_caption | escape }}" title="click to see item" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 3 2'%3E%3C/svg%3E" data-src="{{ image_src }}" >
|
||||||
|
</a>
|
||||||
|
{% unless include.caption == false %}<figcaption class="figure-caption text-center">{% if i contains "/" %}{{ image_caption }}{% else %}<a href="{{ image_link }}">{{ image_caption }}</a>{% endif %}</figcaption>{% endunless %}
|
||||||
|
</figure>
|
||||||
|
</div>{% endfor %}
|
||||||
|
</div>
|
||||||
63
_includes/feature/jumbotron.html
Normal file
63
_includes/feature/jumbotron.html
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Bootstrap Jumbotron, https://getbootstrap.com/docs/5.1/examples/jumbotron/
|
||||||
|
This include adds a Jumbotron feature from an objectid.
|
||||||
|
|
||||||
|
E.G. --> {% include feature/jumbotron.html objectid="demo_001" %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "objectid" = one objectid for a photo object in this collection, a relative path to an image in this project, or a full url to any image. If left blank, by default this the image will be the featured-image set in theme.yml.
|
||||||
|
- "position" = set background-position, "center", "top", "bottom"
|
||||||
|
- "heading" = major heading to display. By default this will be the site title. Give the value false for no heading.
|
||||||
|
- "text" = paragraph text below heading. By default this will be the site tagline. Give the value false for no text.
|
||||||
|
- "padding" = additional padding added to the feature to increase size. Give value in em or px, e.g. "5em".
|
||||||
|
- "heading_level" = customize the level of the heading if necessary for accessibility, choose "h1", "h2", "h3", etc (optional, default "h2")
|
||||||
|
|
||||||
|
Note: if using a YouTube item and an error image appears, the video may not have a "maxresdefault" image available. Replace "maxresdefault.jpg" in the code below with "hqdefault.jpg"
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{% assign jumbo_div_id = "j-" | append: include.objectid | slugify | truncate: 12, "" %}
|
||||||
|
{% assign jumboId = include.objectid | default: site.data.featured_item.src %}
|
||||||
|
{% if jumboId contains '/' %}
|
||||||
|
{% assign jumboSrc = jumboId | relative_url %}
|
||||||
|
{% else %}
|
||||||
|
{% assign jumboItem = site.data[site.metadata] | where: "objectid", jumboId | first %}
|
||||||
|
{% capture jumboSrc %}{{ jumboItem.object_location | default: jumboItem.image_small | relative_url }}{% endcapture %}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.jumbotron {
|
||||||
|
padding: 4rem 2rem;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
background-color: #e9ecef;
|
||||||
|
border-radius: 0.3rem;
|
||||||
|
}
|
||||||
|
#{{ jumbo_div_id }} {
|
||||||
|
background-image: url({{ jumboSrc }});
|
||||||
|
background-size: cover;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: {{ include.position | default: 'center' }};
|
||||||
|
}
|
||||||
|
{% if include.padding %}
|
||||||
|
.jumbo-title-box {
|
||||||
|
padding-top: {{ include.padding }};
|
||||||
|
padding-bottom: {{ include.padding }};
|
||||||
|
}
|
||||||
|
{%- endif -%}
|
||||||
|
@media screen and (max-width: 576px) {
|
||||||
|
.jumbo-title-box {
|
||||||
|
max-height: 500px;
|
||||||
|
}
|
||||||
|
.jumbo-tagline { font-size:.85em; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div class="jumbotron feature px-0 border" id="{{ jumbo_div_id }}">
|
||||||
|
<div class="jumbo-title-box">
|
||||||
|
{% unless include.heading == false and include.text == false %}
|
||||||
|
<div class="p-2 text-center text-white bg-dark bg-opacity-75">
|
||||||
|
{% unless include.heading == false %}<{{ include.heading_level | default: 'h2' | strip }} class="display-4">{{ include.heading | default: site.title }}</{{ include.heading_level | default: 'h2' | strip }}>{% endunless %}
|
||||||
|
{% unless include.text == false %}<p class="jumbo-tagline">{{ include.text | default: site.tagline }}</p>{% endunless %}
|
||||||
|
</div>
|
||||||
|
{% endunless %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
67
_includes/feature/mini-map.html
Normal file
67
_includes/feature/mini-map.html
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Mini Leaflet Map item feature.
|
||||||
|
This include adds a small leaflet map.
|
||||||
|
|
||||||
|
E.G> --> {% include feature/mini-map.html latitude="46.725562" longitude="-117.009633" %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "objectid" = feature a specific item from your metadata that has lat long. Using this option will set the map center and add a single marker to the map.
|
||||||
|
- "latitude" = center of map, required if not using objectid
|
||||||
|
- "longitude" = center of map, required if not using objectid
|
||||||
|
- "height" = height of the mini map in px (default 400px)
|
||||||
|
- "map-zoom" = provide a zoom level, default 10
|
||||||
|
- "map-link" = true/false, add a button link to the collection's default full map page (default false)
|
||||||
|
- "basemap" = set basemap option, Esri_WorldStreetMap, Esri_NatGeoWorldMap, Esri_WorldImagery. default Esri_WorldImagery.
|
||||||
|
|
||||||
|
{% endcomment %}
|
||||||
|
{% capture map_id %}mini-map_{{ include.latitude | slugify }}{% endcapture %}
|
||||||
|
{% assign map-item = site.data[site.metadata] | where: "objectid", include.objectid | first %}
|
||||||
|
<style>
|
||||||
|
#{{ map_id }} { height: {{ include.height | default: '400px' }}; z-index: 98; }
|
||||||
|
</style>
|
||||||
|
<div id="{{ map_id }}"></div>
|
||||||
|
{% if include.map-link == true %}
|
||||||
|
<a href="{{ '/map.html' | relative_url }}?location={{ map-item.latitude | default: include.latitude }},{{ map-item.longitude | default: include.longitude }}{%if include.objectid %}&marker={{ include.objectid }}{% endif %}" class="btn btn-outline-primary my-3">View on Full Map</a>{% endif %}
|
||||||
|
<!-- load leaflet dependencies -->
|
||||||
|
<link rel="stylesheet" href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/leaflet/leaflet.css">
|
||||||
|
<link rel="stylesheet" href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/leaflet/leaflet.fullscreen.css">
|
||||||
|
<script src="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/leaflet/leaflet.js"></script>
|
||||||
|
<script src="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/leaflet/Leaflet.fullscreen.min.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// initial start point
|
||||||
|
var mapCenter = [{{ map-item.latitude | default: include.latitude }}, {{ map-item.longitude | default: include.longitude }}];
|
||||||
|
var mapZoom = {{ include.map-zoom | default: 10 }};
|
||||||
|
/* init map, set center and zoom */
|
||||||
|
var map = L.map('{{ map_id }}').setView(mapCenter, mapZoom);
|
||||||
|
|
||||||
|
/* add map layer options */
|
||||||
|
var Esri_WorldStreetMap = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}', {
|
||||||
|
attribution: 'Tiles © Esri — Source: Esri, DeLorme, NAVTEQ, USGS, Intermap, iPC, NRCAN, Esri Japan, METI, Esri China (Hong Kong), Esri (Thailand), TomTom, 2012'
|
||||||
|
});
|
||||||
|
var Esri_NatGeoWorldMap = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}', {
|
||||||
|
attribution: 'Tiles © Esri — National Geographic, Esri, DeLorme, NAVTEQ, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, iPC',
|
||||||
|
maxZoom: 16
|
||||||
|
});
|
||||||
|
var Esri_WorldImagery = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {
|
||||||
|
attribution: 'Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community'
|
||||||
|
});
|
||||||
|
/* add base map switcher */
|
||||||
|
var baseMaps = {
|
||||||
|
"Esri World StreetMap": Esri_WorldStreetMap,
|
||||||
|
"Esri National Geo": Esri_NatGeoWorldMap,
|
||||||
|
"Esri Imagery": Esri_WorldImagery
|
||||||
|
};
|
||||||
|
L.control.layers(baseMaps).addTo(map);
|
||||||
|
/* load base map */
|
||||||
|
{{ include.basemap | default: 'Esri_WorldImagery' }}.addTo(map);
|
||||||
|
/* add fullscreen control */
|
||||||
|
map.addControl(new L.Control.Fullscreen());
|
||||||
|
|
||||||
|
{% if include.objectid %}
|
||||||
|
/* add marker */
|
||||||
|
L.marker(mapCenter).addTo(map)
|
||||||
|
.bindPopup('{{ map-item.title | escape }}');{% endif %}
|
||||||
|
|
||||||
|
</script>
|
||||||
31
_includes/feature/modal.html
Normal file
31
_includes/feature/modal.html
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Bootstrap Modal, https://getbootstrap.com/docs/5.1/components/modal/
|
||||||
|
|
||||||
|
E.G. --> {% include feature/modal.html button="More Info" color="info" title="Information" text="Example text" %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "button" = text of button to trigger modal
|
||||||
|
- "color" = color of modal button (primary, secondary, success, danger, warning, info, light, dark)
|
||||||
|
- "title" = header text for modal pop up
|
||||||
|
- "text" = body text for modal pop up, can use markdown formatting (tip: use a Liquid capture to add more complex content)
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<!-- Button trigger modal -->
|
||||||
|
<p class="text-center mb-3">
|
||||||
|
<button type="button" class="btn btn-{{ include.color | default: 'primary' }}" data-bs-toggle="modal" data-bs-target="#{{ include.button | slugify }}Modal">{{ include.button }}</button>
|
||||||
|
</p>
|
||||||
|
<!-- Modal -->
|
||||||
|
<div class="modal fade" id="{{ include.button | slugify }}Modal" tabindex="-1" role="dialog" aria-labelledby="{{ include.button | slugify }}ModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h1 class="modal-title" id="{{ include.button | slugify }}ModalLabel">{{ include.title }}</h1>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body" >
|
||||||
|
{{ include.text | markdownify }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
17
_includes/feature/nav-menu.html
Normal file
17
_includes/feature/nav-menu.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
About Page Nav Menu include,
|
||||||
|
add a basic nav at top of About page.
|
||||||
|
|
||||||
|
E.G. --> {% include feature/nav-menu.html sections="Background;Timeline;More Information" %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "sections" = headers to be added to the nav separated by semicolon (;), exactly copy text from any header written in markdown on the page (i.e. ## Example header)
|
||||||
|
|
||||||
|
Note: styling in _sass/_pages.scss adds 100px margin to top of h2 on the about page to accommodate the sticky-top option of this element. If you add headers other than h2 to this nav, they will likely overlap under the element when jumping to the section. Similarly, if more than a handful of sections or long section titles are added, the box will overlap the headers when jumping. Modify the spacing in the scss, or remove the "sticky-top" class to fix.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{% assign sections = include.sections | split: ';'%}
|
||||||
|
<p class="h6 shadow-sm p-3 about-nav sticky-top bg-white">
|
||||||
|
Contents: {% for section in sections %}<a class="mx-2" href="#{{ section | slugify }}">{{ section }}</a> {% unless forloop.last %}| {% endunless %}{% endfor %}{% if page.credits == true %}| <a class="mx-2" href="#technical">Tech</a>{% endif %}
|
||||||
|
</p>
|
||||||
43
_includes/feature/pdf.html
Normal file
43
_includes/feature/pdf.html
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Item PDF embed from objectid or external link.
|
||||||
|
This include adds a PDF embed to the page using html5 "object" element.
|
||||||
|
|
||||||
|
E.G. --> {% include feature/pdf.html objectid="demo_002" %}
|
||||||
|
|
||||||
|
It requires an "objectid" with the include, which is used to find the object details. Alternatively, a URL to an external pdf can be used in "objectid".
|
||||||
|
By default no height is necessary as it uses 1x1 Bootstrap ratio style, https://getbootstrap.com/docs/5.1/helpers/ratio/
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "objectid" = several options below (required)
|
||||||
|
1. an objectid of a PDF item in this collection, e.g. "demo_004"
|
||||||
|
2. an external link to a PDF file hosted elsewhere, e.g. "https://www.lib.uidaho.edu/digital/pdfs/cloudtypes.pdf"
|
||||||
|
3. a relative link to a PDF file somewhere else in this repository, e.g. "/assets/pdfs/sometrees.pdf"
|
||||||
|
- "caption" = by default the figure include automatically adds the title of the item from your metadata. The caption option allows you to manually add a different caption, or give the value false for none. (optional)
|
||||||
|
- "width" = will use responsive sizing to set the % size on desktop (will be 100% on mobile), choose from "25", "50", "75", or "100" (optional)
|
||||||
|
- "height" = set embed object height in px (rather than responsive size), e.g. "800px" (optional)
|
||||||
|
- "ratio" = use Bootstrap embed ratio options "21x9", "16x9", "4x3", or "1x1" to customize the responsive aspect ratio if not using height. 1x1 is default. (optional)
|
||||||
|
|
||||||
|
Note: if you have issues make sure the item is a PDF file!
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{% if include.objectid contains "/" %}
|
||||||
|
{%- capture src -%}{{ include.objectid | relative_url }}{%- endcapture -%}
|
||||||
|
{%- capture pdf_link -%}{{ src }}{%- endcapture -%}
|
||||||
|
{%- capture pdf_caption -%}{{ include.caption }}{%- endcapture -%}
|
||||||
|
{% else %}
|
||||||
|
{%- assign item = site.data[site.metadata] | where: "objectid", include.objectid | first -%}
|
||||||
|
{%- capture src -%}{{ item.object_location | relative_url }}{% endcapture %}
|
||||||
|
{%- capture pdf_link -%}{{ '/items/' | relative_url }}{% if item.parentid %}{{ item.parentid }}.html#{{ item.objectid }}{% else %}{{ item.objectid }}.html{% endif %}{%- endcapture -%}
|
||||||
|
{%- capture pdf_caption -%}{% if include.caption %}{{ include.caption }}{% else %}{{ item.title }}{% endif %}{%- endcapture -%}
|
||||||
|
{% endif %}
|
||||||
|
<div class="feature-include">
|
||||||
|
<figure class="figure border rounded p-1 feature-w-{{ include.width | default: '100' }}">
|
||||||
|
<div class="{% unless include.height %}ratio ratio-{{ include.ratio | default: '1x1' }}{% endunless %}">
|
||||||
|
<object aria-label="pdf embed of {{ pdf_caption | escape }}" {% if include.height %}width="100%" height="{{ include.height }}"{% endif %} data="{{ src }}">
|
||||||
|
<p>The PDF is not rendering in your browser. Please <a href="{{ src }}">download the PDF</a> to view.</p>
|
||||||
|
</object>
|
||||||
|
</div>
|
||||||
|
{% unless include.caption == false %}<figcaption class="figure-caption text-center"><a href="{{ pdf_link }}">{{ pdf_caption }}</a></figcaption>{% endunless %}
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
31
_includes/feature/timelinejs.html
Normal file
31
_includes/feature/timelinejs.html
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Embed a TimelineJS feature, https://timeline.knightlab.com/
|
||||||
|
|
||||||
|
E.G. --> {% include feature/timelinejs.html %}
|
||||||
|
|
||||||
|
Embeds a TimelineJS built from a JSON file appropriate for any CollectionBuilder page (such as Home or About page).
|
||||||
|
CB templates automatically generate a timelinejs json file in "assets/data/timelinejs.json" including all items in metadata with a value in "date" field.
|
||||||
|
By default, this include uses this json file.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "json" = (optional) path or link to timelinejs json file.
|
||||||
|
|
||||||
|
{% endcomment %}
|
||||||
|
{%- assign json = include.json | default: '/assets/data/timelinejs.json' | relative_url -%}
|
||||||
|
<!-- timelinejs, https://timeline.knightlab.com/ -->
|
||||||
|
<link title="timeline-styles" rel="stylesheet" href="https://cdn.knightlab.com/libs/timeline3/latest/css/timeline.css">
|
||||||
|
|
||||||
|
<div id="timeline-embed" style="width: 100%; height: 800px" class="mb-4"></div>
|
||||||
|
|
||||||
|
<script src="https://cdn.knightlab.com/libs/timeline3/latest/js/timeline.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
// The TL.Timeline constructor takes at least two arguments:
|
||||||
|
// the id of the Timeline container (no '#'), and
|
||||||
|
// the URL to your JSON data file or Google spreadsheet.
|
||||||
|
// the id must refer to an element "above" this code,
|
||||||
|
// and the element must have CSS styling to give it width and height
|
||||||
|
// optionally, a third argument with configuration options can be passed.
|
||||||
|
// See below for more about options.
|
||||||
|
timeline = new TL.Timeline('timeline-embed', '{{ json }}');
|
||||||
|
</script>
|
||||||
128
_includes/feature/video-modal.html
Normal file
128
_includes/feature/video-modal.html
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Video modal feature from an item's objectid or external link.
|
||||||
|
This include adds a card featuring the thumb image, title, and description of a video--when clicked it opens a modal containing the video embed. The modal displays video information, transcript, link to item. This is especially useful feature if you would like multiple videos on one page.
|
||||||
|
|
||||||
|
E.G. --> {% include feature/video-modal.html objectid="demo_004" %}
|
||||||
|
|
||||||
|
It requires an "objectid" with the include, which is used to find the video details. Alternatively, a URL to an external video can be used in "objectid".
|
||||||
|
YouTube and Vimeo items will use iframe embeds, video files use html video element.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "objectid" = several options below (required)
|
||||||
|
1. an objectid of a video item in this collection, e.g. "demo_003"
|
||||||
|
2. a full URL to a video hosted on YouTube, e.g. https://youtu.be/dbKNr3wuiuQ
|
||||||
|
3. a full URL to a video hosted on Vimeo, e.g. https://vimeo.com/464555587
|
||||||
|
4. a full URL to an external video file (supported by browsers, generally mp4), e.g. "https://www.lib.uidaho.edu/digital/videos/fluffyclouds.mp4"
|
||||||
|
5. a relative link to a video file stored in this repository (that is not included in the collection), i.e. "/assets/videos/cloudyskies.mp4"
|
||||||
|
- "title" = by default automatically adds the title from item metadata, which will be used for the card and modal title. Manually set by using the title option. (optional)
|
||||||
|
- "heading_level" = customize the level of the card heading if necessary for accessibility, choose "h1", "h2", "h3", etc (optional, default "h2")
|
||||||
|
- "caption" = by default the include automatically adds the description of the item from your metadata. The caption option allows you to manually add a different caption, or give the value false for none. (optional)
|
||||||
|
- "transcript" = by default if using an objectid, if the item has a object_transcript value, the view transcript button will automatically be added. The transcript option allows you to manually add a different transcript or provide one for non-collection videos. (optional)
|
||||||
|
- "image" = by default if using an objectid, if the item has a image_small value, the image will be used on the card and as the poster for video file embeds (not youtube). The image option allows you to manually add a image for non-collection videos. Give "false" to have no image displayed on the card (optional)
|
||||||
|
- "ratio" = use Bootstrap embed ratio options "21x9", "16x9", "4x3", or "1x1" to customize the responsive aspect ratio. 16by9 is default. (optional)
|
||||||
|
|
||||||
|
Note: if you have issues make sure the item is a video item and a web friendly format
|
||||||
|
|
||||||
|
|
||||||
|
{% endcomment %}
|
||||||
|
{%- if include.objectid contains '/' -%}
|
||||||
|
{%- capture video_title -%}{{ include.title }}{%- endcapture -%}
|
||||||
|
{% capture video_caption %}{{ include.caption }}{% endcapture %}
|
||||||
|
{% capture video_poster %}{{ include.image }}{% endcapture %}
|
||||||
|
{% capture video_transcript %}{{ include.transcript }}{% endcapture %}
|
||||||
|
{% capture raw_src %}{{ include.objectid }}{% endcapture %}
|
||||||
|
{%- capture video_link -%}{{ raw_src | relative_url }}{%- endcapture -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- assign item = site.data[site.metadata] | where: "objectid", include.objectid | first -%}
|
||||||
|
{%- capture video_title -%}{% if include.title %}{{ include.title }}{% else %}{{ item.title }}{% endif %}{%- endcapture -%}
|
||||||
|
{% capture video_caption %}{% if include.caption %}{{ include.caption }}{% else %}{{ item.description }}{% endif %}{% endcapture %}
|
||||||
|
{% capture video_poster %}{{ include.image | default: item.image_small | default: '' }}{% endcapture %}
|
||||||
|
{% capture video_transcript %}{{ include.transcript | default: item.object_transcript }}{% endcapture %}
|
||||||
|
{% capture raw_src %}{{ item.object_location }}{% endcapture %}
|
||||||
|
{%- capture video_link -%}{{ '/items/' | relative_url }}{% if item.parentid %}{{ item.parentid }}.html#{{ item.objectid }}{% else %}{{ item.objectid }}.html{% endif %}{%- endcapture -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- if raw_src contains 'vimeo' -%}
|
||||||
|
{% assign vimeo_id = raw_src | split: '/' | last %}
|
||||||
|
{% capture video_src %}https://player.vimeo.com/video/{{ vimeo_id }}{% endcapture %}
|
||||||
|
{% assign video_type = 'vimeo' %}
|
||||||
|
{%- elsif raw_src contains 'youtu' -%}
|
||||||
|
{% assign youtube_id = raw_src | split: '/' | last %}
|
||||||
|
{% if youtube_id contains 'v=' %}{% assign youtube_id = youtube_id | split: 'v=' | last | split: '&' | first %}
|
||||||
|
{% elsif youtube_id contains '?' %}{% assign youtube_id = youtube_id | split: '?' | first %}{% endif %}
|
||||||
|
{% capture video_src %}https://www.youtube-nocookie.com/embed/{{ youtube_id }}?enablejsapi=1&rel=0&modestbranding=1{% endcapture %}
|
||||||
|
{% assign video_type = 'youtube' %}
|
||||||
|
{%- else -%}
|
||||||
|
{% assign video_src = raw_src | relative_url %}
|
||||||
|
{% assign video_type = 'video' %}
|
||||||
|
{%- endif -%}
|
||||||
|
{% capture includeid %}{% if include.objectid.size > 10 %}{{ include.objectid | slice: -10, 10 | slugify | replace: "-","_" }}{% else %}{{ include.objectid | slugify | replace: "-","_" }}{% endif %}{% endcapture %}
|
||||||
|
{% capture stop_media %}{% endcapture %}
|
||||||
|
<script>
|
||||||
|
function stopMedia{{ includeid }}() {
|
||||||
|
{% if video_type == 'youtube' %}const message = JSON.stringify({ event: 'command', func: 'pauseVideo', args: '' }); document.querySelector('#{{ includeid }}ModalVideo iframe').contentWindow.postMessage(message, '*');{% elsif video_type == 'vimeo' %}document.querySelector('#{{ includeid }}ModalVideo iframe').contentWindow.postMessage('{"method":"pause"}', '*');{% else %}document.querySelector('#{{ includeid }}ModalVideo video').pause();{% endif %}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<div class="card my-3 narrow-content">
|
||||||
|
{% if include.image != false and video_poster != '' %}<img src="{{ video_poster | relative_url }}" class="card-img-top" alt="{{ video_title | escape }}">{% endif %}
|
||||||
|
<div class="card-body text-center">
|
||||||
|
<{{ include.heading_level | default: 'h2' | strip }} class="card-title h2">{{ video_title }}</{{ include.heading_level | default: 'h2' | strip }}>
|
||||||
|
<p class="card-text">{{ video_caption }}</p>
|
||||||
|
<button class="btn btn-sm btn-primary stretched-link" type="button" data-bs-toggle="modal" data-bs-target="#{{ includeid }}Modal">
|
||||||
|
View Video
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi icon-sprite" viewBox="0 0 16 16">
|
||||||
|
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16"/>
|
||||||
|
<path d="M6.271 5.055a.5.5 0 0 1 .52.038l3.5 2.5a.5.5 0 0 1 0 .814l-3.5 2.5A.5.5 0 0 1 6 10.5v-5a.5.5 0 0 1 .271-.445"/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal fade" id="{{ includeid }}Modal" tabindex="-1" aria-labelledby="{{ includeid }}ModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
|
||||||
|
<div class="modal-dialog modal-lg modal-dialog-centered">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h1 class="modal-title fs-5" id="{{ includeid }}ModalLabel">{{ video_title }}</h1>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" onclick="stopMedia{{ includeid }}()"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<figure class="">
|
||||||
|
<div class="ratio ratio-{{ include.ratio | default: '16x9' }}" id="{{ includeid }}ModalVideo">
|
||||||
|
{%- if video_src contains "vimeo" or video_src contains "youtu" -%}
|
||||||
|
<iframe title="video embed {{ video_title | escape }}" src="{{ video_src }}" allowfullscreen></iframe>
|
||||||
|
{% else %}
|
||||||
|
<video {% if video_poster %}poster="{{ video_poster | relative_url }}"{% endif %} preload="metadata" controls>
|
||||||
|
<source src="{{ video_src }}">
|
||||||
|
Your browser does not support the video tag, please <a href="{{ video_link }}">download the file to watch</a>.
|
||||||
|
</video>
|
||||||
|
{%- endif -%}
|
||||||
|
</div>
|
||||||
|
{% unless include.caption == false %}
|
||||||
|
<figcaption class="figure-caption text-center">
|
||||||
|
{{ video_caption }}
|
||||||
|
</figcaption>
|
||||||
|
{% endunless %}
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
{% if video_transcript != '' %}
|
||||||
|
<div class="collapse mt-3 w-100" id="collapseTranscript{{ includeid }}">
|
||||||
|
<div class="card card-body text-start">
|
||||||
|
{% assign transcript_type = video_transcript | slice: 0,1 %}
|
||||||
|
{% if transcript_type == '/' %}
|
||||||
|
{% assign transcript_location = video_transcript | remove_first: '/' %}
|
||||||
|
{% assign transcript = site.pages | where: 'path', transcript_location | first %}
|
||||||
|
{{ transcript.content | markdownify }}
|
||||||
|
{% else %}
|
||||||
|
{{ video_transcript | markdownify }}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button class="btn btn-outline-primary m-2" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTranscript{{ includeid }}" aria-expanded="false" aria-controls="collapseTranscript{{ includeid }}">View Transcript</button>
|
||||||
|
{% endif %}
|
||||||
|
{% unless include.objectid contains '/' %}
|
||||||
|
<a href="{{ video_link }}" class="btn btn-outline-dark m-2">Visit Item Page</a>{% endunless %}
|
||||||
|
<button type="button" class="btn btn-dark" data-bs-dismiss="modal" onclick="stopMedia{{ includeid }}()">Close</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
84
_includes/feature/video.html
Normal file
84
_includes/feature/video.html
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Video embed from an item's objectid or external link.
|
||||||
|
This include adds a video embed to the page using Bootstrap ratio styles, https://getbootstrap.com/docs/5.1/helpers/ratio/
|
||||||
|
|
||||||
|
E.G. --> {% include feature/video.html objectid="demo_003" %}
|
||||||
|
|
||||||
|
It requires an "objectid" with the include, which is used to find the video details. Alternatively, a URL to an external video can be used in "objectid".
|
||||||
|
YouTube and Vimeo items will use iframe embeds, video files use html video element.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "objectid" = several options below (required)
|
||||||
|
1. an objectid of a video item in this collection, e.g. "demo_003"
|
||||||
|
2. a full URL to a video hosted on YouTube, e.g. https://youtu.be/dbKNr3wuiuQ
|
||||||
|
3. a full URL to a video hosted on Vimeo, e.g. https://vimeo.com/464555587
|
||||||
|
4. a full URL to an external video file (supported by browsers, generally mp4), e.g. "https://www.lib.uidaho.edu/digital/videos/fluffyclouds.mp4"
|
||||||
|
5. a relative link to a video file stored in this repository (that is not included in the collection), i.e. "/assets/videos/cloudyskies.mp4"
|
||||||
|
- "caption" = by default the include automatically adds the title of the item from your metadata. The caption option allows you to manually add a different caption, or give the value false for none. (optional)
|
||||||
|
- "transcript" = by default if using an objectid, if the item has a object_transcript value, the view transcript button will automatically be added. The transcript option allows you to manually add a different transcript or provide one for non-collection videos. (optional)
|
||||||
|
- "cover" = by default if using an objectid, if the item has a image_small value, the image will be used as the cover for video file embeds (not youtube). The cover option allows you to manually add a cover image for non-collection videos. (optional)
|
||||||
|
- "width" = will use responsive sizing to set the % size on desktop (will be 100% on mobile), choose from "25", "50", "75", or "100" (optional)
|
||||||
|
- "ratio" = use Bootstrap embed ratio options "21x9", "16x9", "4x3", or "1x1" to customize the responsive aspect ratio. 16by9 is default. (optional)
|
||||||
|
|
||||||
|
Note: if you have issues make sure the item is a video item and a web friendly format
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{%- if include.objectid contains '/' -%}
|
||||||
|
{% capture video_caption %}{{ include.caption }}{% endcapture %}
|
||||||
|
{% capture video_poster %}{{ include.cover }}{% endcapture %}
|
||||||
|
{% capture video_transcript %}{{ include.transcript }}{% endcapture %}
|
||||||
|
{% capture raw_src %}{{ include.objectid }}{% endcapture %}
|
||||||
|
{%- else -%}
|
||||||
|
{%- assign item = site.data[site.metadata] | where: "objectid", include.objectid | first -%}
|
||||||
|
{% capture video_caption %}{% if include.caption %}{{ include.caption }}{% else %}<a href="{{ '/items/' | relative_url }}{% if item.parentid %}{{ item.parentid }}.html#{{ item.objectid }}{% else %}{{ item.objectid }}.html{% endif %}">{{ item.title }}</a>{% endif %}{% endcapture %}
|
||||||
|
{% capture video_poster %}{{ include.cover | default: item.image_small | default: '' }}{% endcapture %}
|
||||||
|
{% capture video_transcript %}{{ include.transcript | default: item.object_transcript }}{% endcapture %}
|
||||||
|
{% capture raw_src %}{{ item.object_location }}{% endcapture %}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- if raw_src contains 'vimeo' -%}
|
||||||
|
{% assign vimeo_id = raw_src | split: '/' | last %}
|
||||||
|
{% capture video_src %}https://player.vimeo.com/video/{{ vimeo_id }}{% endcapture %}
|
||||||
|
{%- elsif raw_src contains 'youtu' -%}
|
||||||
|
{% assign youtube_id = raw_src | split: '/' | last %}
|
||||||
|
{% if youtube_id contains 'v=' %}{% assign youtube_id = youtube_id | split: 'v=' | last | split: '&' | first %}
|
||||||
|
{% elsif youtube_id contains '?' %}{% assign youtube_id = youtube_id | split: '?' | first %}{% endif %}
|
||||||
|
{% capture video_src %}https://www.youtube-nocookie.com/embed/{{ youtube_id }}?rel=0&modestbranding=1{% endcapture %}
|
||||||
|
{%- else -%}
|
||||||
|
{% assign video_src = raw_src | relative_url %}
|
||||||
|
{%- endif -%}
|
||||||
|
{% capture includeid %}{% if include.objectid.size > 8 %}{{ include.objectid | slice: -8, 8 | slugify }}{% else %}{{ include.objectid | slugify }}{% endif %}{% endcapture %}
|
||||||
|
<div class="feature-include my-4">
|
||||||
|
<figure class="{% if include.width %} feature-w-{{ include.width }}{% endif %}">
|
||||||
|
<div class="ratio ratio-{{ include.ratio | default: '16x9' }}">
|
||||||
|
{%- if video_src contains "vimeo" or video_src contains "youtu" -%}
|
||||||
|
<iframe title="video embed {{ video_caption | escape }}" src="{{ video_src }}" allowfullscreen></iframe>
|
||||||
|
{% else %}
|
||||||
|
<video {% if video_poster %}poster="{{ video_poster | relative_url }}"{% endif %} preload="metadata" controls>
|
||||||
|
<source src="{{ video_src }}">
|
||||||
|
Your browser does not support the video tag.
|
||||||
|
</video>
|
||||||
|
{%- endif -%}
|
||||||
|
</div>
|
||||||
|
{% unless include.caption == false %}
|
||||||
|
<figcaption class="figure-caption text-center">
|
||||||
|
{{ video_caption }}
|
||||||
|
{% if video_transcript != '' %}<br>
|
||||||
|
<button class="btn btn-sm btn-outline-secondary" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTranscript{{ includeid }}" aria-expanded="false" aria-controls="collapseTranscript{{ includeid }}">View Transcript</button>
|
||||||
|
<div class="collapse mt-3" id="collapseTranscript{{ includeid }}">
|
||||||
|
<div class="card card-body text-start">
|
||||||
|
{% assign transcript_type = video_transcript | slice: 0,1 %}
|
||||||
|
{% if transcript_type == '/' %}
|
||||||
|
{% assign transcript_location = video_transcript | remove_first: '/' %}
|
||||||
|
{% assign transcript = site.pages | where: 'path', transcript_location | first %}
|
||||||
|
{{ transcript.content | markdownify }}
|
||||||
|
{% else %}
|
||||||
|
{{ video_transcript | markdownify }}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</figcaption>
|
||||||
|
{% endunless %}
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
12
_includes/foot.html
Normal file
12
_includes/foot.html
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<!-- Bootstrap bundle JS -->
|
||||||
|
<script src="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/bootstrap.bundle.min.js"></script>
|
||||||
|
<!-- load other js -->
|
||||||
|
<script src="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/lazysizes.min.js" async></script>
|
||||||
|
{% if layout.gallery == true or page.gallery == true %}<script src="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/spotlight.bundle.js" defer></script>{% endif %}
|
||||||
|
{% if page.custom-foot or layout.custom-foot %}
|
||||||
|
{%- assign page_feet = page.custom-foot | split: ";" -%}
|
||||||
|
{%- assign layout_feet = layout.custom-foot | split: ";" -%}
|
||||||
|
{%- assign feet = page_feet | concat: layout_feet -%}
|
||||||
|
{% for f in feet %}{% include {{ f }} %}
|
||||||
|
{% endfor %}
|
||||||
|
{%- endif -%}
|
||||||
51
_includes/footer.html
Normal file
51
_includes/footer.html
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<footer class="bg-dark pt-4 mt-auto container-fluid">
|
||||||
|
|
||||||
|
<div class="row border-bottom border-white pb-4 mb-2">
|
||||||
|
|
||||||
|
<div class="col-md-7 px-4 mt-3">
|
||||||
|
|
||||||
|
<h2 class="h4"><a href="{{ '/' | relative_url }}" class="text-white">{{ site.title }}</a></h2>
|
||||||
|
<p class="text-white"><small>{{ site.description }}</small></p>
|
||||||
|
<nav>
|
||||||
|
<ul id="footer-nav" class="nav nav-pills ">
|
||||||
|
{%- assign navItems = site.data.config-nav | where_exp: 'item', 'item.dropdown_parent == nil' -%}
|
||||||
|
{% for nav in navItems %}
|
||||||
|
<li class="nav-item">
|
||||||
|
{% if nav.stub %}
|
||||||
|
<a class="nav-link text-light{% if page.url == nav.stub %} active{% endif %}" href="{{ nav.stub | relative_url }}">{{ nav.display_name }}</a>
|
||||||
|
{%- else -%}
|
||||||
|
{% assign childStub = site.data.config-nav | where_exp: 'item', 'item.dropdown_parent == nav.display_name' | first %}
|
||||||
|
<a class="nav-link text-light{% if page.url == childStub.stub %} active{% endif %}" href="{{ childStub.stub | relative_url }}">{{ nav.display_name }}</a>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{%- endfor -%}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-5 mt-3 text-center">
|
||||||
|
|
||||||
|
{% if site.organization-logo-nav %} <p class="text-md-end">
|
||||||
|
<a href="{{ site.organization-link }}">
|
||||||
|
<img id="footer-logo" class="img-fluid" src="{{ site.organization-logo-nav | relative_url }}" alt="{{ site.organization-name | escape }} home">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
<p class="text-white text-md-end" id="footer-credits">
|
||||||
|
<small><em>built with</em>
|
||||||
|
<a href="https://collectionbuilder.github.io/" title="CollectionBuilder">
|
||||||
|
<img src="{{ '/assets/img/collectionbuilder-logo.png' | relative_url }}" class="img-fluid" alt="CollectionBuilder" >
|
||||||
|
</a>
|
||||||
|
</small>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-12 text-center pt-3 pb-1">
|
||||||
|
<p class="text-white">Last updated {{ site.time | date: '%Y' }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</footer>
|
||||||
5
_includes/head/analytics.html
Normal file
5
_includes/head/analytics.html
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{% comment %}
|
||||||
|
Paste analytics code snippet here as provided by your platform (for example from Google Analytics or Matomo).
|
||||||
|
To avoid collecting stats from your development server, this code will be added to the head of every page ONLY during production build!
|
||||||
|
{% endcomment %}
|
||||||
|
<!-- Analytics -->
|
||||||
38
_includes/head/head.html
Normal file
38
_includes/head/head.html
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<title>{{ page.title | escape }} | {{ site.title | escape }}</title>
|
||||||
|
<link rel="shortcut icon" type="image/x-icon" href="{{ '/favicon.ico' | relative_url }}">
|
||||||
|
<!--
|
||||||
|
|
||||||
|
_____ ____ __ _ ___ _ __ __
|
||||||
|
/ ___/__ / / /__ ____/ /_(_)__ ___ / _ )__ __(_) /__/ /__ ____
|
||||||
|
/ /__/ _ \/ / / -_) __/ __/ / _ \/ _ \/ _ / // / / / _ / -_) __/
|
||||||
|
\___/\___/_/_/\__/\__/\__/_/\___/_//_/____/\_,_/_/_/\_,_/\__/_/
|
||||||
|
|
||||||
|
built with CollectionBuilder-CSV
|
||||||
|
https://github.com/CollectionBuilder/collectionbuilder-csv
|
||||||
|
-->
|
||||||
|
<meta name="generator" content="collectionbuilder-csv" />
|
||||||
|
<meta http-equiv="Content-Language" content="en-us" >
|
||||||
|
|
||||||
|
<!-- load style sheets -->
|
||||||
|
{% if site.data.theme.font-cdn %}{{ site.data.theme.font-cdn }}{%- endif -%}
|
||||||
|
<link rel="stylesheet" href="{% if site.data.theme.bootswatch %}https://cdn.jsdelivr.net/npm/bootswatch@5.3.8/dist/{{ site.data.theme.bootswatch }}/bootstrap.min.css{% else %}{{ site.lib-assets | default: '/assets/lib' | relative_url }}/bootstrap.min.css{% endif %}" type="text/css">
|
||||||
|
{% if page.layout == 'data' %}<link rel="stylesheet" type="text/css" href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/datatables/datatables.min.css">{%- endif -%}
|
||||||
|
{% if page.layout == 'map' %}<link rel="stylesheet" href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/leaflet/leaflet.css">
|
||||||
|
<link rel="stylesheet" href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/leaflet/leaflet.fullscreen.css">
|
||||||
|
{% if site.data.theme.map-search == true %}<link rel="stylesheet" href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/leaflet/leaflet.fusesearch.css">{%- endif -%}
|
||||||
|
{% if site.data.theme.map-cluster == true %}<link rel="stylesheet" href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/leaflet/MarkerCluster.css">
|
||||||
|
<link rel="stylesheet" href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/leaflet/MarkerCluster.Default.css">{% endif %}{%- endif -%}
|
||||||
|
<!-- load custom css last to allow overrides -->
|
||||||
|
<link rel="stylesheet" href="{{ '/assets/css/cb.css' | relative_url }}" type="text/css">
|
||||||
|
|
||||||
|
{% comment %}
|
||||||
|
Meta tags and analytics are added during production build ONLY
|
||||||
|
{%- endcomment -%}
|
||||||
|
{% if jekyll.environment == "production" %}
|
||||||
|
{% if layout.item-meta %}{% include head/item-meta.html %}{% else %}{% include head/page-meta.html %}{% endif %}
|
||||||
|
{% include head/analytics.html %}
|
||||||
|
{%- endif -%}
|
||||||
|
{% if site.noindex == true or page.noindex == true or layout.noindex == true %}<meta name="robots" content="noindex" />{% endif %}
|
||||||
|
<!-- Last build date: {{ site.time | date: "%Y-%m-%d" }} -->
|
||||||
34
_includes/head/item-meta.html
Normal file
34
_includes/head/item-meta.html
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{% if page.subject %}<meta name="keywords" content="{{ page.subject | escape }}" >{% endif %}
|
||||||
|
{% if page.description %}<meta name="description" content="Item from {{ site.title | escape }}: {{ page.description | truncatewords: 25 | escape }}">{% endif %}
|
||||||
|
<!-- DC meta -->
|
||||||
|
<link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" />
|
||||||
|
{%- assign dc-fields = site.data.config-metadata | where_exp: 'item', 'item.dc_map != nil' -%}
|
||||||
|
{% for f in dc-fields %}{% if page[f.field] %}<meta name="{{ f.dc_map | xml_escape }}" content="{{ page[f.field] | truncatewords: 25 | xml_escape }}" xml:lang="en" />
|
||||||
|
{% endif %}{% endfor %}
|
||||||
|
{% if site.organization-name %}<meta name="DCTERMS.publisher" content="{{ site.organization-name | escape }}" xml:lang="en" />{% endif %}
|
||||||
|
<!-- Open Graph meta -->
|
||||||
|
<meta property="og:title" content="{{ page.title | escape }}" />
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:description" content="Item from {{ site.title | escape }}. {{ page.description | truncatewords: 30 | escape }}" />
|
||||||
|
{% if page.image_small or page.image_thumb %}
|
||||||
|
<meta property="og:image" content="{{ page.image_small | default: page.image_thumb | relative_url }}" />
|
||||||
|
<meta property="og:image:alt" content="{{ page.title | escape }}" />{% endif %}
|
||||||
|
<meta property="og:site_name" content="{{ site.title | escape }}" />
|
||||||
|
<meta property="og:url" content="{{ page.url | absolute_url }}" />
|
||||||
|
<meta property="og:locale" content="en_US" />
|
||||||
|
<!-- schema.org JSON-LD -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "http://schema.org",
|
||||||
|
"@type": "CreativeWork",
|
||||||
|
{%- assign sc-fields = site.data.config-metadata | where_exp: 'item', 'item.schema_map != nil' -%}
|
||||||
|
{% for f in sc-fields %}{% if page[f.field] %}
|
||||||
|
"{{ f.schema_map }}": {{ page[f.field] | jsonify }},{% endif %}{% endfor %}
|
||||||
|
"isPartOf": {{ site.title | jsonify }},
|
||||||
|
{% if page.image_small %}"image": "{{ page.image_small | relative_url }}",{% endif %}
|
||||||
|
{% if page.image_thumb %}"thumbnailUrl": "{{ page.image_thumb | relative_url }}",{% endif %}
|
||||||
|
"url": {{ page.url | absolute_url | jsonify }}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<!-- breadcrumbs schema -->
|
||||||
|
<script type="application/ld+json">{"@context": "http://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "item": { "@id": "{{ "/" | absolute_url }}", "name": {{ site.title | jsonify }} } },{ "@type": "ListItem", "position": 2, "item": { "@id": "{{ '/browse.html' | absolute_url }}", "name": "Browse Collection" } },{ "@type": "ListItem", "position": 3, "item": { "@id": "{{ page.url | absolute_url }}", "name": {{ page.title | jsonify }} } }] }</script>
|
||||||
24
_includes/head/page-meta.html
Normal file
24
_includes/head/page-meta.html
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<meta name="description" content="{{ site.description | escape }}">
|
||||||
|
{% if site.author or site.organization-name %}<meta name="author" content="{% if site.author %}{{ site.author | escape }}; {% endif %}{{ site.organization-name | escape }}" >{% endif %}
|
||||||
|
{% if site.keywords %}<meta name="keywords" content="{{ site.keywords | escape }}">{% endif %}
|
||||||
|
<!-- DC meta -->
|
||||||
|
<link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" />
|
||||||
|
<meta name="DCTERMS.title" content="{{ page.title | escape }}, {{ site.title | escape }}" xml:lang="en" />
|
||||||
|
{% if site.author or site.organization-name %}<meta name="DCTERMS.creator" content="{{ site.author | default: site.organization-name | escape }}" xml:lang="en" />{% endif %}
|
||||||
|
{% if site.organization-name %}<meta name="DCTERMS.publisher" content="{{ site.organization-name | escape }}" xml:lang="en" />{% endif %}
|
||||||
|
<meta name="DCTERMS.date" content="{{ site.time | date: '%Y' }}" xml:lang="en" />
|
||||||
|
<meta name="DCTERMS.description" content="{{ site.description | escape }}" xml:lang="en" />
|
||||||
|
|
||||||
|
<!-- Open Graph meta -->
|
||||||
|
<meta property="og:title" content="{% if page.title %}{{ page.title | escape }}, {% endif %}{{ site.title | escape }}" />
|
||||||
|
<meta property="og:description" content="{{ site.description | escape }}" />
|
||||||
|
<meta property="og:site_name" content="{{ site.title | escape }}" />
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:image" content="{{ site.data.featured_item.src | relative_url }}" />
|
||||||
|
<meta property="og:image:alt" content="{{ site.data.featured_item.alt | escape }}" />
|
||||||
|
<meta property="og:url" content="{{ page.url | absolute_url }}" />
|
||||||
|
<meta property="og:locale" content="en_US" />
|
||||||
|
<!-- schema.org JSON-LD -->
|
||||||
|
<script type="application/ld+json">{"@context":"http://schema.org","@type":"WebPage","headline":"{% if page.title %}{{ page.title | escape }}, {% endif %}{{ site.title | escape }}","publisher": { "@context": "https://schema.org", "@type": "Organization", "name": "{{ site.organization-name }}", "url": "{{ site.organization-link }}", "logo": "{{ site.organization-logo-banner }}" },"description":{{ site.description | jsonify }},"image":"{{ site.data.featured_item.src | relative_url }}","url":"{{ page.url | absolute_url }}"}</script>
|
||||||
|
<!-- breadcrumbs schema -->
|
||||||
|
<script type="application/ld+json">{"@context": "http://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "item": { "@id": "{{ "/" | absolute_url }}", "name": {{ site.title | jsonify }} } },{ "@type": "ListItem", "position": 2, "item": { "@id": "{{ page.url | absolute_url }}", "name": {{ page.title | jsonify }} } }] }</script>
|
||||||
18
_includes/helpers/get-icon-svg.html
Normal file
18
_includes/helpers/get-icon-svg.html
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Liquid utility to get a theme icon based on display_template or format.
|
||||||
|
returns an svg sprite (in html)
|
||||||
|
|
||||||
|
E.G. --> {% include helpers/get-icon-svg.html template="pdf" type="hidden" %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
- "template" - the display_template to represent (usually provided from an item metadata "display_template" or "format")
|
||||||
|
- "type" - choose from "thumb" (svg like an image), "hidden" (svg aria-hidden), or "sprite" (svg sprite) (optional, default "sprite")
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{%- capture iconId -%}{% if include.template contains 'image' %}icon-image{% elsif include.template contains 'pdf' %}icon-pdf{% elsif include.template contains 'video' %}icon-video{% elsif include.template contains 'audio' %}icon-audio{% elsif include.template contains 'panorama' %}icon-panorama{% elsif include.template contains 'compound' %}icon-compound-object{% elsif include.template contains 'multiple' %}icon-multiple{% elsif include.template contains 'record' %}icon-record{% else %}icon-default{% endif %}{%- endcapture -%}
|
||||||
|
{% if include.type == "thumb" %}
|
||||||
|
<svg class="bi text-body img-fluid" fill="currentColor" role="img"><title>{{ include.template }} file icon</title><use xlink:href="{{ '/assets/css/cb-icons.svg' | relative_url }}#{{ iconId }}"/></svg>
|
||||||
|
{%- else -%}
|
||||||
|
<svg class="bi icon-sprite"{% if include.type == 'hidden' %} aria-hidden="true"{% endif %}><use xlink:href="{{ '/assets/css/cb-icons.svg' | relative_url }}#{{ iconId }}"/></svg>{% endif %}
|
||||||
53
_includes/helpers/get-icon.js
Normal file
53
_includes/helpers/get-icon.js
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
get a theme icon based on display_template or format
|
||||||
|
return svg sprite
|
||||||
|
*/
|
||||||
|
function getIcon(objectTemplate,objectFormat,svgType) {
|
||||||
|
var iconTemplate, iconId, iconTitle;
|
||||||
|
if (objectTemplate && objectTemplate != "") {
|
||||||
|
iconTemplate = objectTemplate;
|
||||||
|
} else if (objectFormat && objectFormat != "") {
|
||||||
|
iconTemplate = objectFormat;
|
||||||
|
} else {
|
||||||
|
iconTemplate = ""
|
||||||
|
}
|
||||||
|
// choose icon
|
||||||
|
if (iconTemplate.includes("image")) {
|
||||||
|
iconId = "icon-image";
|
||||||
|
iconTitle = "image file icon";
|
||||||
|
} else if (iconTemplate.includes("pdf")) {
|
||||||
|
iconId = "icon-pdf";
|
||||||
|
iconTitle = "pdf file icon";
|
||||||
|
} else if (iconTemplate.includes("video")) {
|
||||||
|
iconId = "icon-video";
|
||||||
|
iconTitle = "video file icon";
|
||||||
|
} else if (iconTemplate.includes("audio")) {
|
||||||
|
iconId = "icon-audio";
|
||||||
|
iconTitle = "audio file icon";
|
||||||
|
} else if (iconTemplate.includes("panorama")) {
|
||||||
|
iconId = "icon-panorama";
|
||||||
|
iconTitle = "panorama file icon";
|
||||||
|
} else if (iconTemplate.includes("compound")) {
|
||||||
|
iconId = "icon-compound-object";
|
||||||
|
iconTitle = "compound object icon";
|
||||||
|
} else if (iconTemplate.includes("multiple")) {
|
||||||
|
iconId = "icon-multiple";
|
||||||
|
iconTitle = "multiple object icon";
|
||||||
|
} else if (iconTemplate.includes("record")) {
|
||||||
|
iconId = "icon-record";
|
||||||
|
iconTitle = "record object icon";
|
||||||
|
} else {
|
||||||
|
iconId = "icon-default";
|
||||||
|
iconTitle = "file icon";
|
||||||
|
}
|
||||||
|
if (svgType == "thumb") {
|
||||||
|
// svg sprite as thumb
|
||||||
|
return '<svg class="bi text-body img-fluid" fill="currentColor" role="img"><title>' + iconTitle + '</title><use xlink:href="{{ "/assets/css/cb-icons.svg" | relative_url }}#' + iconId + '"/></svg>';
|
||||||
|
} else if (svgType == "hidden") {
|
||||||
|
// svg as sprite with aria-hidden
|
||||||
|
return '<svg class="bi icon-sprite" aria-hidden="true"><use xlink:href="{{ "/assets/css/cb-icons.svg" | relative_url }}#' + iconId + '"/></svg>';
|
||||||
|
} else {
|
||||||
|
// svg as sprite
|
||||||
|
return '<svg class="bi icon-sprite" aria-label="' + iconTitle + '"><use xlink:href="{{ "/assets/css/cb-icons.svg" | relative_url }}#' + iconId + '"/></svg>';
|
||||||
|
}
|
||||||
|
}
|
||||||
107
_includes/index/carousel.html
Normal file
107
_includes/index/carousel.html
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Image item carousel.
|
||||||
|
This include adds a Bootstrap Carousel component populated with randomly selected image items, designed with index page in mind.
|
||||||
|
https://getbootstrap.com/docs/5.1/components/carousel/
|
||||||
|
|
||||||
|
E.G. --> {% include index/carousel.html title="Sample Items" height=450 %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
- "height" = the height of the carousel in px, just give the number (optional, default 300)
|
||||||
|
- "carousel-type" = the selection of items featured in the carousel, choose from thumb (all items with image_thumb) or small (all items with image_small). (optional, default thumb)
|
||||||
|
- "child-objects" = include child items in count or only parents, true or false (optional, default false)
|
||||||
|
- "title" = card title text inside card content area (optional)
|
||||||
|
- "header" = card header text in bar above card content (optional)
|
||||||
|
- "heading_level" = customize the level of the heading if necessary for accessibility, choose "h1", "h2", "h3", etc (optional, default "h2")
|
||||||
|
- "max" = maximum images selected for slide show (optional, default 9. Do not make too big!)
|
||||||
|
- "btn-color" = a bootstrap color class to theme the buttons. Can be any bootstrap template color (e.g. info, success) or outline (e.g. outline-info, outline-success), including colors created in config-theme-colors. (optional, default "primary")
|
||||||
|
- "btn-text" = the label used in the link btn to view the carousel item (optional, default "View Item")
|
||||||
|
- "filter-field" and "filter-value" = use these options together to filter which set of items will appear in the carousel based on a particular metadata field and value in that field. filter-field must match a column in your metadata. any item with a value in the filter-field that "contains" the filter-value will be included, it does not need to be an exact match. (optional)
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
|
||||||
|
{%- assign carousel-max = include.max | default: 9 -%}
|
||||||
|
{%- assign btn-color = include.btn-color | default: "primary" -%}
|
||||||
|
{%- assign btn-text = include.btn-text | default: "View Item" -%}
|
||||||
|
{% if include.child-objects == true %}
|
||||||
|
{%- assign carousel-items = site.data[site.metadata] | where_exp: 'item','item.objectid' | where_exp: "item","item.image_small != nil or item.image_thumb != nil"-%}
|
||||||
|
{% else %}
|
||||||
|
{%- assign carousel-items = site.data[site.metadata] | where_exp: 'item','item.objectid and item.parentid == nil' | where_exp: "item","item.image_small != nil or item.image_thumb != nil" -%}
|
||||||
|
{% endif %}
|
||||||
|
{%- if include.filter-field and include.filter-value -%}
|
||||||
|
{% assign carousel-items = carousel-items | where_exp: 'item','item[include.filter-field] contains include.filter-value' %}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- comment -%}
|
||||||
|
Set up carousel div
|
||||||
|
{%- endcomment -%}
|
||||||
|
<style>
|
||||||
|
#imageCarousel .carousel-item { height: {{ include.height | remove: 'px' | strip | default: '300' }}px; }
|
||||||
|
</style>
|
||||||
|
<div class="card mb-3">
|
||||||
|
{% if include.header %}<{{ include.heading_level | default: 'h2' | strip }} class="card-header h5">{{ include.header }}</{{ include.heading_level | default: 'h2' | strip }}>{% endif %}
|
||||||
|
<div class="card-body">
|
||||||
|
{% if include.title %}<{{ include.heading_level | default: 'h2' | strip }} class="card-title h5">{{ include.title }}</{{ include.heading_level | default: 'h2' | strip }}>{% endif %}
|
||||||
|
|
||||||
|
<div id="imageCarousel" class="carousel slide bg-dark rounded mb-3" data-bs-ride="carousel">
|
||||||
|
<div id="carouselIndicators" class="carousel-indicators">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div id="carouselInner" class="carousel-inner">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<button class="carousel-control-prev" type="button" data-bs-target="#imageCarousel" data-bs-slide="prev">
|
||||||
|
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
|
||||||
|
<span class="visually-hidden">Previous</span>
|
||||||
|
</button>
|
||||||
|
<button class="carousel-control-next" type="button" data-bs-target="#imageCarousel" data-bs-slide="next">
|
||||||
|
<span class="carousel-control-next-icon" aria-hidden="true"></span>
|
||||||
|
<span class="visually-hidden">Next</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{%- comment -%}
|
||||||
|
add slides using JS to allow for randomizing slide show
|
||||||
|
{%- endcomment -%}
|
||||||
|
<script>
|
||||||
|
/* add item data */
|
||||||
|
// title,objectid,image_thumb/small
|
||||||
|
var carouselItems = [ {% for c in carousel-items %}[ {{ c.title | escape | jsonify }}, "{{ c.objectid }}", {% if c.image_small %}{{ c.image_small | relative_url | jsonify }}{% else %}{{ c.image_thumb | relative_url | jsonify }}{% endif %}, "{{ c.parentid }}", {{ c.image_alt_text | default: c.title | escape | jsonify }} ]{% unless forloop.last %}, {% endunless %}{% endfor %}];
|
||||||
|
/* shuffle items */
|
||||||
|
carouselItems.sort(function() { return 0.5 - Math.random() });
|
||||||
|
|
||||||
|
/* add items to carousel */
|
||||||
|
var carousel = document.getElementById("carouselInner");
|
||||||
|
var carouselIndicators = document.getElementById("carouselIndicators");
|
||||||
|
var slides = "";
|
||||||
|
var indicators = "";
|
||||||
|
var i, itemImg, itemLink;
|
||||||
|
for (let i=0; i < {{ carousel-items | size | at_most: carousel-max }}; i++) {
|
||||||
|
// calculate item image location
|
||||||
|
itemImg = carouselItems[i][2];
|
||||||
|
// calculate item link
|
||||||
|
if (carouselItems[i][3]){
|
||||||
|
itemLink = '{{ '/items/' | relative_url }}' + carouselItems[i][3] + '.html#' + carouselItems[i][1];}
|
||||||
|
else {
|
||||||
|
itemLink = '{{ '/items/' | relative_url }}' + carouselItems[i][1] + '.html';
|
||||||
|
}
|
||||||
|
// create indicator
|
||||||
|
indicator = `<button type="button" data-bs-target="#imageCarousel" data-bs-slide-to="${i.toString()}" ${ i == 0 ? 'class="active" aria-current="true" ' : '' }aria-label="Slide ${i.toString()}"></button>`;
|
||||||
|
// create slide
|
||||||
|
slide = `<div class="carousel-item py-2${ i == 0 ? ' active' : '' }">
|
||||||
|
<img class="d-block h-100 mx-auto lazyload" alt="${carouselItems[i][4]}" data-src="${itemImg}">
|
||||||
|
<div class="carousel-caption">
|
||||||
|
<h3 class="carousel-item-title text-white py-2 h6">${carouselItems[i][0]}</h3>
|
||||||
|
<a href="${itemLink}" class="btn btn-sm btn-{{ btn-color }}">{{ btn-text }}</a>
|
||||||
|
</div></div>`;
|
||||||
|
slides += slide;
|
||||||
|
indicators += indicator;
|
||||||
|
}
|
||||||
|
// add indicators to page
|
||||||
|
carouselIndicators.innerHTML = indicators;
|
||||||
|
// add slides to the page
|
||||||
|
carousel.innerHTML = slides;
|
||||||
|
</script>
|
||||||
47
_includes/index/content.html
Normal file
47
_includes/index/content.html
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Collection content summary.
|
||||||
|
Counts item types based on "display_template" providing link to Browse page.
|
||||||
|
|
||||||
|
E.G. --> {% include index/content.html %}
|
||||||
|
|
||||||
|
E.G. --> {% include index/content.html object_field="format" others=true total=true %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
- "btn-color" - a bootstrap color class to theme the buttons. Can be any bootstrap template color (e.g. info, success) or outline (e.g. outline-info, outline-success), including colors created in config-theme-colors. (optional, default "outline-secondary")
|
||||||
|
- "heading_level" = customize the level of the heading if necessary for accessibility, choose "h1", "h2", "h3", etc (optional, default "h2")
|
||||||
|
- "object_field" = optionally change the field used to count items. Typically this is either "display_template" (default) or "format". The field should be available on the Browse page to filter! The icons assume you use something like "display_template" or "format" to select the correct icon.
|
||||||
|
- "child-objects" = include child items in count or only parents, true or false (optional, default false)
|
||||||
|
- "others" = display a count for items with no "display_template", true or false (optional, default false)
|
||||||
|
- "total" = display a count for total items, true or false (optional, default false)
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{%- assign object_field = include.object_field | default: 'display_template' -%}
|
||||||
|
{% if include.child-objects == true %}
|
||||||
|
{%- assign items = site.data[site.metadata] | where_exp: 'item','item.objectid' -%}
|
||||||
|
{% else %}
|
||||||
|
{%- assign items = site.data[site.metadata] | where_exp: 'item','item.objectid and item.parentid == nil' -%}
|
||||||
|
{% endif %}
|
||||||
|
{%- assign templates = items | map: object_field -%}
|
||||||
|
{%- assign types = templates | uniq | compact | sort -%}
|
||||||
|
<div class="card mb-3" >
|
||||||
|
<div class="card-body">
|
||||||
|
<{{ include.heading_level | default: 'h2' | strip }} class="card-title h5">Content</{{ include.heading_level | default: 'h2' | strip }}>
|
||||||
|
<p class="card-text">
|
||||||
|
{% for t in types %}
|
||||||
|
{%- assign count = templates | where_exp: 'item', 'item contains t' | size -%}
|
||||||
|
{% if count > 0 %}
|
||||||
|
{{ count }}
|
||||||
|
<a class="text-dark" href="{{ '/browse.html' | relative_url }}#display_template:{{ t }}">{{ t | upcase | replace: "_", " " }}
|
||||||
|
{% include helpers/get-icon-svg.html type="hidden" template=t %}</a><br>
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
{% if include.others == true %}{% assign others = templates | where_exp: 'item', 'item == nil or item == ""' | size %}{% if others > 0 %}
|
||||||
|
{{ others }} OTHER {% include helpers/get-icon-svg.html type="hidden" %}<br>{% endif %}{% endif %}
|
||||||
|
{% if include.total == true %}
|
||||||
|
{{ templates | size }} TOTAL ITEMS<br>{% endif %}
|
||||||
|
<a class="btn btn-sm btn-{{ include.btn-color | default: 'outline-secondary' }} mt-2" href="{{ '/data.html' | relative_url }}">View table</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
41
_includes/index/data-download.html
Normal file
41
_includes/index/data-download.html
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Collection data downloads.
|
||||||
|
Based on the stubs present in the config-nav, displays relevant download btn links for metadata derivatives in a variety of formats. This highlights the ability to explore and reuse collection data.
|
||||||
|
|
||||||
|
E.G. --> {% include index/data-download.html %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
- "heading_level" = customize the level of the heading if necessary for accessibility, choose "h1", "h2", "h3", etc (optional, default "h2")
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{%- assign stubs = site.data.config-nav | map: 'stub' | join: ';' -%}
|
||||||
|
<div class="card mb-3">
|
||||||
|
<div class="card-body">
|
||||||
|
<{{ include.heading_level | default: 'h2' | strip }} class="card-title h5">Collection as Data</{{ include.heading_level | default: 'h2' | strip }}>
|
||||||
|
<p><small>Download this collection's metadata in a variety of reusable formats.</small></p>
|
||||||
|
<p class="card-text text-center">
|
||||||
|
<a class="btn btn-sm btn-secondary m-1" href="{{ '/assets/data/metadata.csv' | relative_url }}" download>Metadata CSV</a>
|
||||||
|
<a class="btn btn-sm btn-secondary m-1" href="{{ '/assets/data/metadata.json' | relative_url }}" target="_blank">Metadata JSON</a>
|
||||||
|
{% if stubs contains "subject" %}
|
||||||
|
<a class="btn btn-sm btn-secondary m-1" href="{{ '/assets/data/subjects.csv' | relative_url }}" download>Subjects CSV</a>
|
||||||
|
<a class="btn btn-sm btn-secondary m-1" href="{{ '/assets/data/subjects.json' | relative_url }}" target="_blank">Subjects JSON</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if stubs contains "map" %}
|
||||||
|
<a class="btn btn-sm btn-secondary m-1" href="{{ '/assets/data/geodata.json' | relative_url }}" target="_blank">Geodata JSON</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if stubs contains "location" %}
|
||||||
|
<a class="btn btn-sm btn-secondary m-1" href="{{ '/assets/data/locations.csv' | relative_url }}" download>Locations CSV</a>
|
||||||
|
<a class="btn btn-sm btn-secondary m-1" href="{{ '/assets/data/locations.json' | relative_url }}" target="_blank">Locations JSON</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if stubs contains "timeline" %}
|
||||||
|
<a class="btn btn-sm btn-secondary m-1" href="{{ '/assets/data/timelinejs.json' | relative_url }}" target="_blank">Timeline JSON</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if site.data.theme.metadata-facets-fields %}
|
||||||
|
<a class="btn btn-sm btn-secondary m-1" href="{{ '/assets/data/facets.json' | relative_url }}" target="_blank">Facets JSON</a>
|
||||||
|
{% endif %}
|
||||||
|
<a class="btn btn-sm btn-secondary m-1" href="{{ site.source-code }}" rel="noopener">Source Code</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
21
_includes/index/description.html
Normal file
21
_includes/index/description.html
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Collection Description card.
|
||||||
|
Pulls description from _config.yml. Provides btn link to About page if present in the config-nav.
|
||||||
|
|
||||||
|
E.G. --> {% include index/description.html %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
- "btn-color" - a bootstrap color class to theme the buttons. Can be any bootstrap template color (e.g. info, success) or outline (e.g. outline-info, outline-success), including colors created in config-theme-colors. (optional, default "primary")
|
||||||
|
- "heading_level" = customize the level of the heading if necessary for accessibility, choose "h1", "h2", "h3", etc (optional, default "h2")
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<div class="card mb-3">
|
||||||
|
<div class="card-body">
|
||||||
|
<{{ include.heading_level | default: 'h2' | strip }} class="card-title h5">Description</{{ include.heading_level | default: 'h2' | strip }}>
|
||||||
|
<p class="card-text">{{ site.description }}</p>
|
||||||
|
{%- assign about = site.data.config-nav | where: "stub","/about.html" | size -%}{% if about > 0 %}
|
||||||
|
<a class="btn btn-{{ include.btn-color | default: 'primary' }}" href="{{ '/about.html' | relative_url }}" >Learn More »</a>{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
53
_includes/index/featured-terms.html
Normal file
53
_includes/index/featured-terms.html
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Featured Terms button-links.
|
||||||
|
This include creates a card with btn links to the Browse page from a set of automatically generated or manually selected terms. Either use the "field" option to auto generate *or* the "featured" option to manually create list of terms.
|
||||||
|
|
||||||
|
E.G. --> {% include index/featured-terms.html field="subject" title="Top Subjects" btn-color="outline-info" max=8 %}
|
||||||
|
|
||||||
|
E.G. --> {% include index/featured-terms.html featured="Example term; Another; One more" title="Topic Areas" btn-color="success" %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
- "field" - a field from your metadata that will be used to auto generate top terms (required to auto generate)
|
||||||
|
- "featured" - a manually created list of featured terms, separated by ; semicolon (required if not auto generating from a field)
|
||||||
|
- "title" - card title text inside card content area (optional)
|
||||||
|
- "header" = card header text in bar above card content (optional)
|
||||||
|
- "heading_level" = customize the level of the heading if necessary for accessibility, choose "h1", "h2", "h3", etc (optional, default "h2")
|
||||||
|
- "max" - max number of terms to display if auto generating (optional, default 5)
|
||||||
|
- "btn-color" - a bootstrap color class to theme the buttons. Can be any bootstrap template color (e.g. info, success) or outline (e.g. outline-info, outline-success), including colors created in config-theme-colors. (optional, default "primary")
|
||||||
|
|
||||||
|
Requires CB's "array_count_uniq.rb" plugin!
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
|
||||||
|
{% if include.featured %}
|
||||||
|
{% assign topTerms = include.featured | split: ";" %}
|
||||||
|
{%- else -%}
|
||||||
|
|
||||||
|
|
||||||
|
{% comment %}
|
||||||
|
Use termsField and termsMax to customize feature
|
||||||
|
{% endcomment %}
|
||||||
|
{% assign termsField = include.field | default: "subject" %}
|
||||||
|
{% assign termsMax = include.max | default: 5 %}
|
||||||
|
{% if site.data.theme.browse-child-objects == true %}
|
||||||
|
{%- assign terms = site.data[site.metadata] | where_exp: 'item','item.objectid' | map: termsField | join: ";" -%}
|
||||||
|
{% else %}
|
||||||
|
{%- assign terms = site.data[site.metadata] | where_exp: 'item','item.parentid == nil' | map: termsField | join: ";" -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- assign uniqTerms = terms | downcase | split: ";" | array_count_uniq -%}
|
||||||
|
{% capture topTerms %}
|
||||||
|
{% for i in uniqTerms limit: termsMax %}{{ i[0] }};{% endfor %}{% endcapture %}
|
||||||
|
{% assign topTerms = topTerms | split: ";" %}
|
||||||
|
{%- endif -%}
|
||||||
|
<div class="card mb-3">
|
||||||
|
{% if include.header %}<{{ include.heading_level | default: 'h2' | strip }} class="card-header h5">{{ include.header }}</{{ include.heading_level | default: 'h2' | strip }}>{% endif %}
|
||||||
|
<div class="card-body">
|
||||||
|
{% if include.title %}<{{ include.heading_level | default: 'h2' | strip }} class="card-title h5">{{ include.title }}</{{ include.heading_level | default: 'h2' | strip }}>{% endif %}
|
||||||
|
<p class="card-text">
|
||||||
|
{% for s in topTerms %}
|
||||||
|
<a class="btn btn-sm btn-{{ include.btn-color | default: 'primary' }} m-1" href="{{ s | strip | url_param_escape | prepend: ':' | prepend: termsField | prepend: '/browse.html#' | relative_url }}">{{ s | strip }}</a>{% endfor %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
31
_includes/index/time.html
Normal file
31
_includes/index/time.html
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Collection time span.
|
||||||
|
Extracts all content of "date" field, displays the smallest and largest.
|
||||||
|
You may encounter issues if you do not have a correctly ISO formatted "date" field.
|
||||||
|
|
||||||
|
E.G. --> {% include index/time.html %}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
- "date_field" - optionally change the field used for date range. Only ISO or year-only dates are supported. (optional, default "date")
|
||||||
|
- "btn-color" - a bootstrap color class to theme the buttons. Can be any bootstrap template color (e.g. info, success) or outline (e.g. outline-info, outline-success), including colors created in config-theme-colors. (optional, default "outline-secondary")
|
||||||
|
- "heading_level" = customize the level of the heading if necessary for accessibility, choose "h1", "h2", "h3", etc (optional, default "h2")
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{% assign date_field = include.date_field | default: 'date' %}
|
||||||
|
{% if site.data.theme.timeline-child-objects == true %}
|
||||||
|
{%- assign date-items = site.data[site.metadata] | where_exp: 'item','item.objectid' -%}
|
||||||
|
{% else %}
|
||||||
|
{%- assign date-items = site.data[site.metadata] | where_exp: 'item','item.objectid and item.parentid == nil' -%}
|
||||||
|
{% endif %}
|
||||||
|
{%- assign raw-dates = date-items | map: date_field | compact | uniq -%}
|
||||||
|
{%- capture clean-years -%}{% for date in raw-dates %}{% if date contains "-" %}{{ date | strip | split: "-" | first }}{% elsif date contains "/" %}{{ date | strip | split: "/" | last }}{% else %}{{ date | strip }}{% endif %}{% unless forloop.last %};{% endunless %}{%- endfor -%}{%- endcapture -%}
|
||||||
|
{%- assign date-range = clean-years | remove: " " | split: ";" | uniq | sort -%}
|
||||||
|
<div class="card mb-3">
|
||||||
|
<div class="card-body">
|
||||||
|
<{{ include.heading_level | default: 'h2' | strip }} class="card-title h5">Time Span</{{ include.heading_level | default: 'h2' | strip }}>
|
||||||
|
<p class="card-text h5">{{ date-range | first }} to {{ date-range | last }}
|
||||||
|
<br><a href="{{ '/timeline.html' | relative_url }}" class="btn btn-sm btn-{{ include.btn-color | default: 'outline-secondary' }} mt-2">View Timeline</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
48
_includes/item/3d-model-viewer.html
Normal file
48
_includes/item/3d-model-viewer.html
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Embed an interactive viewer to display 3d model files in glTF/GLB format (.glb or .gltf).
|
||||||
|
Uses the model-viewer component, https://modelviewer.dev/
|
||||||
|
This assumes that the item's object_location is a .glb or .gltf file.
|
||||||
|
If an image_small is set in the metadata, that image is used as a "poster" and model is not loaded until user clicks.
|
||||||
|
|
||||||
|
{% endcomment %}
|
||||||
|
<!-- import model-viewer component from CDN -->
|
||||||
|
<script type="module" src="https://ajax.googleapis.com/ajax/libs/model-viewer/3.1.1/model-viewer.min.js"></script>
|
||||||
|
{% if page.image_small %}
|
||||||
|
<style>
|
||||||
|
/* add styles for poster image and load button */
|
||||||
|
#poster-image {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background-image: url("{{ page.image_small | relative_url }}");
|
||||||
|
background-size: contain;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
#load-model-btn {
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
transform: translate3d(-50%, -50%, 0);
|
||||||
|
}
|
||||||
|
</style>{% endif %}
|
||||||
|
<!-- add 3d viewer to page -->
|
||||||
|
<div class="ratio ratio-4x3">
|
||||||
|
<model-viewer id="item-model-viewer" alt="{{ page.image_alt_text | default: page.description | default: page.title | escape }}" src="{{ page.object_location | relative_url }}" shadow-intensity="1" camera-controls touch-action="pan-y" {% if page.image_small %}reveal="manual"{% endif %}>
|
||||||
|
{% if page.image_small %}
|
||||||
|
<div id="poster-image" slot="poster"></div>
|
||||||
|
<button id="load-model-btn" class="btn btn-lg btn-primary" slot="poster">Load 3D Model</button>
|
||||||
|
{% endif %}
|
||||||
|
</model-viewer>
|
||||||
|
</div>
|
||||||
|
{% if page.image_small %}
|
||||||
|
<script>
|
||||||
|
/* load model on user click */
|
||||||
|
var itemModelViewer = document.querySelector('#item-model-viewer');
|
||||||
|
itemModelViewer.addEventListener('click', () => itemModelViewer.dismissPoster());
|
||||||
|
</script>
|
||||||
|
{% endif %}
|
||||||
10
_includes/item/audio-player.html
Normal file
10
_includes/item/audio-player.html
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds html audio element with source listed in object_location.
|
||||||
|
Provides a fallback to download the file.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<audio controls class="w-100">
|
||||||
|
<source src="{{ page.object_location | relative_url }}">
|
||||||
|
Your browser does not support the audio element. Please <a href="{{ page.object_location | relative_url }}">download the audio file</a>.
|
||||||
|
</audio>
|
||||||
11
_includes/item/breadcrumbs.html
Normal file
11
_includes/item/breadcrumbs.html
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds Bootstrap styled breadcrumbs to page.
|
||||||
|
By default the crumbs are: Home (index.html) / Items (browse.html) / current page title (from the metadata, truncated to 10 words max).
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li class="breadcrumb-item"><a class="text-dark" href="{{ '/' | relative_url }}">Home</a></li>
|
||||||
|
<li class="breadcrumb-item"><a class="text-dark" href="{{ '/browse.html' | relative_url }}">Items</a></li>
|
||||||
|
<li class="breadcrumb-item active text-dark" aria-current="page">{{ page.title | truncatewords: 10 }}</li>
|
||||||
|
</ol>
|
||||||
100
_includes/item/browse-buttons.html
Normal file
100
_includes/item/browse-buttons.html
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds previous and next button arrows to provide navigation between items.
|
||||||
|
Requires cb_page_gen plugin.
|
||||||
|
The item order follows the order in the metadata CSV, so pre-sort the CSV to the desired order.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<div class="text-center">
|
||||||
|
<a class="btn btn-secondary" href="{{ page.previous_item | relative_url }}" id="prev-page-button">« Previous</a>
|
||||||
|
<a class="btn btn-secondary" href="{{ '/browse.html' | relative_url }}">Back to Browse</a>
|
||||||
|
<a class="btn btn-secondary" href="{{ page.next_item | relative_url }}" id="next-page-button">Next »</a>
|
||||||
|
</div>
|
||||||
|
<div id="item-nav">
|
||||||
|
<div class="d-none d-md-block">
|
||||||
|
<a class="previous btn btn-lg btn-secondary" href="{{ page.previous_item | relative_url }}">«</a>
|
||||||
|
<a class="next btn btn-lg btn-secondary" href="{{ page.next_item | relative_url }}">»</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
function leftArrowPressed() {
|
||||||
|
location.href = document.getElementById("prev-page-button").href;
|
||||||
|
};
|
||||||
|
|
||||||
|
function rightArrowPressed() {
|
||||||
|
location.href = document.getElementById("next-page-button").href;
|
||||||
|
};
|
||||||
|
|
||||||
|
function leftModalArrowPressed() {
|
||||||
|
// Get the modal element.
|
||||||
|
var modalshow = document.querySelector(".modal.show");
|
||||||
|
// If the modal exists, get the prev button element.
|
||||||
|
if (modalshow) {
|
||||||
|
const prevButton = modalshow.querySelector(".prev-child-button");
|
||||||
|
// If the prev button exists, click it.
|
||||||
|
if (prevButton) {
|
||||||
|
prevButton.click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function rightModalArrowPressed() {
|
||||||
|
// Get the modal element.
|
||||||
|
var modalshow = document.querySelector(".modal.show");
|
||||||
|
// If the modal exists, get the prev button element.
|
||||||
|
if (modalshow) {
|
||||||
|
const nextButton = modalshow.querySelector(".next-child-button");
|
||||||
|
// If the prev button exists, click it.
|
||||||
|
if (nextButton) {
|
||||||
|
nextButton.click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function isModalShown() {
|
||||||
|
// Get the modal element.
|
||||||
|
const modal = document.querySelector(".modal.show");
|
||||||
|
|
||||||
|
// Check if the modal has the "show" class.
|
||||||
|
return modal && modal.classList.contains("show");
|
||||||
|
};
|
||||||
|
|
||||||
|
function isSpotlightModalShown() {
|
||||||
|
// Get the modal element.
|
||||||
|
const spotlight = document.getElementById("spotlight");
|
||||||
|
// Check if the modal has the "show" class.
|
||||||
|
return spotlight && spotlight.classList.contains("show");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
document.onkeydown = function (evt) {
|
||||||
|
if (isSpotlightModalShown()) {
|
||||||
|
|
||||||
|
|
||||||
|
} else if (isModalShown()) {
|
||||||
|
// The modal is shown.
|
||||||
|
evt = evt || window.event;
|
||||||
|
switch (evt.keyCode) {
|
||||||
|
case 37:
|
||||||
|
leftModalArrowPressed();
|
||||||
|
break;
|
||||||
|
case 39:
|
||||||
|
rightModalArrowPressed();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// The modal is not shown.
|
||||||
|
evt = evt || window.event;
|
||||||
|
switch (evt.keyCode) {
|
||||||
|
case 37:
|
||||||
|
leftArrowPressed();
|
||||||
|
break;
|
||||||
|
case 39:
|
||||||
|
rightArrowPressed();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
</script>
|
||||||
10
_includes/item/child/audio-player.html
Normal file
10
_includes/item/child/audio-player.html
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds html audio element with source listed in object_location of a child item.
|
||||||
|
Provides a fallback to download the file.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<audio controls class="w-100">
|
||||||
|
<source src="{{ child.object_location | relative_url }}">
|
||||||
|
Your browser does not support the audio element. Please <a href="{{ child.object_location | relative_url }}">download the audio file</a>.
|
||||||
|
</audio>
|
||||||
14
_includes/item/child/citation-box.html
Normal file
14
_includes/item/child/citation-box.html
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds a basic citation box for child item with reference link to the child modal.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<div class="card mb-2">
|
||||||
|
<div class="card-header">Attribution</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<dl>
|
||||||
|
<dt>Citation:</dt>
|
||||||
|
<dd>"{{ child.title | default: page.title }}", {{ site.title }}, {% if site.organization-name %}{{ site.organization-name }}, {% endif %}<a href="{{ page.url | absolute_url }}#{{ child.objectid }}">{{ page.url | absolute_url }}#{{ child.objectid }}</a></dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
47
_includes/item/child/compound-item-download-buttons.html
Normal file
47
_includes/item/child/compound-item-download-buttons.html
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds button links for compound object parent item page.
|
||||||
|
If item has date to Timeline, if item has lat/long to Map, if item has child objects with object_location it adds Download options for each.
|
||||||
|
Styled as a Bootstrap btn-group.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<div class="btn-group my-3" role="group" aria-label="Item options">
|
||||||
|
{% if page.object_transcript %}<button class="btn btn-outline-primary" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTranscript" aria-expanded="false" aria-controls="collapseTranscript">View Transcript</button>{% endif %}
|
||||||
|
{% if page.date %}{%- capture year -%}{% if page.date contains "-" %}{{ page.date | split: "-" | first }}{% elsif page.date contains "/" %}{{ page.date | split: "/" | last }}{% else %}{{ page.date }}{% endif %}{%- endcapture -%}
|
||||||
|
<a href="{{ year | strip | prepend: '/timeline.html#y' | relative_url }}" class="btn btn-outline-primary">View on Timeline</a>{% endif %}
|
||||||
|
{% if page.latitude and page.longitude %}
|
||||||
|
<a href="{{ '/map.html?location=' | append: page.latitude | append: ',' | append: page.longitude | append: '&marker=' | append: page.objectid | relative_url }}" class="btn btn-outline-primary">View on Map</a>{% endif %}
|
||||||
|
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
<button class="btn btn-outline-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
|
Download
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
{% if page.object_location %}<li><a target="_blank" rel="noopener" href="{{ page.object_location | relative_url }}" class="dropdown-item">{{ page.title }} ({{ page.format | split: '/' | last | upcase }})</a></li>{% endif %}
|
||||||
|
{% for child in children %}
|
||||||
|
{% unless child.object_location == nil %}
|
||||||
|
<li>
|
||||||
|
<a target="_blank" rel="noopener" href="{{ child.object_location | relative_url }}" class="dropdown-item">
|
||||||
|
{% if page.title != child.title and child.title != nil %}{{ child.title | truncatewords: 3 }}{% else %}Item {{ forloop.index }}{% endif %}
|
||||||
|
{% if child.format %}({{ child.format | split: '/' | last | upcase }}){% endif %}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endunless %}
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if page.object_transcript %}
|
||||||
|
<div class="collapse mt-3" id="collapseTranscript">
|
||||||
|
<div class="card card-body text-start">
|
||||||
|
{% assign transcript_type = page.object_transcript | slice: 0,1 %}
|
||||||
|
{% if transcript_type == '/' %}
|
||||||
|
{% assign transcript_location = page.object_transcript | remove_first: '/' %}
|
||||||
|
{% assign transcript = site.pages | where: 'path', transcript_location | first %}
|
||||||
|
{{ transcript.content | markdownify }}
|
||||||
|
{% else %}
|
||||||
|
{{ page.object_transcript | markdownify }}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
165
_includes/item/child/compound-item-modal-gallery.html
Normal file
165
_includes/item/child/compound-item-modal-gallery.html
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Creates a gallery of thumbnails images or icons for each child item in a compound object. The thumb defaults to image_thumb or image_small, otherwise an icon is added based on the display_template or format of the child item.
|
||||||
|
|
||||||
|
Each child item is given a popup modal with full display and metadata information. The display is chosen based on the display_template of the child item.
|
||||||
|
|
||||||
|
This include requires the Liquid object "child" to be present! The item display requires the compound object item includes in "item/child/".
|
||||||
|
|
||||||
|
{% endcomment %}
|
||||||
|
<div class="row row-cols-2 row-cols-lg-4 g-2">
|
||||||
|
{% for child in children %}
|
||||||
|
<div class="col">
|
||||||
|
<div class="card h-100">
|
||||||
|
<div class="my-auto">
|
||||||
|
<div class="card-body text-center" id="{{ child.objectid }}Card">
|
||||||
|
|
||||||
|
{% if child.title %}<div class="small text-dark mb-2">{{ child.title | truncatewords: 4 }}</div>{% endif %}
|
||||||
|
|
||||||
|
<div class="mb-2">
|
||||||
|
{% if child.image_thumb or child.image_small %}
|
||||||
|
<img class="img-thumbnail compound-thumb" src="{{ child.image_thumb | default: child.image_small | relative_url }}" alt="{{ child.image_alt_text | default: child.description | default: child.title | escape }}">
|
||||||
|
{% else %}
|
||||||
|
<svg class="bi text-body compound-thumb" fill="currentColor" aria-hidden="true">
|
||||||
|
{%- assign icon_template = child.display_template | default: item.format -%}
|
||||||
|
<use xlink:href="{{ '/assets/css/cb-icons.svg' | relative_url }}#{% if icon_template contains 'image' %}icon-image{% elsif icon_template contains 'pdf' %}icon-pdf{% elsif icon_template contains 'audio' %}icon-audio{% elsif icon_template contains 'video' %}icon-video{% else %}icon-default{% endif %}" />
|
||||||
|
</svg>
|
||||||
|
<span class="visually-hidden">{{ child.title | escape }} - {{ child.format }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- child object modal button -->
|
||||||
|
<a id="item-{{ forloop.index }}"
|
||||||
|
role="button"
|
||||||
|
data-bs-toggle="modal"
|
||||||
|
href="#{{ child.objectid }}"
|
||||||
|
onclick="window.location.hash='{{ child.objectid }}'"
|
||||||
|
class="btn btn-sm btn-outline-secondary small stretched-link">
|
||||||
|
{{ child.display_template | upcase | default: "Item" }} <svg class="bi icon-sprite" fill="currentColor" aria-hidden="true"><use xlink:href="{{ '/assets/css/cb-icons.svg' | relative_url }}#icon-{{ child.display_template | default: 'file'}}"/></svg>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- child object modal -->
|
||||||
|
<div class="modal fade" id="{{ child.objectid }}" tabindex="-1" role="dialog" aria-labelledby="{{ child.objectid }}ModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-xxl">
|
||||||
|
<div class="modal-content text-start">
|
||||||
|
|
||||||
|
<div class="modal-header ">
|
||||||
|
<div class="modal-title w-100" id="{{ child.objectid }}ModalLabel">
|
||||||
|
<div class="row">
|
||||||
|
{% capture stopMedia %}{% if child.display_template == 'video' %}{% if child.object_location contains 'vimeo' %}vimeo{% elsif child.object_location contains 'youtu' %}youtube{% else %}video{% endif %}{% elsif child.display_template == 'audio' %}audio{% else %}{% endif %}{% endcapture %}
|
||||||
|
<div class="col-12 text-end">
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"
|
||||||
|
onclick="{% if stopMedia != '' %}stopMedia('{{ child.objectid }}','{{ stopMedia }}');{% endif %}history.pushState('', '', window.location.pathname)"></button>
|
||||||
|
</div>
|
||||||
|
{% capture next_index %}{% if forloop.index == forloop.length %}0{% else %}{{ forloop.index0 | plus: 1 }}{% endif %}{% endcapture %}
|
||||||
|
{% assign next_index = next_index | times: 1 %}
|
||||||
|
{% capture prev_index %}{% if forloop.index0 == 0 %}{{ forloop.length | minus: 1 }}{% else %}{{ forloop.index0 | minus: 1 }}{% endif %}{% endcapture %}
|
||||||
|
{% assign prev_index = prev_index | times: 1 %}
|
||||||
|
{% capture next_item_id %}{{ children[next_index].objectid }}{% endcapture %}
|
||||||
|
{% capture prev_item_id %}{{ children[prev_index].objectid }}{% endcapture %}
|
||||||
|
<div class="col-1 col-md-2">
|
||||||
|
<button data-bs-target="#{{ prev_item_id }}" data-bs-toggle="modal" onclick="{% if stopMedia != '' %}stopMedia('{{ child.objectid }}','{{ stopMedia }}');{% endif %}window.location.hash='{{ prev_item_id }}'" class="btn btn-outline-dark btn-sm prev-child-button" >
|
||||||
|
<svg class="bi icon-sprite" role="img" aria-label="Previous Item">
|
||||||
|
<use xlink:href="{{ '/assets/css/cb-icons.svg' | relative_url }}#arrow-left"/>
|
||||||
|
</svg>
|
||||||
|
<span class="d-none d-md-inline">Previous Item</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="col-9 col-md-8 text-center">
|
||||||
|
<h3 class="h5">{{ page.title }}
|
||||||
|
<span class="d-none d-md-inline">-</span><span class="d-md-none"><br></span>
|
||||||
|
Item {{ forloop.index }} of {{ children | size }}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<div class="col-1 col-md-2 text-end">
|
||||||
|
<button data-bs-target="#{{ next_item_id }}" data-bs-toggle="modal" onclick="{% if stopMedia != '' %}stopMedia('{{ child.objectid }}','{{ stopMedia }}');{% endif %}window.location.hash='{{ next_item_id }}'" class="ms-md-5 btn btn-outline-dark btn-sm next-child-button">
|
||||||
|
<span class="d-none d-md-inline">Next Item</span>
|
||||||
|
<svg class="bi icon-sprite" role="img" aria-label="Next Item">
|
||||||
|
<use xlink:href="{{ '/assets/css/cb-icons.svg' | relative_url }}#arrow-right"/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-8">
|
||||||
|
<div class="card mb-4 text-center">
|
||||||
|
<div class="m-2">
|
||||||
|
{% if child.display_template == 'image' %}
|
||||||
|
{% include item/child/image-gallery.html %}
|
||||||
|
{% elsif child.display_template == 'video' %}
|
||||||
|
{% if child.object_location contains 'vimeo' or child.object_location contains 'youtu' %}
|
||||||
|
{% include item/child/video-embed.html %}
|
||||||
|
{% else %}
|
||||||
|
{% include item/child/video-player.html %}
|
||||||
|
{% endif %}
|
||||||
|
{% elsif child.display_template == 'audio' %}
|
||||||
|
<div class="my-auto">
|
||||||
|
{% include item/child/audio-player.html %}
|
||||||
|
</div>
|
||||||
|
{% elsif child.display_template == 'panorama' %}
|
||||||
|
{% include item/child/panorama.html %}
|
||||||
|
{% else %}
|
||||||
|
{% include item/child/item-thumb.html %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="my-2">
|
||||||
|
{% include item/child/download-buttons.html %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
{% include item/child/metadata.html %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row justify-content-center mt-4">
|
||||||
|
<div class="col-md-5 py-4">
|
||||||
|
{% include item/child/citation-box.html %}
|
||||||
|
</div>
|
||||||
|
{% if child.rights or child.rightsstatement %}
|
||||||
|
<div class="col-md-5 py-4">
|
||||||
|
{% include item/child/rights-box.html %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- end child modal -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function stopMedia(objectid, type) {
|
||||||
|
// stop media based on type
|
||||||
|
if (type == "audio") {
|
||||||
|
const mediaElement = document.querySelector(`#${ objectid } audio`);
|
||||||
|
mediaElement.pause();
|
||||||
|
//mediaElement.currentTime = 0;
|
||||||
|
}
|
||||||
|
if (type == "video") {
|
||||||
|
const mediaElement = document.querySelector(`#${ objectid } video`);
|
||||||
|
mediaElement.pause();
|
||||||
|
//mediaElement.currentTime = 0;
|
||||||
|
}
|
||||||
|
if (type == "youtube") {
|
||||||
|
const mediaElement = document.querySelector(`#${ objectid } iframe`);
|
||||||
|
const message = JSON.stringify({ event: 'command', func: 'pauseVideo', args: '' });
|
||||||
|
mediaElement.contentWindow.postMessage(message, '*');
|
||||||
|
}
|
||||||
|
if (type == "vimeo") {
|
||||||
|
const mediaElement = document.querySelector(`#${ objectid } iframe`);
|
||||||
|
mediaElement.contentWindow.postMessage('{"method":"pause"}', '*');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
34
_includes/item/child/download-buttons.html
Normal file
34
_includes/item/child/download-buttons.html
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds child modal button links, styled as a Bootstrap btn-group.
|
||||||
|
Features:
|
||||||
|
- View Transcript -- if the item has the field "object_transcript", this button is added along with a Bootstrap collapse containing the transcript content. If the value of "object_transcript" starts with objects/ it will look for the matching transcript file in the objects fold, otherwise it will use the value directly. Both will be rendered in Markdown.
|
||||||
|
- View on Timeline -- if the item has a "date" value, links to Timeline page.
|
||||||
|
- View on Map -- if item has "latitude" and "longitude" value, links to location on map.
|
||||||
|
- Download -- if the item has "object_location" value, adds a download button along with the item format, or if the value is a YouTube or Vimeo link adds a "View on" link.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<div class="btn-group my-2" role="group" aria-label="Item options">
|
||||||
|
{% if child.object_transcript %}<button class="btn btn-outline-primary" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTranscript{{ child.objectid }}" aria-expanded="false" aria-controls="collapseTranscript{{ child.objectid }}">View Transcript</button>{% endif %}
|
||||||
|
{% if child.date %}{%- capture year -%}{% if child.date contains "-" %}{{ child.date | split: "-" | first }}{% elsif child.date contains "/" %}{{ child.date | split: "/" | last }}{% else %}{{ child.date }}{% endif %}{%- endcapture -%}
|
||||||
|
<a href="{{ year | strip | prepend: '/timeline.html#y' | relative_url }}" class="btn btn-outline-primary">View on Timeline</a>{% endif %}
|
||||||
|
{% if child.latitude and child.longitude %}
|
||||||
|
<a href="{{ '/map.html?location=' | append: page.latitude | append: ',' | append: page.longitude | append: '&marker=' | append: page.objectid | relative_url }}" class="btn btn-outline-primary">View on Map</a>{% endif %}
|
||||||
|
{% if child.object_location %}<a target="_blank" rel="noopener" href="{{ child.object_location | relative_url }}" class="btn btn-outline-primary">
|
||||||
|
{% if child.display_template == 'video' and child.object_location contains 'vimeo' %}View on Vimeo{% elsif child.display_template == 'video' and child.object_location contains 'youtu' %}View on YouTube{% elsif child.display_template == 'record'%}Link to Object{% else %}Download {{ child.format | split: '/' | last | default: page.display_template | upcase }}{% endif %}
|
||||||
|
</a>{% endif %}
|
||||||
|
</div>
|
||||||
|
{% if child.object_transcript %}
|
||||||
|
<div class="collapse mt-3" id="collapseTranscript{{ child.objectid }}">
|
||||||
|
<div class="card card-body text-start">
|
||||||
|
{% assign transcript_type = child.object_transcript | slice: 0,1 %}
|
||||||
|
{% if transcript_type == '/' %}
|
||||||
|
{% assign transcript_location = child.object_transcript | remove_first: '/' %}
|
||||||
|
{% assign transcript = site.pages | where: 'path', transcript_location | first %}
|
||||||
|
{{ transcript.content | markdownify }}
|
||||||
|
{% else %}
|
||||||
|
{{ child.object_transcript | markdownify }}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
27
_includes/item/child/ia-embed.html
Normal file
27
_includes/item/child/ia-embed.html
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Internet Archive item embed.
|
||||||
|
Loads a book/pdf, video, or audio item from Internet Archive via their standard iframe embed.
|
||||||
|
|
||||||
|
The item's "objects_location" must be the full public URL to the object on IA. The item url looks something like:
|
||||||
|
|
||||||
|
book, https://archive.org/details/uidaho_gem_1903
|
||||||
|
video, https://archive.org/details/fluxusfireplace
|
||||||
|
audio, https://archive.org/details/aladore_1704_librivox
|
||||||
|
|
||||||
|
The embed works for books/pdfs, video, and audio--however, you will want to tweak the aspect ratio for different item types!
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
- "ratio" = use Bootstrap embed ratio options "21x9", "16x9", "4x3", or "1x1" to customize the responsive aspect ratio if not using height. 4x3 is default. (optional)
|
||||||
|
- "height" = set embed object height in px (rather than responsive size), width will be 100%, e.g. "800px" (optional)
|
||||||
|
- "style" = apply an arbitrary style to the div containing the embed. This is useful if you are trying to add a min height or custom aspect ratio. (optional)
|
||||||
|
- min height is useful for book items on mobile, e.g. "min-height: 500px;"
|
||||||
|
- custom aspect ratio may be useful for book items, e.g. "--bs-aspect-ratio: %115;"
|
||||||
|
- both e.g. "min-height: 500px;--bs-aspect-ratio: calc(3 / 4 * 100%);"
|
||||||
|
|
||||||
|
{% endcomment %}
|
||||||
|
{% assign archive_id = child.object_location | split: '/' | last %}
|
||||||
|
<div class="{% unless include.height %}ratio ratio-{{ include.ratio | default: '4x3' }}{% endunless %}"{% if include.style %} style="{{ include.style }}"{% endif %}>
|
||||||
|
<iframe title="item embed for {{ child.title | escape }}" src="https://archive.org/embed/{{ archive_id }}" {% if include.height %}class="w-100" height="{{ include.height }}"{% endif %} frameborder="0" webkitallowfullscreen="true" mozallowfullscreen="true" allowfullscreen></iframe>
|
||||||
|
</div>`
|
||||||
10
_includes/item/child/image-gallery.html
Normal file
10
_includes/item/child/image-gallery.html
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds child image in a Spotlight gallery markup.
|
||||||
|
Ensure dependencies are added by including `gallery: true` in the layout front matter calling this include.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<a id="{{ child.objectid }}" class="spotlight gallery-img" {% if child.object_location %}data-download="true"{% endif %} title="{{ child.title | escape }}" href="{{ child.object_location | default: child.image_small | relative_url }}">
|
||||||
|
<img src="{{ child.image_small | relative_url }}" alt="{{ child.image_alt_text | default: child.description | default: child.title | escape }}" class="img-fluid">
|
||||||
|
<div><small class="text-dark">Click to view full screen</small></div>
|
||||||
|
</a>
|
||||||
17
_includes/item/child/item-thumb.html
Normal file
17
_includes/item/child/item-thumb.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Add a thumbnail image or icon based on format for a child item, with a object_location link (if available).
|
||||||
|
|
||||||
|
{% endcomment %}
|
||||||
|
{% if child.object_location %}<a href="{{ child.object_location | relative_url }}" target="_blank" rel="noopener">{% endif %}
|
||||||
|
{% if child.image_thumb or child.image_small %}
|
||||||
|
<img class="img-thumbnail" src="{{ child.image_small | default: child.image_thumb | relative_url }}" alt="{{ child.image_alt_text | default: child.description | default: child.title | escape }}">
|
||||||
|
{% else %}
|
||||||
|
<svg class="bi text-body" fill="currentColor" aria-hidden="true">
|
||||||
|
{%- assign icon_template = child.display_template | default: child.format -%}
|
||||||
|
<use xlink:href="{{ '/assets/css/cb-icons.svg' | relative_url }}#{% if icon_template contains 'image' %}icon-image{% elsif icon_template contains 'pdf' %}icon-pdf{% elsif icon_template contains 'audio' %}icon-audio{% elsif icon_template contains 'video' %}icon-video{% elsif icon_template contains 'record' %}icon-record{% else %}icon-default{% endif %}"/>
|
||||||
|
</svg>
|
||||||
|
<span class="visually-hidden">{{ child.title | escape }} - {{ child.format }}</span>
|
||||||
|
{% endif %}
|
||||||
|
{% if child.object_location %}</a>{% endif %}
|
||||||
|
|
||||||
25
_includes/item/child/metadata.html
Normal file
25
_includes/item/child/metadata.html
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds child metadata to child modal in a description list element.
|
||||||
|
Fields are configured via _data/config-metadata.csv
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{%- assign fields = site.data.config-metadata | where_exp: 'item', 'item.display_name != nil' -%}
|
||||||
|
<div id="item-metadata">
|
||||||
|
<dl>
|
||||||
|
{% for f in fields %}{% if child[f.field] %}
|
||||||
|
<dt class="field">{{ f.display_name }}:</dt>
|
||||||
|
<dd class="field-value">
|
||||||
|
{% if f.browse_link == "true" %}
|
||||||
|
{% assign topics = child[f.field] | split: ";" %}
|
||||||
|
{% for t in topics %}
|
||||||
|
<a class="me-3" href="{{ t | strip | url_param_escape | prepend: '/browse.html#' | relative_url }}">{{ t | strip }}</a>
|
||||||
|
{% endfor %}
|
||||||
|
{% elsif f.external_link == "true" %}
|
||||||
|
<a href="{{ child[f.field] }}">{{ child[f.field] }}</a>
|
||||||
|
{% else %}
|
||||||
|
{{ child[f.field] | replace: '""','"' }}{% endif %}
|
||||||
|
</dd>
|
||||||
|
{% endif %}{% endfor %}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
27
_includes/item/child/panorama.html
Normal file
27
_includes/item/child/panorama.html
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds a panorama image viewer using Pannellum for child modals.
|
||||||
|
Default is set for equirectangular projection types.
|
||||||
|
https://pannellum.org/documentation/reference/
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<link rel="stylesheet" href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/pannellum/pannellum.css">
|
||||||
|
<div id="panorama" class="ratio ratio-4x3 my-4"></div>
|
||||||
|
<script src="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/pannellum/pannellum.js"></script>
|
||||||
|
<script>
|
||||||
|
pannellum.viewer('panorama', {
|
||||||
|
"type": "equirectangular",
|
||||||
|
"panorama": "{{ child.object_location | relative_url }}",
|
||||||
|
"autoLoad": false,
|
||||||
|
/*
|
||||||
|
* Uncomment the next line to print the coordinates of mouse clicks
|
||||||
|
* to the browser's developer console, which makes it much easier
|
||||||
|
* to figure out where to place hot spots. Always remove it when
|
||||||
|
* finished, though.
|
||||||
|
*/
|
||||||
|
"hotSpotDebug": false,
|
||||||
|
"hotSpots": [
|
||||||
|
|
||||||
|
]
|
||||||
|
});
|
||||||
|
</script>
|
||||||
17
_includes/item/child/rights-box.html
Normal file
17
_includes/item/child/rights-box.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds a box to highlight rights information if child item has a "rights" or "rightsstatement" field.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<div class="card mb-2">
|
||||||
|
<div class="card-header">Rights</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<dl>
|
||||||
|
{% if child.rights %}<dt>Rights:</dt>
|
||||||
|
<dd>{{ child.rights }}</dd>{% endif %}
|
||||||
|
{% if child.rightsstatement %}<dt>Standardized Rights:</dt>
|
||||||
|
<dd><a href="{{ child.rightsstatement }}">{{ child.rightsstatement }}</a>
|
||||||
|
</dd>{% endif %}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
18
_includes/item/child/video-embed.html
Normal file
18
_includes/item/child/video-embed.html
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds an iframe video embed from a YouTube or Vimeo link given in child item's object_location.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{% if child.object_location contains 'vimeo' %}
|
||||||
|
{% assign vimeo_id = child.object_location | split: '/' | last %}
|
||||||
|
<div class="ratio ratio-16x9">
|
||||||
|
<iframe title="video embed {{ child.title | escape }}" src="https://player.vimeo.com/video/{{ vimeo_id }}" allowfullscreen></iframe>
|
||||||
|
</div>
|
||||||
|
{%- elsif child.object_location contains 'youtu' -%}
|
||||||
|
{% assign youtube_id = child.object_location | split: '/' | last %}
|
||||||
|
{% if youtube_id contains 'v=' %}{% assign youtube_id = youtube_id | split: 'v=' | last | split: '&' | first %}
|
||||||
|
{% elsif youtube_id contains '?' %}{% assign youtube_id = youtube_id | split: '?' | first %}{% endif %}
|
||||||
|
<div class="ratio ratio-16x9">
|
||||||
|
<iframe title="video embed {{ child.title | escape }}" src="https://www.youtube-nocookie.com/embed/{{ youtube_id }}?enablejsapi=1&rel=0&modestbranding=1" allowfullscreen></iframe>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
12
_includes/item/child/video-player.html
Normal file
12
_includes/item/child/video-player.html
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds html video element with source given in child's object_location.
|
||||||
|
Sizing is controlled using Bootstrap "ratio" styles.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<div class="ratio ratio-16x9">
|
||||||
|
<video {% if child.image_small %}poster="{{ child.image_small | relative_url }}" {% endif %}preload="metadata" controls>
|
||||||
|
<source src="{{ child.object_location | relative_url }}">
|
||||||
|
Your browser does not support the video tag.
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
14
_includes/item/citation-box.html
Normal file
14
_includes/item/citation-box.html
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds a basic citation box for the item with reference link to the item page.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">Attribution</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<dl>
|
||||||
|
<dt>Citation:</dt>
|
||||||
|
<dd>"{{ page.title }}", {{ site.title }}, {% if site.organization-name %}{{ site.organization-name }}, {% endif %}<a href="{{ page.url | absolute_url }}">{{ page.url | absolute_url }}</a></dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
34
_includes/item/download-buttons.html
Normal file
34
_includes/item/download-buttons.html
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds Item page button links, styled as a Bootstrap btn-group.
|
||||||
|
Features:
|
||||||
|
- View Transcript -- if the item has the field "object_transcript", this button is added along with a Bootstrap collapse containing the transcript content. If the value of "object_transcript" starts with objects/ it will look for the matching transcript file in the objects fold, otherwise it will use the value directly. Both will be rendered in Markdown.
|
||||||
|
- View on Timeline -- if the item has a "date" value, links to Timeline page.
|
||||||
|
- View on Map -- if item has "latitude" and "longitude" value, links to location on map.
|
||||||
|
- Download -- if the item has "object_location" value, adds a download button along with the item format, or if the value is a YouTube or Vimeo link adds a "View on" link.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<div class="btn-group" role="group" aria-label="Item options">
|
||||||
|
{% if page.object_transcript %}<button class="btn btn-outline-primary" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTranscript" aria-expanded="false" aria-controls="collapseTranscript">View Transcript</button>{% endif %}
|
||||||
|
{% if page.date %}{%- capture year -%}{% if page.date contains "-" %}{{ page.date | split: "-" | first }}{% elsif page.date contains "/" %}{{ page.date | split: "/" | last }}{% else %}{{ page.date }}{% endif %}{%- endcapture -%}
|
||||||
|
<a href="{{ year | strip | prepend: '/timeline.html#y' | relative_url }}" class="btn btn-outline-primary">View on Timeline</a>{% endif %}
|
||||||
|
{% if page.latitude and page.longitude %}
|
||||||
|
<a href="{{ '/map.html?location=' | append: page.latitude | append: ',' | append: page.longitude | append: '&marker=' | append: page.objectid | relative_url }}" class="btn btn-outline-primary">View on Map</a>{% endif %}
|
||||||
|
{% if page.object_location %}<a target="_blank" rel="noopener" href="{{ page.object_location | relative_url }}" class="btn btn-outline-primary">
|
||||||
|
{% if page.display_template == 'video' and page.object_location contains 'vimeo' %}View on Vimeo{% elsif page.display_template == 'video' and page.object_location contains 'youtu' %}View on YouTube{% elsif page.display_template == 'record'%}Link to Object{% else %}Download {{ page.format | split: '/' | last | default: page.display_template | upcase }}{% endif %}
|
||||||
|
</a>{% endif %}
|
||||||
|
</div>
|
||||||
|
{% if page.object_transcript %}
|
||||||
|
<div class="collapse mt-3" id="collapseTranscript">
|
||||||
|
<div class="card card-body text-start">
|
||||||
|
{% assign transcript_type = page.object_transcript | slice: 0,1 %}
|
||||||
|
{% if transcript_type == '/' %}
|
||||||
|
{% assign transcript_location = page.object_transcript | remove_first: '/' %}
|
||||||
|
{% assign transcript = site.pages | where: 'path', transcript_location | first %}
|
||||||
|
{{ transcript.content | markdownify }}
|
||||||
|
{% else %}
|
||||||
|
{{ page.object_transcript | markdownify }}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
27
_includes/item/ia-embed.html
Normal file
27
_includes/item/ia-embed.html
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Internet Archive item embed.
|
||||||
|
Loads a book/pdf, video, or audio item from Internet Archive via their standard iframe embed.
|
||||||
|
|
||||||
|
The item's "objects_location" must be the full public URL to the object on IA. The item url looks something like:
|
||||||
|
|
||||||
|
book, https://archive.org/details/uidaho_gem_1903
|
||||||
|
video, https://archive.org/details/fluxusfireplace
|
||||||
|
audio, https://archive.org/details/aladore_1704_librivox
|
||||||
|
|
||||||
|
The embed works for books/pdfs, video, and audio--however, you will want to tweak the aspect ratio for different item types!
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
- "ratio" = use Bootstrap embed ratio options "21x9", "16x9", "4x3", or "1x1" to customize the responsive aspect ratio if not using height. 4x3 is default. (optional)
|
||||||
|
- "height" = set embed object height in px (rather than responsive size), width will be 100%, e.g. "800px" (optional)
|
||||||
|
- "style" = apply an arbitrary style to the div containing the embed. This is useful if you are trying to add a min height or custom aspect ratio. (optional)
|
||||||
|
- min height is useful for book items on mobile, e.g. "min-height: 500px;"
|
||||||
|
- custom aspect ratio may be useful for book items, e.g. "--bs-aspect-ratio: %115;"
|
||||||
|
- both e.g. "min-height: 500px;--bs-aspect-ratio: calc(3 / 4 * 100%);"
|
||||||
|
|
||||||
|
{% endcomment %}
|
||||||
|
{% assign archive_id = page.object_location | split: '/' | last %}
|
||||||
|
<div class="{% unless include.height %}ratio ratio-{{ include.ratio | default: '4x3' }}{% endunless %}"{% if include.style %} style="{{ include.style }}"{% endif %}>
|
||||||
|
<iframe title="item embed for {{ page.title | escape }}" src="https://archive.org/embed/{{ archive_id }}" {% if include.height %}class="w-100" height="{{ include.height }}"{% endif %} frameborder="0" webkitallowfullscreen="true" mozallowfullscreen="true" allowfullscreen></iframe>
|
||||||
|
</div>`
|
||||||
20
_includes/item/iiif-manifest-universal-viewer.html
Normal file
20
_includes/item/iiif-manifest-universal-viewer.html
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Embed Universal Viewer to load item from an IIIF manifest file, https://github.com/UniversalViewer/universalviewer
|
||||||
|
This include assumes that Item's object_location field is a relative link or direct url to a IIIF manifest json file. e.g. https://wellcomelibrary.org/iiif/b18035723/manifest
|
||||||
|
If you are using an external manifest url, you may encounter CORS policy error if the server hosting the manifest is not set up correctly--one workaround is to download the json file, add to your "objects" folder, and use a relative link, e.g. "objects/book-manifest1.json". You do not need the images, just the manifest file!
|
||||||
|
|
||||||
|
{% endcomment %}
|
||||||
|
<!-- add IIIF Universal Viewer assets from CDN -->
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/universalviewer@4.0.0/dist/uv.css"/>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/universalviewer@4.0.0/dist/umd/UV.js"></script>
|
||||||
|
<!-- add div for viewer -->
|
||||||
|
<div class="uv" id="uv" style="width: 100%; height: 668px;"></div>
|
||||||
|
<script>
|
||||||
|
// initialize Universal Viewer
|
||||||
|
var uvOptions = {
|
||||||
|
manifest: {{ page.object_location | relative_url | jsonify }}
|
||||||
|
// add options here!
|
||||||
|
};
|
||||||
|
var iiif_viewer = UV.init("uv", uvOptions);
|
||||||
|
</script>
|
||||||
10
_includes/item/image-gallery.html
Normal file
10
_includes/item/image-gallery.html
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
For image items, a zoomable, full screen gallery view is added using Spotlight gallery.
|
||||||
|
Ensure dependencies are added by including `gallery: true` in the layout front matter calling this include.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<a id="{{ page.objectid }}" class="spotlight gallery-img" {% if page.object_location %}data-download="true"{% endif %} title="{{ page.title | escape }}" href="{{ page.object_location | default: page.image_small | relative_url }}">
|
||||||
|
<img src="{{ page.image_small | relative_url }}" alt="{{ page.image_alt_text | default: page.description | default: page.title | escape }}" class="img-fluid">
|
||||||
|
<div><small class="text-dark">Click to view full screen</small></div>
|
||||||
|
</a>
|
||||||
16
_includes/item/item-thumb.html
Normal file
16
_includes/item/item-thumb.html
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Add a thumbnail image or icon based on format for an item, with a object_location link (if available).
|
||||||
|
|
||||||
|
{% endcomment %}
|
||||||
|
{% if page.object_location %}<a href="{{ page.object_location | relative_url }}" target="_blank" rel="noopener">{% endif %}
|
||||||
|
{% if page.image_thumb or page.image_small %}
|
||||||
|
<img class="img-thumbnail" src="{{ page.image_small | default: page.image_thumb | relative_url }}" alt="{{ page.image_alt_text | default: page.description | default: page.title | escape }}">
|
||||||
|
{% else %}
|
||||||
|
<svg class="bi text-body" fill="currentColor" aria-hidden="true">
|
||||||
|
{%- assign icon_template = page.display_template | default: page.format -%}
|
||||||
|
<use xlink:href="{{ '/assets/css/cb-icons.svg' | relative_url }}#{% if icon_template contains 'image' %}icon-image{% elsif icon_template contains 'pdf' %}icon-pdf{% elsif icon_template contains 'audio' %}icon-audio{% elsif icon_template contains 'video' %}icon-video{% elsif icon_template contains 'record' %}icon-record{% else %}icon-default{% endif %}"/>
|
||||||
|
</svg>
|
||||||
|
<span class="visually-hidden">{{ page.title | escape }} - {{ page.format }}</span>
|
||||||
|
{% endif %}
|
||||||
|
{% if page.object_location %}</a>{% endif %}
|
||||||
25
_includes/item/metadata.html
Normal file
25
_includes/item/metadata.html
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds metadata to item pages in a description list element.
|
||||||
|
Fields are configured via _data/config-metadata.csv
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{%- assign fields = site.data.config-metadata | where_exp: 'item', 'item.display_name != nil' -%}
|
||||||
|
<div id="item-metadata">
|
||||||
|
<dl>
|
||||||
|
{% for f in fields %}{% if page[f.field] %}
|
||||||
|
<dt class="field">{{ f.display_name }}:</dt>
|
||||||
|
<dd class="field-value">
|
||||||
|
{% if f.browse_link == "true" %}
|
||||||
|
{% assign topics = page[f.field] | split: ";" %}
|
||||||
|
{% for t in topics %}
|
||||||
|
<a class="me-3" href="{{ t | strip | url_param_escape | prepend: ':' | prepend: f.field | prepend: '/browse.html#' | relative_url }}">{{ t | strip }}</a>
|
||||||
|
{% endfor %}
|
||||||
|
{% elsif f.external_link == "true" %}
|
||||||
|
<a href="{{ page[f.field] }}">{{ page[f.field] }}</a>
|
||||||
|
{% else %}
|
||||||
|
{{ page[f.field] | replace: '""','"' }}{% endif %}
|
||||||
|
</dd>
|
||||||
|
{% endif %}{% endfor %}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
59
_includes/item/mini-map.html
Normal file
59
_includes/item/mini-map.html
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds a Leaflet map featuring a single marker based on the item's lat long.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- "map-marker" = true/false, add a marker using the item's lat long and title (default true)
|
||||||
|
- "map-height" = height of the mini map in px (default 400px)
|
||||||
|
- "map-zoom" = provide a zoom level, default 10
|
||||||
|
- "map-link" = true/false, add a button link to the collection's default full map page (default false)
|
||||||
|
|
||||||
|
{% endcomment %}
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#mini-map { height: {{ include.map-height | default: '400px' }}; z-index: 98; }
|
||||||
|
</style>
|
||||||
|
<div id="mini-map"></div>
|
||||||
|
{% if include.map-link == true %}
|
||||||
|
<a href="{{ '/map.html?location=' | append: page.latitude | append: ',' | append: page.longitude | append: '&marker=' | append: page.objectid | relative_url }}" class="btn btn-outline-primary my-3">View on Full Map</a>{% endif %}
|
||||||
|
<!-- load leaflet dependencies -->
|
||||||
|
<link rel="stylesheet" href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/leaflet/leaflet.css">
|
||||||
|
<link rel="stylesheet" href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/leaflet/leaflet.fullscreen.css">
|
||||||
|
<script src="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/leaflet/leaflet.js"></script>
|
||||||
|
<script src="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/leaflet/Leaflet.fullscreen.min.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// initial start point
|
||||||
|
var mapCenter = [{{ page.latitude }}, {{ page.longitude }}];
|
||||||
|
var mapZoom = {{ include.map-zoom | default: 10 }};
|
||||||
|
/* init map, set center and zoom */
|
||||||
|
var map = L.map('mini-map').setView(mapCenter, mapZoom);
|
||||||
|
|
||||||
|
/* add map layer options */
|
||||||
|
var Esri_WorldStreetMap = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}', {
|
||||||
|
attribution: 'Tiles © Esri — Source: Esri, DeLorme, NAVTEQ, USGS, Intermap, iPC, NRCAN, Esri Japan, METI, Esri China (Hong Kong), Esri (Thailand), TomTom, 2012'
|
||||||
|
});
|
||||||
|
var Esri_NatGeoWorldMap = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}', {
|
||||||
|
attribution: 'Tiles © Esri — National Geographic, Esri, DeLorme, NAVTEQ, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, iPC',
|
||||||
|
maxZoom: 16
|
||||||
|
});
|
||||||
|
var Esri_WorldImagery = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {
|
||||||
|
attribution: 'Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community'
|
||||||
|
});
|
||||||
|
/* add base map switcher */
|
||||||
|
var baseMaps = {
|
||||||
|
"Esri World StreetMap": Esri_WorldStreetMap,
|
||||||
|
"Esri National Geo": Esri_NatGeoWorldMap,
|
||||||
|
"Esri Imagery": Esri_WorldImagery
|
||||||
|
};
|
||||||
|
L.control.layers(baseMaps).addTo(map);
|
||||||
|
/* load base map */
|
||||||
|
Esri_WorldImagery.addTo(map);
|
||||||
|
/* add fullscreen control */
|
||||||
|
map.addControl(new L.Control.Fullscreen());
|
||||||
|
{% unless include.map-marker == false %}
|
||||||
|
/* add marker */
|
||||||
|
L.marker(mapCenter).addTo(map)
|
||||||
|
.bindPopup('{{ page.title | escape }}');{% endunless %}
|
||||||
|
|
||||||
|
</script>
|
||||||
27
_includes/item/panorama.html
Normal file
27
_includes/item/panorama.html
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds a panorama image viewer using Pannellum.
|
||||||
|
Default is set for equirectangular projection types.
|
||||||
|
https://pannellum.org/documentation/reference/
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<link rel="stylesheet" href="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/pannellum/pannellum.css">
|
||||||
|
<div id="panorama" class="ratio ratio-4x3 my-4"></div>
|
||||||
|
<script src="{{ site.lib-assets | default: '/assets/lib' | relative_url }}/pannellum/pannellum.js"></script>
|
||||||
|
<script>
|
||||||
|
pannellum.viewer('panorama', {
|
||||||
|
"type": "equirectangular",
|
||||||
|
"panorama": "{{ page.object_location | relative_url }}",
|
||||||
|
"autoLoad": false,
|
||||||
|
/*
|
||||||
|
* Uncomment the next line to print the coordinates of mouse clicks
|
||||||
|
* to the browser's developer console, which makes it much easier
|
||||||
|
* to figure out where to place hot spots. Always remove it when
|
||||||
|
* finished, though.
|
||||||
|
*/
|
||||||
|
"hotSpotDebug": false,
|
||||||
|
"hotSpots": [
|
||||||
|
|
||||||
|
]
|
||||||
|
});
|
||||||
|
</script>
|
||||||
12
_includes/item/pdf-embed.html
Normal file
12
_includes/item/pdf-embed.html
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Embed PDF so that it directly loads on the item page.
|
||||||
|
Please note that embedding large PDFs will slow your user's accessing the page.
|
||||||
|
Size is controlled using Bootstrap Custom ratios, https://getbootstrap.com/docs/5.3/helpers/ratio/#custom-ratios
|
||||||
|
|
||||||
|
{% endcomment %}
|
||||||
|
<div class="ratio" style="--bs-aspect-ratio: 115%;">
|
||||||
|
<object title="PDF file of {{ page.title }}" data="{{ page.object_location | relative_url }}" type="application/pdf" width="100%" >
|
||||||
|
<p>The PDF is not rendering in your browser, please use the button below to download the PDF.</p>
|
||||||
|
</object>
|
||||||
|
</div>
|
||||||
17
_includes/item/rights-box.html
Normal file
17
_includes/item/rights-box.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds a box to highlight rights information if item has a "rights" or "rightsstatement" field.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">Rights</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<dl>
|
||||||
|
{% if page.rights %}<dt>Rights:</dt>
|
||||||
|
<dd>{{ page.rights }}</dd>{% endif %}
|
||||||
|
{% if page.rightsstatement %}<dt>Standardized Rights:</dt>
|
||||||
|
<dd><a href="{{ page.rightsstatement }}">{{ page.rightsstatement }}</a>
|
||||||
|
</dd>{% endif %}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
19
_includes/item/video-embed.html
Normal file
19
_includes/item/video-embed.html
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds an iframe video embed from a YouTube or Vimeo link given in object_location.
|
||||||
|
Sizing is controlled using Bootstrap "ratio" sizing.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
{% if page.object_location contains 'vimeo' %}
|
||||||
|
{% assign vimeo_id = page.object_location | split: '/' | last %}
|
||||||
|
<div class="ratio ratio-16x9">
|
||||||
|
<iframe title="video embed {{ page.title | escape }}" src="https://player.vimeo.com/video/{{ vimeo_id }}" allowfullscreen></iframe>
|
||||||
|
</div>
|
||||||
|
{%- elsif page.object_location contains 'youtu' -%}
|
||||||
|
{% assign youtube_id = page.object_location | split: '/' | last %}
|
||||||
|
{% if youtube_id contains 'v=' %}{% assign youtube_id = youtube_id | split: 'v=' | last | split: '&' | first %}
|
||||||
|
{% elsif youtube_id contains '?' %}{% assign youtube_id = youtube_id | split: '?' | first %}{% endif %}
|
||||||
|
<div class="ratio ratio-16x9">
|
||||||
|
<iframe title="video embed {{ page.title | escape }}" src="https://www.youtube-nocookie.com/embed/{{ youtube_id }}?rel=0&modestbranding=1" allowfullscreen></iframe>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
12
_includes/item/video-player.html
Normal file
12
_includes/item/video-player.html
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{% comment %}
|
||||||
|
|
||||||
|
Adds html video element with source given in object_location.
|
||||||
|
Sizing is controlled using Bootstrap "ratio" styles.
|
||||||
|
|
||||||
|
{%- endcomment -%}
|
||||||
|
<div class="ratio ratio-16x9">
|
||||||
|
<video {% if page.image_small %}poster="{{ page.image_small | relative_url }}" {% endif %}preload="metadata" controls>
|
||||||
|
<source src="{{ page.object_location | relative_url }}">
|
||||||
|
Your browser does not support the video tag. Please <a href="{{ page.object_location | relative_url }}">download the video file</a>.
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
1048
_includes/js/browse-js.html
Normal file
1048
_includes/js/browse-js.html
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user