Skip to content

Commit 9e4c136

Browse files
committed
Added new filters, changed page.url to always start with slash
- trim - trim_start - trim_end - path_join
1 parent 1f5edae commit 9e4c136

4 files changed

Lines changed: 66 additions & 50 deletions

File tree

src/filters.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ module.exports = {
1414
replaceRegexp,
1515
startsWith,
1616
endsWith,
17+
trim,
18+
trimStart,
19+
trimEnd,
20+
pathJoin,
1721
where
1822
};
1923

@@ -66,6 +70,23 @@ function endsWith(str, prefix) {
6670
return _.endsWith(str, prefix);
6771
}
6872

73+
function trim(str, chars) {
74+
return _.trim(str, chars);
75+
}
76+
77+
function trimStart(str, chars) {
78+
return _.trimStart(str, chars);
79+
}
80+
81+
function trimEnd(str, chars) {
82+
return _.trimEnd(str, chars);
83+
}
84+
85+
function pathJoin(...pathParts) {
86+
const result = _.compact(pathParts).join('/').replace(/\/{2,}/g, '/');
87+
return result || '.';
88+
}
89+
6990
function where(array, key, operator, match) {
7091
let predicate;
7192
let operatorMap = {

src/unibit-loader.js

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ const {
88
getFirstExistingFileSync,
99
parseFileSync,
1010
readDirRecSync,
11-
parseMarkdownWithFrontMatter
11+
parseMarkdownWithFrontMatter,
12+
prettyUrl
1213
} = require('./utils');
1314
const { STACKBIT_YAML_NAMES, UNIBIT } = require('./consts');
1415

@@ -159,7 +160,7 @@ module.exports = class UnibitLoader {
159160
let absPagesDir = path.resolve(this.inputDir, UNIBIT.pagesDir);
160161
let pathObject = path.parse(filePath);
161162
let relDir = path.relative(absPagesDir, pathObject.dir);
162-
let url = path.join(relDir, pathObject.name + '.html');
163+
let url = path.join('/', relDir, pathObject.name + '.html');
163164
let date;
164165
if (frontmatter.date) {
165166
date = new Date(moment(frontmatter.date).toISOString());
@@ -195,15 +196,10 @@ module.exports = class UnibitLoader {
195196
if (uglyUrls) {
196197
return url;
197198
}
198-
const pathComponents = path.parse(url);
199-
if (!url.startsWith('http') && !url.startsWith('//')) {
200-
if (pathComponents.base.match(/^index\.html?$/)) {
201-
url = url.replace(/index\.html?$/, '');
202-
} else if (pathComponents.ext.match(/\.html?$/)) {
203-
url = _.compact([pathComponents.dir, pathComponents.name]).join(path.sep) + path.sep;
204-
}
199+
if (url.startsWith('http:') || url.startsWith('https:') || url.startsWith('//')) {
200+
return url;
205201
}
206-
return url;
202+
return prettyUrl(url);
207203
}
208204

209205
createMenuItems({config, pages, uglyUrls}) {

src/unibit.js

Lines changed: 25 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const liveReload = require('./live-reload');
1010
const UnibitLoader = require('./unibit-loader');
1111
const UnibitNunjucksLoader = require('./unibit-nunjucks-loader');
1212
const filters = require('./filters');
13-
const { forEachPromise, createLogger } = require('./utils');
13+
const { forEachPromise, createLogger, prettyUrl } = require('./utils');
1414
const { UNIBIT } = require('./consts');
1515

1616

@@ -295,14 +295,14 @@ module.exports = class Unibit {
295295
});
296296
}
297297

298-
savePage(pageResult, outputUrl) {
298+
savePage(pageResult, outputPath) {
299299
if (this.prettier) {
300300
pageResult = prettier.format(pageResult, _.merge({
301301
parser: 'html',
302302
endOfLine: 'lf'
303303
}, this.prettierOptions)) + '\n';
304304
}
305-
let outputFile = path.resolve(this.outputDir, outputUrl);
305+
let outputFile = path.join(path.resolve(this.outputDir), outputPath);
306306
fse.outputFileSync(outputFile, pageResult);
307307
}
308308

@@ -325,46 +325,33 @@ module.exports = class Unibit {
325325
this.env.addFilter('replace_regexp', filters.replaceRegexp);
326326
this.env.addFilter('starts_with', filters.startsWith);
327327
this.env.addFilter('ends_with', filters.endsWith);
328+
this.env.addFilter('trim', filters.trim);
329+
this.env.addFilter('trim_start', filters.trimStart);
330+
this.env.addFilter('trim_end', filters.trimEnd);
331+
this.env.addFilter('path_join', filters.pathJoin);
328332
this.env.addFilter('where', filters.where);
329333
this.env.addFilter('link', this.link.bind(this, site));
330334
this.env.addExtension('LinkExtension', new LinkExtension(this, site));
331335
}
332336

333-
getPage(context, pagePath) {
334-
if (!_.startsWith(pagePath, '/')) {
335-
// if pagePath does not start with '/', join it to current's page
336-
// relDir and test against relPath of all pages. If no such page
337-
// exists, continue to regular flow.
338-
let fullPath = path.join(context.page.relDir, pagePath);
339-
let result = _.find(context.site.pages, page => page.relPath === fullPath);
340-
if (result) {
341-
return result;
342-
}
343-
} else {
344-
// if pagePath starts with '/', remove it
345-
pagePath = pagePath.substring(1);
346-
}
347-
return _.find(context.site.pages, page => page.relPath === pagePath) || null;
337+
getPage(context, urlPath) {
338+
urlPath = _.trim(urlPath, '/');
339+
return _.find(context.site.pages, page => {
340+
const pageUrl = _.trim(_.get(page, 'url'), '/');
341+
return prettyUrl(urlPath) === prettyUrl(pageUrl);
342+
});
348343
}
349344

350-
getPages(context, folderPath) {
351-
if (!_.startsWith(folderPath, '/')) {
352-
// if folderPath does not start with '/', join it to current's page
353-
// relDir and test against relDir of all pages. If no such pages
354-
// exists, continue to regular flow.
355-
let fullPath = path.join(context.page.relDir, folderPath);
356-
let result = _.filter(context.site.pages, page => page.relDir === fullPath);
357-
if (!_.isEmpty(result)) {
358-
return result;
359-
}
360-
}
361-
folderPath = _.trim(folderPath, '/');
362-
const folderPathParts = _.split(folderPath, '/');
345+
getPages(context, urlPath) {
346+
urlPath = _.trim(urlPath, '/');
347+
urlPath = prettyUrl(urlPath);
348+
const urlPathParts = _.split(urlPath, '/');
363349
return _.filter(context.site.pages, page => {
364-
// find all pages that have same prefix as folder path, but not the root page of that folder, e.g.: {folderPath}/index.html
365-
const url = _.trim(page.url, '/');
366-
const urlParts = _.split(url, '/');
367-
return urlParts.length > folderPathParts.length && _.isEqual(urlParts.slice(0, folderPathParts.length), folderPathParts);
350+
// find all pages that have same prefix as folder path, but not the root page of that folder, e.g.: {urlPath}/index.html
351+
let pageUrl = _.trim(_.get(page, 'url'), '/');
352+
pageUrl = prettyUrl(pageUrl);
353+
const pageUrlParts = _.split(pageUrl, '/');
354+
return pageUrlParts.length > urlPathParts.length && _.isEqual(pageUrlParts.slice(0, urlPathParts.length), urlPathParts);
368355
});
369356
}
370357

@@ -389,7 +376,7 @@ module.exports = class Unibit {
389376
if (i === 0) {
390377
url = context.page.url;
391378
} else {
392-
url = path.join(context.page.relDir, 'page' + pageNumber, 'index.html');
379+
url = path.join('/', context.page.relDir, 'page' + pageNumber, 'index.html');
393380
}
394381
let startIdx = i * itemsPerPage;
395382
let endIdx = Math.min(startIdx + itemsPerPage, items.length);
@@ -429,14 +416,13 @@ module.exports = class Unibit {
429416
}
430417

431418
relativeUrl(site, url) {
432-
if (_.startsWith(url, '#') || _.startsWith(url, 'http')) {
419+
if (_.startsWith(url, '#') || _.startsWith(url, 'http:') || _.startsWith(url, 'https:')) {
433420
return url;
434421
}
435422
let urlsRelativeToBase = _.get(site.config.data, 'urls_relative_to_base', true);
436423
if (!urlsRelativeToBase && !_.startsWith(url, '/')) {
437424
let pageDir = path.parse(this.renderingPage.outputUrl).dir;
438-
this.assert(!_.startsWith(pageDir, '/'), `error in relativeUrl, page dir can not be absolute`);
439-
return path.relative(pageDir, url);
425+
return path.join(pageDir, url);
440426
} else {
441427
let baseUrl = _.get(site.config.data, 'baseurl', '');
442428
return path.join(baseUrl, '/', url);

src/utils.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ module.exports = {
1212
parseFileSync,
1313
parseDataByFilePath,
1414
parseMarkdownWithFrontMatter,
15-
createLogger
15+
createLogger,
16+
prettyUrl
1617
};
1718

1819
/**
@@ -172,3 +173,15 @@ function createLogger(scope, transport) {
172173

173174
return obj;
174175
}
176+
177+
function prettyUrl(url) {
178+
if (url.match(/(?:^|\/)index\.html?$/)) {
179+
url = url.replace(/\/?index\.html?$/, '');
180+
if (url === '') {
181+
url = '/';
182+
}
183+
} else if (url.match(/\.html?$/)) {
184+
url = url.replace(/\.html?$/, '');
185+
}
186+
return url;
187+
}

0 commit comments

Comments
 (0)