Comparing version 3.0.0 to 3.1.0
/** | ||
* AnchorJS - v3.0.0 - 2016-01-24 | ||
* AnchorJS - v3.1.0 - 2016-02-12 | ||
* https://github.com/bryanbraun/anchorjs | ||
* Copyright (c) 2015 Bryan Braun; Licensed MIT | ||
* Copyright (c) 2016 Bryan Braun; Licensed MIT | ||
*/ | ||
@@ -10,2 +10,3 @@ | ||
this.options = options || {}; | ||
this.elements = []; | ||
@@ -38,4 +39,5 @@ /** | ||
* Add anchor links to page elements. | ||
* @param {String} selector A CSS selector for targeting the elements you wish to add anchor links to. | ||
* @return {this} The AnchorJS object | ||
* @param {String|Array|Nodelist} selector - A CSS selector for targeting the elements you wish to add anchor links | ||
* to. Also accepts an array or nodeList containing the relavant elements. | ||
* @return {this} - The AnchorJS object | ||
*/ | ||
@@ -54,3 +56,4 @@ this.add = function(selector) { | ||
anchor, | ||
visibleOptionToUse; | ||
visibleOptionToUse, | ||
indexesToDrop = []; | ||
@@ -71,7 +74,6 @@ // We reapply options here because somebody may have overwritten the default options object when setting options. | ||
selector = 'h1, h2, h3, h4, h5, h6'; | ||
} else if (typeof selector !== 'string') { | ||
throw new Error('The selector provided to AnchorJS was invalid.'); | ||
} | ||
elements = document.querySelectorAll(selector); | ||
elements = _getElements(selector); | ||
if (elements.length === 0) { | ||
@@ -90,2 +92,6 @@ return false; | ||
for (i = 0; i < elements.length; i++) { | ||
if (this.hasAnchorJSLink(elements[i])) { | ||
indexesToDrop.push(i); | ||
continue; | ||
} | ||
@@ -106,3 +112,2 @@ if (elements[i].hasAttribute('id')) { | ||
// .indexOf is only supported in IE9+. | ||
index = idList.indexOf(newTidyText); | ||
@@ -114,6 +119,3 @@ count += 1; | ||
// Assign it to our element. | ||
// Currently the setAttribute element is only supported in IE9 and above. | ||
elements[i].setAttribute('id', newTidyText); | ||
elementID = newTidyText; | ||
@@ -163,2 +165,7 @@ } | ||
for (i = 0; i < indexesToDrop.length; i++) { | ||
elements.splice(indexesToDrop[i] - i, 1); | ||
} | ||
this.elements = this.elements.concat(elements); | ||
return this; | ||
@@ -169,11 +176,20 @@ }; | ||
* Removes all anchorjs-links from elements targed by the selector. | ||
* @param {String} selector A CSS selector used to target elements containing anchor links. | ||
* @return {this} The AnchorJS object | ||
* @param {String|Array|Nodelist} selector - A CSS selector string targeting elements with anchor links, | ||
* OR a nodeList / array containing the DOM elements. | ||
* @return {this} - The AnchorJS object | ||
*/ | ||
this.remove = function(selector) { | ||
var domAnchor, | ||
elements = document.querySelectorAll(selector); | ||
var index, | ||
domAnchor, | ||
elements = _getElements(selector); | ||
for (var i = 0; i < elements.length; i++) { | ||
domAnchor = elements[i].querySelector('.anchorjs-link'); | ||
if (domAnchor) { | ||
// Drop the element from our main list, if it's in there. | ||
index = this.elements.indexOf(elements[i]); | ||
if (index !== -1) { | ||
this.elements.splice(index, 1); | ||
} | ||
// Remove the anchor from the DOM. | ||
elements[i].removeChild(domAnchor); | ||
@@ -186,2 +202,9 @@ } | ||
/** | ||
* Removes all anchorjs links. Mostly used for tests. | ||
*/ | ||
this.removeAll = function() { | ||
this.remove(this.elements); | ||
}; | ||
/** | ||
* Urlify - Refine text so it makes a good ID. | ||
@@ -193,3 +216,2 @@ * | ||
* @param {String} text - Any text. Usually pulled from the webpage element we are linking to. | ||
* @param {?Object} options - Optional option overrides. | ||
* @return {String} - hyphen-delimited text for use in IDs and URLs. | ||
@@ -222,2 +244,36 @@ */ | ||
/** | ||
* Determines if this element already has an AnchorJS link on it. | ||
* Uses this technique: http://stackoverflow.com/a/5898748/1154642 | ||
* @param {HTMLElemnt} el - a DOM node | ||
* @return {Boolean} true/false | ||
*/ | ||
this.hasAnchorJSLink = function(el) { | ||
var hasLeftAnchor = (' ' + el.firstChild.className + ' ').indexOf(' anchorjs-link ') > -1, | ||
hasRightAnchor = (' ' + el.lastChild.className + ' ').indexOf(' anchorjs-link ') > -1; | ||
return hasLeftAnchor || hasRightAnchor; | ||
}; | ||
/** | ||
* Turns a selector, nodeList, or array of elements into an array of elements (so we can use array methods). | ||
* It also throws errors on any other inputs. Used to handle inputs to .add and .remove. | ||
* @param {String|Array|Nodelist} input - A CSS selector string targeting elements with anchor links, | ||
* OR a nodeList / array containing the DOM elements. | ||
* @return {Array} - An array containing the elements we want. | ||
*/ | ||
function _getElements(input) { | ||
var elements; | ||
if (typeof input === 'string' || input instanceof String) { | ||
// See https://davidwalsh.name/nodelist-array for the technique transforming nodeList -> Array. | ||
elements = [].slice.call(document.querySelectorAll(input)); | ||
// I checked the 'input instanceof NodeList' test in IE9 and modern browsers and it worked for me. | ||
} else if (Array.isArray(input) || input instanceof NodeList) { | ||
elements = [].slice.call(input); | ||
} else { | ||
throw new Error('The selector provided to AnchorJS was invalid.'); | ||
} | ||
return elements; | ||
} | ||
/** | ||
* _addBaselineStyles | ||
@@ -224,0 +280,0 @@ * Adds baseline styles to the page, used by all AnchorJS links irregardless of configuration. |
/** | ||
* AnchorJS - v3.0.0 - 2016-01-24 | ||
* AnchorJS - v3.1.0 - 2016-02-12 | ||
* https://github.com/bryanbraun/anchorjs | ||
* Copyright (c) 2015 Bryan Braun; Licensed MIT | ||
* Copyright (c) 2016 Bryan Braun; Licensed MIT | ||
*/ | ||
function AnchorJS(A){"use strict";function t(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.hasOwnProperty("visible")?A.visible:"hover",A.placement=A.hasOwnProperty("placement")?A.placement:"right",A.class=A.hasOwnProperty("class")?A.class:"",A.truncate=A.hasOwnProperty("truncate")?Math.floor(A.truncate):64}function e(){if(null===document.head.querySelector("style.anchorjs")){var A,t=document.createElement("style"),e=" .anchorjs-link { opacity: 0; text-decoration: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }",o=" *:hover > .anchorjs-link, .anchorjs-link:focus { opacity: 1; }",n=' @font-face { font-family: "anchorjs-icons"; font-style: normal; font-weight: normal; src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBTUAAAC8AAAAYGNtYXAWi9QdAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zgq29TcAAAF4AAABNGhlYWQEZM3pAAACrAAAADZoaGVhBhUDxgAAAuQAAAAkaG10eASAADEAAAMIAAAAFGxvY2EAKACuAAADHAAAAAxtYXhwAAgAVwAAAygAAAAgbmFtZQ5yJ3cAAANIAAAB2nBvc3QAAwAAAAAFJAAAACAAAwJAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpywPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6cv//f//AAAAAAAg6cv//f//AAH/4xY5AAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAACADEARAJTAsAAKwBUAAABIiYnJjQ/AT4BMzIWFxYUDwEGIicmND8BNjQnLgEjIgYPAQYUFxYUBw4BIwciJicmND8BNjIXFhQPAQYUFx4BMzI2PwE2NCcmNDc2MhcWFA8BDgEjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAEAAAABAACiToc1Xw889QALBAAAAAAA0XnFFgAAAADRecUWAAAAAAJTAsAAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAAlMAAQAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAACAAAAAoAAMQAAAAAACgAUAB4AmgABAAAABQBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIABwCfAAEAAAAAAAMADgBLAAEAAAAAAAQADgC0AAEAAAAAAAUACwAqAAEAAAAAAAYADgB1AAEAAAAAAAoAGgDeAAMAAQQJAAEAHAAOAAMAAQQJAAIADgCmAAMAAQQJAAMAHABZAAMAAQQJAAQAHADCAAMAAQQJAAUAFgA1AAMAAQQJAAYAHACDAAMAAQQJAAoANAD4YW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzUmVndWxhcgBSAGUAZwB1AGwAYQByYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format("truetype"); }',i=" [data-anchorjs-icon]::after { content: attr(data-anchorjs-icon); }";t.className="anchorjs",t.appendChild(document.createTextNode("")),A=document.head.querySelector('[rel="stylesheet"], style'),void 0===A?document.head.appendChild(t):document.head.insertBefore(t,A),t.sheet.insertRule(e,t.sheet.cssRules.length),t.sheet.insertRule(o,t.sheet.cssRules.length),t.sheet.insertRule(i,t.sheet.cssRules.length),t.sheet.insertRule(n,t.sheet.cssRules.length)}}this.options=A||{},t(this.options),this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)},this.add=function(A){var o,n,i,s,a,r,c,l,h,g,u,B;if(t(this.options),B=this.options.visible,"touch"===B&&(B=this.isTouchDevice()?"always":"hover"),A){if("string"!=typeof A)throw new Error("The selector provided to AnchorJS was invalid.")}else A="h1, h2, h3, h4, h5, h6";if(o=document.querySelectorAll(A),0===o.length)return!1;for(e(),n=document.querySelectorAll("[id]"),i=[].map.call(n,function(A){return A.id}),a=0;a<o.length;a++){if(o[a].hasAttribute("id"))s=o[a].getAttribute("id");else{l=this.urlify(o[a].textContent),h=l,c=0;do void 0!==r&&(h=l+"-"+c),r=i.indexOf(h),c+=1;while(-1!==r);r=void 0,i.push(h),o[a].setAttribute("id",h),s=h}g=s.replace(/-/g," "),u=document.createElement("a"),u.className="anchorjs-link "+this.options.class,u.href="#"+s,u.setAttribute("aria-label","Anchor link for: "+g),u.setAttribute("data-anchorjs-icon",this.options.icon),"always"===B&&(u.style.opacity="1"),""===this.options.icon&&(u.style.fontFamily="anchorjs-icons",u.style.fontStyle="normal",u.style.fontVariant="normal",u.style.fontWeight="normal",u.style.lineHeight=1,"left"===this.options.placement&&(u.style.lineHeight="inherit")),"left"===this.options.placement?(u.style.position="absolute",u.style.marginLeft="-1em",u.style.paddingRight="0.5em",o[a].insertBefore(u,o[a].firstChild)):(u.style.paddingLeft="0.375em",o[a].appendChild(u))}return this},this.remove=function(A){for(var t,e=document.querySelectorAll(A),o=0;o<e.length;o++)t=e[o].querySelector(".anchorjs-link"),t&&e[o].removeChild(t);return this},this.urlify=function(A){var e,o=/[& +$,:;=?@"#{}|^~[`%!'\]\.\/\(\)\*\\]/g;return this.options.truncate||t(this.options),e=A.trim().replace(/\'/gi,"").replace(o,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()}}var anchors=new AnchorJS; | ||
function AnchorJS(A){"use strict";function e(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.hasOwnProperty("visible")?A.visible:"hover",A.placement=A.hasOwnProperty("placement")?A.placement:"right",A.class=A.hasOwnProperty("class")?A.class:"",A.truncate=A.hasOwnProperty("truncate")?Math.floor(A.truncate):64}function t(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new Error("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}function n(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style"),t=" .anchorjs-link { opacity: 0; text-decoration: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }",n=" *:hover > .anchorjs-link, .anchorjs-link:focus { opacity: 1; }",o=' @font-face { font-family: "anchorjs-icons"; font-style: normal; font-weight: normal; src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBTUAAAC8AAAAYGNtYXAWi9QdAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zgq29TcAAAF4AAABNGhlYWQEZM3pAAACrAAAADZoaGVhBhUDxgAAAuQAAAAkaG10eASAADEAAAMIAAAAFGxvY2EAKACuAAADHAAAAAxtYXhwAAgAVwAAAygAAAAgbmFtZQ5yJ3cAAANIAAAB2nBvc3QAAwAAAAAFJAAAACAAAwJAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpywPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6cv//f//AAAAAAAg6cv//f//AAH/4xY5AAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAACADEARAJTAsAAKwBUAAABIiYnJjQ/AT4BMzIWFxYUDwEGIicmND8BNjQnLgEjIgYPAQYUFxYUBw4BIwciJicmND8BNjIXFhQPAQYUFx4BMzI2PwE2NCcmNDc2MhcWFA8BDgEjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAEAAAABAACiToc1Xw889QALBAAAAAAA0XnFFgAAAADRecUWAAAAAAJTAsAAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAAlMAAQAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAACAAAAAoAAMQAAAAAACgAUAB4AmgABAAAABQBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIABwCfAAEAAAAAAAMADgBLAAEAAAAAAAQADgC0AAEAAAAAAAUACwAqAAEAAAAAAAYADgB1AAEAAAAAAAoAGgDeAAMAAQQJAAEAHAAOAAMAAQQJAAIADgCmAAMAAQQJAAMAHABZAAMAAQQJAAQAHADCAAMAAQQJAAUAFgA1AAMAAQQJAAYAHACDAAMAAQQJAAoANAD4YW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzUmVndWxhcgBSAGUAZwB1AGwAYQByYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format("truetype"); }',i=" [data-anchorjs-icon]::after { content: attr(data-anchorjs-icon); }";e.className="anchorjs",e.appendChild(document.createTextNode("")),A=document.head.querySelector('[rel="stylesheet"], style'),void 0===A?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(t,e.sheet.cssRules.length),e.sheet.insertRule(n,e.sheet.cssRules.length),e.sheet.insertRule(i,e.sheet.cssRules.length),e.sheet.insertRule(o,e.sheet.cssRules.length)}}this.options=A||{},this.elements=[],e(this.options),this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)},this.add=function(A){var o,i,s,a,r,c,l,h,g,u,B,Q,f=[];if(e(this.options),Q=this.options.visible,"touch"===Q&&(Q=this.isTouchDevice()?"always":"hover"),A||(A="h1, h2, h3, h4, h5, h6"),o=t(A),0===o.length)return!1;for(n(),i=document.querySelectorAll("[id]"),s=[].map.call(i,function(A){return A.id}),r=0;r<o.length;r++)if(this.hasAnchorJSLink(o[r]))f.push(r);else{if(o[r].hasAttribute("id"))a=o[r].getAttribute("id");else{h=this.urlify(o[r].textContent),g=h,l=0;do void 0!==c&&(g=h+"-"+l),c=s.indexOf(g),l+=1;while(-1!==c);c=void 0,s.push(g),o[r].setAttribute("id",g),a=g}u=a.replace(/-/g," "),B=document.createElement("a"),B.className="anchorjs-link "+this.options.class,B.href="#"+a,B.setAttribute("aria-label","Anchor link for: "+u),B.setAttribute("data-anchorjs-icon",this.options.icon),"always"===Q&&(B.style.opacity="1"),""===this.options.icon&&(B.style.fontFamily="anchorjs-icons",B.style.fontStyle="normal",B.style.fontVariant="normal",B.style.fontWeight="normal",B.style.lineHeight=1,"left"===this.options.placement&&(B.style.lineHeight="inherit")),"left"===this.options.placement?(B.style.position="absolute",B.style.marginLeft="-1em",B.style.paddingRight="0.5em",o[r].insertBefore(B,o[r].firstChild)):(B.style.paddingLeft="0.375em",o[r].appendChild(B))}for(r=0;r<f.length;r++)o.splice(f[r]-r,1);return this.elements=this.elements.concat(o),this},this.remove=function(A){for(var e,n,o=t(A),i=0;i<o.length;i++)n=o[i].querySelector(".anchorjs-link"),n&&(e=this.elements.indexOf(o[i]),-1!==e&&this.elements.splice(e,1),o[i].removeChild(n));return this},this.removeAll=function(){this.remove(this.elements)},this.urlify=function(A){var t,n=/[& +$,:;=?@"#{}|^~[`%!'\]\.\/\(\)\*\\]/g;return this.options.truncate||e(this.options),t=A.trim().replace(/\'/gi,"").replace(n,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=(" "+A.firstChild.className+" ").indexOf(" anchorjs-link ")>-1,t=(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ")>-1;return e||t}}var anchors=new AnchorJS; |
{ | ||
"name": "anchor-js", | ||
"version": "3.0.0", | ||
"version": "3.1.0", | ||
"authors": [ | ||
@@ -5,0 +5,0 @@ "Bryan Braun" |
{ | ||
"name": "anchor-js", | ||
"version": "3.0.0", | ||
"version": "3.1.0", | ||
"author": "bryanbraun (https://github.com/bryanbraun)", | ||
@@ -22,11 +22,11 @@ "description": "A Javscript utility for adding deep anchor links to online docs.", | ||
"devDependencies": { | ||
"eslint": "~1.10.3", | ||
"eslint": "~2.0.0", | ||
"jasmine-core": "~2.4.1", | ||
"karma": "~0.13.19", | ||
"karma": "~0.13.21", | ||
"karma-cli": "~0.1.2", | ||
"karma-jasmine": "~0.3.6", | ||
"karma-phantomjs-launcher": "~0.2.3", | ||
"phantomjs": "~1.9.19", | ||
"karma-jasmine": "~0.3.7", | ||
"karma-phantomjs-launcher": "~1.0.0", | ||
"phantomjs-prebuilt": "~2.1.4", | ||
"uglify-js": "~2.6.1" | ||
} | ||
} |
@@ -14,5 +14,18 @@ /* eslint-env jasmine */ | ||
afterEach(function() { | ||
anchors.removeAll(); | ||
document.body.removeChild(el1); | ||
}); | ||
it('can detect if an element has an AnchorJS link', function() { | ||
var anchorLink, | ||
el2 = appendElementToBody('h2', 'Example Title'); | ||
anchors.add('h2'); | ||
anchorLink = document.querySelector('h2 > .anchorjs-link'); | ||
expect(anchorLink).not.toBe(null); // reference test | ||
expect(anchors.hasAnchorJSLink(el2)).toBe(true); | ||
document.body.removeChild(el2); | ||
}); | ||
it('should add an anchor link to an h1 by default', function() { | ||
@@ -25,2 +38,23 @@ var anchorLink; | ||
it('add/remove accepts a string (selector), nodelist, or array of els', function() { | ||
var el2 = appendElementToBody('h2', 'Example Title'); | ||
anchors.add('h2'); | ||
expect(anchors.hasAnchorJSLink(el2)).toBe(true); | ||
anchors.remove('h2'); | ||
expect(anchors.hasAnchorJSLink(el2)).toBe(false); | ||
anchors.add(document.querySelectorAll('h2')); | ||
expect(anchors.hasAnchorJSLink(el2)).toBe(true); | ||
anchors.remove(document.querySelectorAll('h2')); | ||
expect(anchors.hasAnchorJSLink(el2)).toBe(false); | ||
anchors.add([document.querySelector('h2')]); | ||
expect(anchors.hasAnchorJSLink(el2)).toBe(true); | ||
anchors.remove([document.querySelector('h2')]); | ||
expect(anchors.hasAnchorJSLink(el2)).toBe(false); | ||
document.body.removeChild(el2); | ||
}); | ||
it('should set the expected default options', function() { | ||
@@ -91,2 +125,17 @@ anchors.add(); | ||
it('can remove all anchors with removeAll', function() { | ||
var el2 = appendElementToBody('h2', 'Example Title'); | ||
anchors.add('h1, h2'); | ||
expect(anchors.hasAnchorJSLink(el1)).toBe(true); | ||
expect(anchors.hasAnchorJSLink(el2)).toBe(true); | ||
anchors.removeAll(); | ||
expect(anchors.hasAnchorJSLink(el1)).toBe(false); | ||
expect(anchors.hasAnchorJSLink(el2)).toBe(false); | ||
expect(anchors.elements.length).toBe(0); | ||
document.body.removeChild(el2); | ||
}); | ||
it('can chain methods.', function() { | ||
@@ -126,5 +175,5 @@ var anchorLinkBefore, | ||
it('should increment new IDs if multiple IDs are found on a page.', function() { | ||
var el1 = appendElementToBody('h2', 'Example Title'), | ||
el2 = appendElementToBody('h2', 'Example Title'), | ||
var el2 = appendElementToBody('h2', 'Example Title'), | ||
el3 = appendElementToBody('h2', 'Example Title'), | ||
el4 = appendElementToBody('h2', 'Example Title'), | ||
id1, | ||
@@ -156,5 +205,5 @@ id2, | ||
document.body.removeChild(el1); | ||
document.body.removeChild(el2); | ||
document.body.removeChild(el3); | ||
document.body.removeChild(el4); | ||
}); | ||
@@ -168,2 +217,55 @@ | ||
it('silently prevents an anchor from being added twice to the same element', function() { | ||
var anchorLinkList1, | ||
anchorLinkList2; | ||
anchors.add('h1'); | ||
anchorLinkList1 = document.querySelectorAll('h1 > .anchorjs-link'); | ||
expect(anchorLinkList1.length).toEqual(1); | ||
anchors.add('h1'); | ||
anchorLinkList2 = document.querySelectorAll('h1 > .anchorjs-link'); | ||
expect(anchorLinkList2.length).toEqual(1); | ||
}); | ||
describe('exposed elements list', function() { | ||
var el2, | ||
el3, | ||
el4; | ||
beforeEach(function() { | ||
el2 = appendElementToBody('h2', 'Example Title 1'); | ||
el3 = appendElementToBody('h2', 'Example Title 2'); | ||
el4 = appendElementToBody('h3', 'Example Title 3'); | ||
}); | ||
afterEach(function() { | ||
document.body.removeChild(el2); | ||
document.body.removeChild(el3); | ||
document.body.removeChild(el4); | ||
}); | ||
it('contains added anchors', function() { | ||
anchors.add('h2'); | ||
expect(anchors.elements.length).toEqual(2); | ||
expect(anchors.elements[0].textContent).toEqual('Example Title 1'); | ||
expect(anchors.elements[1].textContent).toEqual('Example Title 2'); | ||
}); | ||
it('contains combined anchors from multiple adds', function() { | ||
anchors.add('h2'); | ||
expect(anchors.elements.length).toEqual(2); | ||
anchors.add('h3'); | ||
expect(anchors.elements.length).toEqual(3); | ||
}); | ||
it('doesn\'t contain removed anchors', function() { | ||
anchors.add('h2, h3'); | ||
expect(anchors.elements.length).toEqual(3); | ||
expect(anchors.elements.indexOf(el4)).toEqual(2); | ||
anchors.remove('h3'); | ||
expect(anchors.elements.length).toEqual(2); | ||
expect(anchors.elements.indexOf(el4)).toEqual(-1); | ||
}); | ||
}); | ||
describe('urlify', function() { | ||
@@ -170,0 +272,0 @@ it('preserves unicode characters', function() { |
Sorry, the diff of this file is not supported yet
56227
742