mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-19 00:55:13 +00:00
149 lines
3.2 KiB
JavaScript
149 lines
3.2 KiB
JavaScript
var Immutable = require('immutable');
|
|
|
|
var location = require('../utils/location');
|
|
|
|
/*
|
|
An article represents an entry in the Summary / table of Contents
|
|
*/
|
|
|
|
var SummaryArticle = Immutable.Record({
|
|
level: String(),
|
|
title: String(),
|
|
ref: String(),
|
|
articles: Immutable.List()
|
|
});
|
|
|
|
SummaryArticle.prototype.getLevel = function() {
|
|
return this.get('level');
|
|
};
|
|
|
|
SummaryArticle.prototype.getTitle = function() {
|
|
return this.get('title');
|
|
};
|
|
|
|
SummaryArticle.prototype.getRef = function() {
|
|
return this.get('ref');
|
|
};
|
|
|
|
SummaryArticle.prototype.getArticles = function() {
|
|
return this.get('articles');
|
|
};
|
|
|
|
/**
|
|
Return how deep the article is
|
|
|
|
@return {Number}
|
|
*/
|
|
SummaryArticle.prototype.getDepth = function() {
|
|
return this.getLevel().split('.').length;
|
|
};
|
|
|
|
/**
|
|
Return an article by its level
|
|
|
|
@param {String} level
|
|
@return {Article}
|
|
*/
|
|
SummaryArticle.prototype.getByLevel = function(level) {
|
|
return SummaryArticle.getByLevel(this, level);
|
|
};
|
|
|
|
/**
|
|
Get path (without anchor) to the pointing file
|
|
|
|
@return {String}
|
|
*/
|
|
SummaryArticle.prototype.getPath = function() {
|
|
var ref = this.getRef();
|
|
var parts = ref.split('#');
|
|
|
|
var pathname = (parts.length > 1? parts.slice(0, -1).join('#') : ref);
|
|
|
|
// Normalize path to remove ('./', etc)
|
|
return location.normalize(pathname);
|
|
};
|
|
|
|
/**
|
|
Get anchor for this article (or undefined)
|
|
|
|
@return {String}
|
|
*/
|
|
SummaryArticle.prototype.getAnchor = function() {
|
|
var ref = this.getRef();
|
|
var parts = ref.split('#');
|
|
|
|
var anchor = (parts.length > 1? '#' + parts[parts.length - 1] : null);
|
|
return anchor;
|
|
};
|
|
|
|
/**
|
|
Is article pointing to a page of an absolute url
|
|
|
|
@return {Boolean}
|
|
*/
|
|
SummaryArticle.prototype.isPage = function() {
|
|
return !this.isExternal() && this.getRef();
|
|
};
|
|
|
|
/**
|
|
Is article pointing to aan absolute url
|
|
|
|
@return {Boolean}
|
|
*/
|
|
SummaryArticle.prototype.isExternal = function() {
|
|
return location.isExternal(this.getRef());
|
|
};
|
|
|
|
/**
|
|
Create a SummaryArticle
|
|
|
|
@param {Object} def
|
|
@return {SummaryArticle}
|
|
*/
|
|
SummaryArticle.create = function(def, level) {
|
|
var articles = (def.articles || []).map(function(article, i) {
|
|
if (article instanceof SummaryArticle) {
|
|
return article;
|
|
}
|
|
return SummaryArticle.create(article, [level, i].join('.'));
|
|
});
|
|
|
|
return new SummaryArticle({
|
|
level: level,
|
|
title: def.title,
|
|
ref: def.ref || def.path,
|
|
articles: Immutable.List(articles)
|
|
});
|
|
};
|
|
|
|
|
|
/**
|
|
Return an article by its level
|
|
|
|
@param {Article|Part} base
|
|
@param {String} level
|
|
@param {String} method
|
|
@return {Article}
|
|
*/
|
|
SummaryArticle.getByLevel = function(base, level, method) {
|
|
method = method || 'getArticles';
|
|
var articles = base[method]();
|
|
var levelParts = level.split('.');
|
|
var baseLevel = levelParts.shift();
|
|
|
|
var result = articles.find(function(a) {
|
|
return a.getLevel() === baseLevel;
|
|
});
|
|
|
|
if (!result) {
|
|
return undefined;
|
|
}
|
|
if (levelParts.length === 0) {
|
|
return result;
|
|
}
|
|
|
|
return SummaryArticle.getByLevel(result, levelParts.join('.'));
|
|
};
|
|
|
|
module.exports = SummaryArticle;
|