Skip to content

Commit

Permalink
Merge pull request #220 from 18F/private-eye
Browse files Browse the repository at this point in the history
Added private eye
  • Loading branch information
afeld authored Jan 29, 2021
2 parents 33c2ec2 + e815cc8 commit e93b9ab
Show file tree
Hide file tree
Showing 10 changed files with 204 additions and 32 deletions.
4 changes: 2 additions & 2 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PATH
remote: .
specs:
uswds-jekyll (5.2.0)
uswds-jekyll (5.3.0)
jekyll (>= 4.0, < 5)
jekyll-autoprefixer
mini_racer
Expand Down Expand Up @@ -88,4 +88,4 @@ DEPENDENCIES
uswds-jekyll!

BUNDLED WITH
2.1.4
2.2.5
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ This is a [Jekyll theme](https://jekyllrb.com/docs/themes/) for the
- [Analytics](#analytics)
- [Last modified date](#last-modified-date)
- [Anchor JS](#anchor-js)
- [Private Eye JS](#private-eye-js)
1. [Assets](#assets)
- [Stylesheets](#stylesheets)
- [Scripts](#scripts)
Expand Down Expand Up @@ -311,6 +312,14 @@ You can show an anchor link next to header tags by uncommenting this section fro
# anchor_js_targets: [h1, h2, h3, h4, h5, h6]
```

### Private Eye JS

By default, the USWDS Jekyll theme uses [Private Eye](https://github.com/18F/private-eye) to denote private links. You can turn this off with the setting below. If you would like to customize the default Private Eye configuration, you can find it in `/assets/js/private_eye_conf.js`.

```yml
private_eye: false
```
## Assets
The [stylesheet](_includes/styles.html) and [script](_includes/scripts.html) includes each incorporate the USWDS CSS and JS files if the corresponding `styles` and `scripts` lists aren't defined in your `_config.yml`. So unless you add one or both of those manually, your HTML will include the following:
Expand Down
5 changes: 5 additions & 0 deletions _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ github_info:
# See https://github.com/bryanbraun/anchorjs for more information.
# anchor_js_targets: [h1, h2, h3, h4, h5, h6]

# Enables Private Eye functionality.
# See https://github.com/18F/private-eye for more information.
# Private Eye configuration is in assets/js/main.js
private_eye: true

# To enable search, uncomment the search section
# You will need to setup a search account with search.gov
# https://search.usa.gov/signup
Expand Down
25 changes: 16 additions & 9 deletions _includes/scripts.html
Original file line number Diff line number Diff line change
@@ -1,18 +1,25 @@
<!-- dynamically determine scripts needed for this config -->
{% assign _scripts = '' | split: '' %}
{% assign _async_marker = 'uswds_async=true' %}
{% assign _site_scripts = site.scripts %}
{% unless _site_scripts -%}
{% assign _uswds_js = '/assets/uswds/js/uswds.min.js' | append: '?' | append: _async_marker %}
{% assign _site_scripts = '' | split: ''
| push: _uswds_js %}
{% if site.anchor_js_targets %}
{% assign _anchor_js = '/assets/js/vendor/anchor.min.js' %}
{% assign _main_js = '/assets/js/main.js' %}
{% assign _site_scripts = _site_scripts
| push: _anchor_js
| push: _main_js %}
{% endif %}
{% assign _site_scripts = '' | split: '' | push: _uswds_js %}
{% if site.anchor_js_targets %}
{% assign _anchor_js = '/assets/js/vendor/anchor.min.js' %}
{% assign _anchor_conf_js = '/assets/js/anchor.js' %}
{% assign _site_scripts = _site_scripts
| push: _anchor_js
| push: _main_js %}
{% endif %}
{% endunless %}
{% if site.private_eye %}
{% assign _pi_js = '/assets/js/vendor/private_eye.js' %}
{% assign _pi_conf_js = '/assets/js/private_eye_conf.js' %}
{% assign _site_scripts = _site_scripts
| push: _pi_js
| push: _pi_conf_js %}
{% endif %}
{% assign _scripts = _scripts
| push: _site_scripts
| push: layout.scripts
Expand Down
File renamed without changes.
39 changes: 39 additions & 0 deletions assets/js/private_eye_conf.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@

document.addEventListener('DOMContentLoaded', function() {
PrivateEye({
defaultMessage: "This link is private to TTS.",
ignoreUrls: [
'18f.slack.com',
'anywhere.gsa.gov',
'bookit.gsa.gov',
'calendar.gsa.gov',
'connect.gsa.gov',
'docs.google.com',
'drive.google.com',
'ea.gsa.gov',
'email.gsa.gov',
'eopf.opm.gov',
'gcims.gsa.gov',
'github.com/18F/Accessibility_Reviews',
'github.com/18F/blog-drafts',
'github.com/18F/codereviews',
'github.com/18F/DevOps',
'github.com/18F/Infrastructure',
'github.com/18F/security-incidents',
'github.com/18F/staffing',
'github.com/18F/team-api.18f.gov',
'github.com/18F/writing-lab',
'gkey.gsa.gov',
'gsa-tts.slack.com',
'gsa.my.salesforce.com',
'gsaolu.gsa.gov',
'hrlinks.gsa.gov',
'hrprod.hr.gsa.gov',
'insite.gsa.gov',
'mail.gsa.gov',
'meet.gsa.gov',
'sign.gsa.gov',
'tock.18f.gov'
]
});
}, false );
106 changes: 106 additions & 0 deletions assets/js/vendor/private_eye.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
// https://github.com/18F/private-eye
(function() {
'use strict';

// The line below differs from private eye v2.0. We need to update the source file.
var STYLES = 'a.private-link::after { content: "\\1F512"; font-size: 0.75em; text-decoration: none }';
var STYLES_ID = '_privateEye-styles';

var DEFAULT_OPTIONS = {
defaultMessage: 'This is a link to a private site, which may or may not be accessible to you.',
wrapper: ''
};

var isString = function(str) { return !!str && typeof str === 'string'; };
var isArray = function(arr) { return !!arr && arr.length; };

var optionValidators = {
defaultMessage: isString,
wrapper: isString,
ignoreUrls: isArray,
};

function setStyles() {
var styles = document.createElement('style');
styles.innerHTML = STYLES;
styles.id = STYLES_ID;
document.body.appendChild(styles);
}

function getOptions(opts) {
var newObj = {};

for (var prop in DEFAULT_OPTIONS) {
newObj[prop] = DEFAULT_OPTIONS[prop];
}

for (var prop in opts) {
var val = opts[prop];

if (optionValidators[prop](val)) {
newObj[prop] = val;
}
}

return newObj;
}

var PrivateEye = function(opts) {
// The old docs recommend calling this as a function. This is here to detect
// those cases and make sure backward compatibility stays intact now that the
// new syntax is preferred.
if (!(this instanceof PrivateEye)) {
return new PrivateEye(opts);
}

// Don't add the styles to the page more than once.
if (!document.getElementById(STYLES_ID)) {
setStyles();
}

this.opts = getOptions(opts);

this.checkLinks();
};

PrivateEye.prototype.checkLinks = function() {
var self = this;

this.opts.ignoreUrls.forEach(function(url) {
var hrefValue;
var titleValue;

// If the `url` is an Object, then parse the properties `message` & `url`
if (url === Object(url)) {
titleValue = url.message;
hrefValue = url.url;
} else {
hrefValue = url;
titleValue = self.opts.defaultMessage;
}

var wrapper = self.opts.wrapper.length ? self.opts.wrapper + ' ' : '';
var selector = wrapper + 'a';
var anchors = document.querySelectorAll(selector);

Array.prototype.forEach.call(anchors, function(anchor) {
var anchorHref = anchor.href.toLowerCase().trim();

if (anchorHref.indexOf(hrefValue.toLowerCase()) !== -1) {
anchor.className += ' private-link';

// Only replace the anchor's title if it is empty
if (!anchor.title) {
anchor.title = titleValue;
}
}
});
});
}

if (typeof module === 'object' && typeof module.exports === 'object') {
module.exports = PrivateEye;
} else {
window.PrivateEye = PrivateEye;
}
})();
45 changes: 25 additions & 20 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"sync-sass": "rsync -avr --delete node_modules/uswds/src/stylesheets/ _sass/uswds/src/"
},
"dependencies": {
"@18f/private-eye": "^2.0.0",
"uswds": "^2.9.0"
},
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion uswds-jekyll.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Gem::Specification.new do |s|
s.name = 'uswds-jekyll'
s.version = '5.2.0'
s.version = '5.3.0'
s.authors = ['Shawn Allen', 'Tom Black', 'Brian Hurst', 'Scott Weber', 'Dan O. Williams']
s.email = ['[email protected]']

Expand Down

0 comments on commit e93b9ab

Please sign in to comment.