var mock = require('./mock');
var Output = require('../lib/output/base');
describe('Page', function() {
var book, output;
before(function() {
return mock.setupDefaultBook({
'README.md': ' # Hello World\n\nThis is a description',
'heading.md': '# Hello\n\n## World',
'links.md': '[link](hello.md) [link 2](variables/page/next.md) [readme](README.md)',
'links/relative.md': '[link](../hello.md) [link 2](/variables/page/next.md) [readme](../README.md)',
'images.md': '  ',
'images/relative.md': ' ',
'annotations/simple.md': 'A magicien say abracadabra!',
'annotations/code.md': 'A magicien say `abracadabra`!',
'annotations/class.md': 'A magicien say
abracadabra, right?
!',
'codes/simple.md': '```hello world```',
'codes/lang.md': '```js\nhello world\n```',
'codes/lang.adoc': '```js\nhello world\n```',
'folder/paths.md': '',
'variables/file/mtime.md': '{{ file.mtime }}',
'variables/file/path.md': '{{ file.path }}',
'variables/page/title.md': '{{ page.title }}',
'variables/page/previous.md': '{{ page.previous.title }} {{ page.previous.path }}',
'variables/page/next.md': '{{ page.next.title }} {{ page.next.path }}',
'variables/page/dir/ltr.md': 'This is english: {{ page.dir }}',
'variables/page/dir/rtl.md': 'بسيطة {{ page.dir }}',
'variables/book/title.md': '{{ book.title}}',
'GLOSSARY.md': '# Glossary\n\n\n## abracadabra\n\nthis is the description'
}, [
{
title: 'Test page.next',
path: 'variables/page/next.md'
},
{
title: 'Test Variables',
path: 'variables/page/title.md'
},
{
title: 'Test page.previous',
path: 'variables/page/previous.md'
}
])
.then(function(_book) {
book = _book;
output = new Output(book);
return book.parse();
});
});
describe('.resolveLocal', function() {
it('should correctly resolve path to file', function() {
var page = book.addPage('heading.md');
page.resolveLocal('test.png').should.equal('test.png');
page.resolveLocal('/test.png').should.equal('test.png');
page.resolveLocal('test/hello.png').should.equal('test/hello.png');
page.resolveLocal('/test/hello.png').should.equal('test/hello.png');
});
it('should correctly resolve path to file (2)', function() {
var page = book.addPage('folder/paths.md');
page.resolveLocal('test.png').should.equal('folder/test.png');
page.resolveLocal('/test.png').should.equal('test.png');
page.resolveLocal('test/hello.png').should.equal('folder/test/hello.png');
page.resolveLocal('/test/hello.png').should.equal('test/hello.png');
});
});
describe('.relative', function() {
it('should correctly resolve absolute path in the book', function() {
var page = book.addPage('heading.md');
page.relative('/test.png').should.equal('test.png');
page.relative('test.png').should.equal('test.png');
var page2 = book.addPage('folder/paths.md');
page2.relative('/test.png').should.equal('../test.png');
page2.relative('test.png').should.equal('../test.png');
});
});
describe('.resolve', function() {
var page;
before(function() {
page = book.addPage('links/relative.md');
});
it('should resolve to a relative path (same folder)', function() {
page.relative('links/test.md').should.equal('test.md');
});
it('should resolve to a relative path (parent folder)', function() {
page.relative('test.md').should.equal('../test.md');
page.relative('hello/test.md').should.equal('../hello/test.md');
});
it('should resolve to a relative path (child folder)', function() {
page.relative('links/hello/test.md').should.equal('hello/test.md');
});
});
describe('Headings', function() {
it('should add a default ID to headings', function() {
var page = book.addPage('heading.md');
return page.toHTML(output)
.then(function() {
page.content.should.be.html({
'h1#hello': {
count: 1
},
'h2#world': {
count: 1
}
});
});
});
});
describe('Code Blocks', function() {
var page;
before(function() {
output.template.addBlock('code', function(blk) {
return (blk.kwargs.language || '') + blk.body + 'test';
});
});
it('should apply "code" block', function() {
page = book.addPage('codes/simple.md');
return page.toHTML(output)
.should.be.fulfilledWith('hello worldtest
\n');
});
it('should add language as kwargs', function() {
page = book.addPage('codes/lang.md');
return page.toHTML(output)
.should.be.fulfilledWith('jshello world\ntest
\n');
});
it('should add language as kwargs (asciidoc)', function() {
page = book.addPage('codes/lang.adoc');
return page.toHTML(output)
.should.be.fulfilledWith('');
});
});
describe('Links', function() {
describe('From base directory', function() {
var page;
before(function() {
page = book.addPage('links.md');
return page.toHTML(output);
});
it('should replace links to page to .html', function() {
page.content.should.be.html({
'a[href="variables/page/next.html"]': {
count: 1
}
});
});
it('should use directory urls when file is a README', function() {
page.content.should.be.html({
'a[href="./"]': {
count: 1
}
});
});
it('should not replace links to file not in SUMMARY', function() {
page.content.should.be.html({
'a[href="hello.md"]': {
count: 1
}
});
});
});
describe('From sub-directory', function() {
var page;
before(function() {
page = book.addPage('links/relative.md');
return page.toHTML(output);
});
it('should replace links to page to .html', function() {
page.content.should.be.html({
'a[href="../variables/page/next.html"]': {
count: 1
}
});
});
it('should use directory urls when file is a README', function() {
page.content.should.be.html({
'a[href="../"]': {
count: 1
}
});
});
it('should not replace links to file not in SUMMARY', function() {
page.content.should.be.html({
'a[href="../hello.md"]': {
count: 1
}
});
});
});
});
describe('Images', function() {
describe('From base directory', function() {
var page;
before(function() {
page = book.addPage('images.md');
return page.toHTML(output);
});
it('should resolve relative images', function() {
page.content.should.be.html({
'img[src="test.png"]': {
count: 1
}
});
});
it('should resolve absolute images', function() {
page.content.should.be.html({
'img[src="test2.png"]': {
count: 1
}
});
});
it('should keep external images path', function() {
page.content.should.be.html({
'img[src="https:/upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png"]': {
count: 1
}
});
});
});
describe('From sub-directory', function() {
var page;
before(function() {
page = book.addPage('images/relative.md');
return page.toHTML(output);
});
it('should resolve relative images', function() {
page.content.should.be.html({
'img[src="test.png"]': {
count: 1
}
});
});
it('should resolve absolute images', function() {
page.content.should.be.html({
'img[src="../test2.png"]': {
count: 1
}
});
});
});
});
describe('Templating Context', function() {
it('should set file.mtime', function() {
var page = book.addPage('variables/file/mtime.md');
return page.toHTML(output)
.then(function(content) {
// A date ends with "(CET)" or "(UTC)""
content.should.endWith(')\n');
});
});
it('should set file.path', function() {
var page = book.addPage('variables/file/path.md');
return page.toHTML(output)
.should.be.fulfilledWith('variables/file/path.md
\n');
});
it('should set page.title when page is in summary', function() {
var page = book.getPage('variables/page/title.md');
return page.toHTML(output)
.should.be.fulfilledWith('Test Variables
\n');
});
it('should set page.previous when possible', function() {
var page = book.getPage('variables/page/previous.md');
return page.toHTML(output)
.should.be.fulfilledWith('Test Variables variables/page/title.md
\n');
});
it('should set page.next when possible', function() {
var page = book.getPage('variables/page/next.md');
return page.toHTML(output)
.should.be.fulfilledWith('Test Variables variables/page/title.md
\n');
});
it('should set book.title', function() {
var page = book.addPage('variables/book/title.md');
return page.toHTML(output)
.should.be.fulfilledWith('Hello World
\n');
});
describe('page.dir', function() {
it('should detect ltr', function() {
var page = book.addPage('variables/page/dir/ltr.md');
return page.toHTML(output)
.should.be.fulfilledWith('This is english: ltr
\n');
});
it('should detect rtl', function() {
var page = book.addPage('variables/page/dir/rtl.md');
return page.toHTML(output)
.should.be.fulfilledWith('بسيطة rtl
\n');
});
});
});
describe('Annotations / Glossary', function() {
it('should replace glossary terms', function() {
return book.addPage('annotations/simple.md').toHTML(output)
.should.finally.be.html({
'.glossary-term': {
count: 1,
text: 'abracadabra',
attributes: {
title: 'this is the description',
href: '../GLOSSARY.html#abracadabra'
}
}
});
});
it('should not replace terms in code blocks', function() {
return book.addPage('annotations/code.md').toHTML(output)
.should.finally.be.html({
'.glossary-term': {
count: 0
}
});
});
it('should not replace terms in ".no-glossary"', function() {
return book.addPage('annotations/class.md').toHTML(output)
.should.finally.be.html({
'.glossary-term': {
count: 0
}
});
});
});
});