diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/output/modifiers/__tests__/annotateText.js | 49 | ||||
-rw-r--r-- | lib/output/modifiers/annotateText.js | 2 | ||||
-rw-r--r-- | lib/output/modifiers/resolveLinks.js | 31 | ||||
-rw-r--r-- | lib/utils/location.js | 21 |
4 files changed, 94 insertions, 9 deletions
diff --git a/lib/output/modifiers/__tests__/annotateText.js b/lib/output/modifiers/__tests__/annotateText.js new file mode 100644 index 0000000..15d4c30 --- /dev/null +++ b/lib/output/modifiers/__tests__/annotateText.js @@ -0,0 +1,49 @@ +jest.autoMockOff(); + +var Immutable = require('immutable'); +var cheerio = require('cheerio'); +var GlossaryEntry = require('../../../models/glossaryEntry'); + +describe('annotateText', function() { + var annotateText = require('../annotateText'); + + var entries = Immutable.List([ + GlossaryEntry({ name: 'Word' }), + GlossaryEntry({ name: 'Multiple Words' }) + ]); + + it('should annotate text', function() { + var $ = cheerio.load('<p>This is a word, and multiple words</p>'); + + annotateText(entries, $); + + var links = $('a'); + expect(links.length).toBe(2); + + var word = $(links.get(0)); + expect(word.attr('href')).toBe('/GLOSSARY.md#word'); + expect(word.text()).toBe('word'); + expect(word.hasClass('glossary-term')).toBeTruthy(); + + var words = $(links.get(1)); + expect(words.attr('href')).toBe('/GLOSSARY.md#multiple-words'); + expect(words.text()).toBe('multiple words'); + expect(words.hasClass('glossary-term')).toBeTruthy(); + }); + + it('should not annotate scripts', function() { + var $ = cheerio.load('<script>This is a word, and multiple words</script>'); + + annotateText(entries, $); + expect($('a').length).toBe(0); + }); + + it('should not annotate when has class "no-glossary"', function() { + var $ = cheerio.load('<p class="no-glossary">This is a word, and multiple words</p>'); + + annotateText(entries, $); + expect($('a').length).toBe(0); + }); +}); + + diff --git a/lib/output/modifiers/annotateText.js b/lib/output/modifiers/annotateText.js index 2832f91..d8443cf 100644 --- a/lib/output/modifiers/annotateText.js +++ b/lib/output/modifiers/annotateText.js @@ -81,7 +81,7 @@ function annotateText(entries, $) { ) return; replaceText($, this, searchRegex, function(match) { - return '<a href="/GLOSSARY.html#' + entryId + '" ' + return '<a href="/GLOSSARY.md#' + entryId + '" ' + 'class="glossary-term" title="' + escape(description) + '">' + match + '</a>'; diff --git a/lib/output/modifiers/resolveLinks.js b/lib/output/modifiers/resolveLinks.js index 5c2514f..b5ad4f3 100644 --- a/lib/output/modifiers/resolveLinks.js +++ b/lib/output/modifiers/resolveLinks.js @@ -1,13 +1,38 @@ +var path = require('path'); +var LocationUtils = require('../../utils/location'); +var editHTMLElement = require('./editHTMLElement'); /** - Resolve all HTML links + Resolve all HTML links: + - /test.md in hello -> ../test.html - @param {String} + @param {String} currentFile + @param {Function(String) -> String} resolveFile @param {HTMLDom} $ */ -function resolveLinks() { +function resolveLinks(currentFile, resolveFile, $) { + var currentDirectory = path.dirname(currentFile); + return editHTMLElement($, 'a', function($a) { + var href = $a.attr('href'); + + if (location.isExternal(href)) { + $a.attr('_target', 'blank'); + return; + } + + // Calcul absolute path for this + href = LocationUtils.toAbsolute(href, currentDirectory, currentDirectory); + + // Resolve file + href = resolveFile(href); + + // Convert back to relative + href = LocationUtils.relative(currentDirectory, href); + + $a.attr('href', href); + }); } module.exports = resolveLinks; diff --git a/lib/utils/location.js b/lib/utils/location.js index ba43644..f1159f1 100644 --- a/lib/utils/location.js +++ b/lib/utils/location.js @@ -30,9 +30,14 @@ function normalize(s) { return path.normalize(s).replace(/\\/g, '/'); } -// Convert relative to absolute path -// dir: directory parent of the file currently in rendering process -// outdir: directory parent from the html output +/** + Convert relative to absolute path + + @param {String} href + @param {String} dir: directory parent of the file currently in rendering process + @param {String} outdir: directory parent from the html output + @return {String} +*/ function toAbsolute(_href, dir, outdir) { if (isExternal(_href)) return _href; outdir = outdir == undefined? dir : outdir; @@ -54,8 +59,14 @@ function toAbsolute(_href, dir, outdir) { return _href; } -// Convert an absolute path to a relative path for a specific folder (dir) -// ('test/', 'hello.md') -> '../hello.md' +/** + Convert an absolute path to a relative path for a specific folder (dir) + ('test/', 'hello.md') -> '../hello.md' + + @param {String} dir: current directory + @param {String} file: absolute path of file + @return {String} +*/ function relative(dir, file) { return normalize(path.relative(dir, file)); } |