summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/output/modifiers/__tests__/annotateText.js49
-rw-r--r--lib/output/modifiers/annotateText.js2
-rw-r--r--lib/output/modifiers/resolveLinks.js31
-rw-r--r--lib/utils/location.js21
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));
}