Files
gitbook/lib/models/summaryArticle.js
T
2016-04-23 17:10:16 +02:00

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;