@@ -10,7 +10,7 @@ const liveReload = require('./live-reload');
1010const UnibitLoader = require ( './unibit-loader' ) ;
1111const UnibitNunjucksLoader = require ( './unibit-nunjucks-loader' ) ;
1212const filters = require ( './filters' ) ;
13- const { forEachPromise, createLogger } = require ( './utils' ) ;
13+ const { forEachPromise, createLogger, prettyUrl } = require ( './utils' ) ;
1414const { 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 ) ;
0 commit comments