summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2015-10-21 18:05:40 +0200
committerSamy Pessé <samypesse@gmail.com>2015-10-21 18:05:40 +0200
commit27a43d5aea920faefc01caac9c8e5a60fa05097b (patch)
tree7efad6611750626cf2c32147bcff33760827e536
parent4e90becd525e88905c44d3f8a3984885c7c9014d (diff)
parentdf1d5a06802154c5b6fb922c73365d2afceaecd9 (diff)
downloadgitbook-27a43d5aea920faefc01caac9c8e5a60fa05097b.zip
gitbook-27a43d5aea920faefc01caac9c8e5a60fa05097b.tar.gz
gitbook-27a43d5aea920faefc01caac9c8e5a60fa05097b.tar.bz2
Merge pull request #986 from GitbookIO/fix/heading_ids
Normalize ID for headings
-rw-r--r--lib/utils/page.js18
-rw-r--r--package.json5
-rw-r--r--test/books/headings/README.md3
-rw-r--r--test/books/headings/SUMMARY.md0
-rw-r--r--test/codehighlighting.js44
-rw-r--r--test/heading.js37
6 files changed, 78 insertions, 29 deletions
diff --git a/lib/utils/page.js b/lib/utils/page.js
index c79f237..739b59c 100644
--- a/lib/utils/page.js
+++ b/lib/utils/page.js
@@ -6,6 +6,7 @@ var cheerio = require('cheerio');
var domSerializer = require('dom-serializer');
var request = require('request');
var crc = require('crc');
+var slug = require('github-slugid');
var links = require('./links');
var imgUtils = require('./images');
@@ -14,18 +15,18 @@ var batch = require('./batch');
var parsableExtensions = require('gitbook-parsers').extensions;
+// Map of images that have been converted
+var imgConversionCache = {};
+
// Render a cheerio dom as html
-var renderDom = function($, dom, options) {
+function renderDom($, dom, options) {
if (!dom && $._root && $._root.children) {
dom = $._root.children;
}
options = options|| dom.options || $._options;
return domSerializer(dom, options);
-};
-
-// Map of images that have been converted
-var imgConversionCache = {};
+}
function replaceText($, el, search, replace, text_only ) {
return $(el).each(function(){
@@ -114,6 +115,13 @@ function normalizeHtml(src, options) {
});
}
+ // Generate ID for headings
+ $('h1,h2,h3,h4,h5,h6').each(function() {
+ if ($(this).attr('id')) return;
+
+ $(this).attr('id', slug($(this).text()));
+ });
+
// Find images to normalize
$('img').each(function() {
var origin;
diff --git a/package.json b/package.json
index f12dec2..5eff3b0 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
"resolve": "0.6.3",
"fs-extra": "0.16.5",
"fstream-ignore": "1.0.2",
- "gitbook-parsers": "0.8.5",
+ "gitbook-parsers": "0.8.7",
"gitbook-plugin-highlight": "1.0.3",
"gitbook-plugin-sharing": "1.0.1",
"gitbook-plugin-search": "1.0.2",
@@ -39,7 +39,8 @@
"juice": "1.5.0",
"jsonschema": "1.0.2",
"json-schema-defaults": "0.1.1",
- "merge-defaults": "0.2.1"
+ "merge-defaults": "0.2.1",
+ "github-slugid": "1.0.0"
},
"devDependencies": {
"eslint": "1.5.0",
diff --git a/test/books/headings/README.md b/test/books/headings/README.md
new file mode 100644
index 0000000..b08c485
--- /dev/null
+++ b/test/books/headings/README.md
@@ -0,0 +1,3 @@
+# Hello World
+
+## Hello {#hello-custom}
diff --git a/test/books/headings/SUMMARY.md b/test/books/headings/SUMMARY.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/books/headings/SUMMARY.md
diff --git a/test/codehighlighting.js b/test/codehighlighting.js
index 9f392af..f167980 100644
--- a/test/codehighlighting.js
+++ b/test/codehighlighting.js
@@ -1,63 +1,63 @@
-var path = require("path");
-var fs = require("fs");
+var path = require('path');
+var fs = require('fs');
-var Plugin = require("../lib/plugin");
-var PLUGINS_ROOT = path.resolve(__dirname, "plugins");
+var Plugin = require('../lib/plugin');
+var PLUGINS_ROOT = path.resolve(__dirname, 'plugins');
-describe("Code Highlighting", function () {
+describe('Code Highlighting', function () {
var book, PAGE;
before(function() {
- return books.generate("highlight", "website", {
+ return books.generate('highlight', 'website', {
prepare: function(_book) {
book = _book;
- var plugin = new Plugin(book, "replace_highlight");
- plugin.load("./replace_highlight", PLUGINS_ROOT);
+ var plugin = new Plugin(book, 'replace_highlight');
+ plugin.load('./replace_highlight', PLUGINS_ROOT);
book.plugins.load(plugin);
}
})
.then(function() {
PAGE = fs.readFileSync(
- path.join(book.options.output, "index.html"),
- { encoding: "utf-8" }
+ path.join(book.options.output, 'index.html'),
+ { encoding: 'utf-8' }
);
});
});
- it("should correctly replace highlighting", function() {
+ it('should correctly replace highlighting', function() {
PAGE.should.be.html({
- "code": {
+ 'code': {
index: 0,
- text: "code_test 1\n_code"
+ text: 'code_test 1\n_code'
}
});
});
- it("should correctly replace highlighting with language", function() {
+ it('should correctly replace highlighting with language', function() {
PAGE.should.be.html({
- "code": {
+ 'code': {
index: 1,
- text: "lang_test 2\n_lang"
+ text: 'lang_test 2\n_lang'
}
});
});
- it("should correctly replace highlighting for inline code", function() {
+ it('should correctly replace highlighting for inline code', function() {
PAGE.should.be.html({
- "code": {
+ 'code': {
index: 2,
- text: "code_test 3_code"
+ text: 'code_test 3_code'
}
});
});
- it("should correctly replace highlighting for inline code with html tags", function() {
+ it('should correctly replace highlighting for inline code with html tags', function() {
PAGE.should.be.html({
- "code": {
+ 'code': {
index: 3,
- text: "code_<test>_code"
+ text: 'code_<test>_code'
}
});
});
diff --git a/test/heading.js b/test/heading.js
new file mode 100644
index 0000000..f6d65c3
--- /dev/null
+++ b/test/heading.js
@@ -0,0 +1,37 @@
+var path = require('path');
+var fs = require('fs');
+
+describe('Headings', function () {
+ var book, PAGE;
+
+ before(function() {
+ return books.generate('headings', 'website')
+ .then(function(_book) {
+ book = _book;
+
+ PAGE = fs.readFileSync(
+ path.join(book.options.output, 'index.html'),
+ { encoding: 'utf-8' }
+ );
+ });
+ });
+
+ describe('IDs', function() {
+ it('should correctly generate an ID', function() {
+ PAGE.should.be.html({
+ 'h1#hello-world': {
+ count: 1
+ }
+ });
+ });
+
+ it('should correctly accept custom ID', function() {
+ PAGE.should.be.html({
+ 'h2#hello-custom': {
+ count: 1
+ }
+ });
+ });
+ });
+});
+