permalinker code works, need pulled in
This commit is contained in:
		
							parent
							
								
									e2728f6ec1
								
							
						
					
					
						commit
						f047b76aa6
					
				
							
								
								
									
										182
									
								
								tests/permalink.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								tests/permalink.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,182 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
// http://ruhoh.com/docs/2/pages/#toc_41
 | 
			
		||||
/*
 | 
			
		||||
  If a page has a permalink, that permalink should be respected.
 | 
			
		||||
  Otherwise it should use the the permalink for that collection.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
var tags
 | 
			
		||||
  , permalinkTransforms
 | 
			
		||||
  , cases
 | 
			
		||||
  , path    = /*exports.path ||*/ require('path')
 | 
			
		||||
  ;
 | 
			
		||||
  
 | 
			
		||||
tags = {
 | 
			
		||||
  year:           "Year from the page’s filename"
 | 
			
		||||
, month:          "Month from the page’s filename"
 | 
			
		||||
, day:            "Day from the page’s filename"
 | 
			
		||||
, path:           "The page file's path relative to the base of your website."
 | 
			
		||||
, relative_path:  "The page file's path relative to its name-spaced directory."
 | 
			
		||||
, filename:       "The page file's filename (path is not included)."
 | 
			
		||||
, categories:     "The specified categories for this page. If more than one category is set, only the first one is used. If no categories exist, the URL omits this parameter."
 | 
			
		||||
, i_month:        "Month from the page’s filename without leading zeros."
 | 
			
		||||
, i_day:          "Day from the page’s filename without leading zeros."
 | 
			
		||||
, title:          "The title, as a slug."
 | 
			
		||||
, slug:           "alias of title"
 | 
			
		||||
, name:           "alias of title"
 | 
			
		||||
, collection:     "i.e. posts/ or essays/ or whatever/"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function pad(str, n) {
 | 
			
		||||
  str = str.toString();
 | 
			
		||||
  if (str.length < n) {
 | 
			
		||||
    str = '0' + str;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return str;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
permalinkTransforms = {
 | 
			
		||||
  year:           function (entity) {
 | 
			
		||||
                    return entity.year;
 | 
			
		||||
                  }
 | 
			
		||||
, month:          function (entity) {
 | 
			
		||||
                    return pad(entity.month, 2);
 | 
			
		||||
                  }
 | 
			
		||||
, day:            function (entity) {
 | 
			
		||||
                    return pad(entity.day, 2);
 | 
			
		||||
                  }
 | 
			
		||||
, path:           function (entity) {
 | 
			
		||||
                    return entity.relativePath
 | 
			
		||||
                      .toLowerCase()
 | 
			
		||||
                      .replace(/^\//, '')
 | 
			
		||||
                      ;
 | 
			
		||||
                  }
 | 
			
		||||
, relative_path:  function (entity) {
 | 
			
		||||
                    // TODO slug the path in desirae proper?
 | 
			
		||||
                    // TODO remove collection from start of path instead
 | 
			
		||||
                    // of blindly assuming one directory at start of path
 | 
			
		||||
                    // entity.collection.name
 | 
			
		||||
                    return entity.relativePath
 | 
			
		||||
                      .toLowerCase()
 | 
			
		||||
                      .replace(/^\/?[^\/]+\//, '')
 | 
			
		||||
                      ;
 | 
			
		||||
                  }
 | 
			
		||||
, filename:       function (entity) {
 | 
			
		||||
                    // don't put .html
 | 
			
		||||
                    return entity.name
 | 
			
		||||
                      .toLowerCase()
 | 
			
		||||
                      .replace(/\.\w+$/, '')
 | 
			
		||||
                      ;
 | 
			
		||||
                  }
 | 
			
		||||
, slug:           function (entity) {
 | 
			
		||||
                    // alias of title
 | 
			
		||||
                    return entity.slug;
 | 
			
		||||
                  }
 | 
			
		||||
, title:          function (entity) {
 | 
			
		||||
                    return entity.slug;
 | 
			
		||||
                  }
 | 
			
		||||
, name:           function (entity) {
 | 
			
		||||
                    // alias of title
 | 
			
		||||
                    return entity.slug;
 | 
			
		||||
                  }
 | 
			
		||||
, collection:     function (entity) {
 | 
			
		||||
                    // TODO implement in desirae
 | 
			
		||||
                    return entity.collection && entity.collection.name
 | 
			
		||||
                      || entity.collectionname
 | 
			
		||||
                      || entity.collection
 | 
			
		||||
                      || ''
 | 
			
		||||
                      ;
 | 
			
		||||
                  }
 | 
			
		||||
, categories:     function (entity) {
 | 
			
		||||
                    return (entity.yml.categories||[])[0]||'';
 | 
			
		||||
                  }
 | 
			
		||||
, i_month:        function (entity) {
 | 
			
		||||
                    return parseInt(entity.month, 10) || 0;
 | 
			
		||||
                  }
 | 
			
		||||
, i_day:          function (entity) {
 | 
			
		||||
                    return parseInt(entity.day, 10) || 0;
 | 
			
		||||
                  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function permalinker(purl, entity) {
 | 
			
		||||
  var parts = purl.split('/')
 | 
			
		||||
    ;
 | 
			
		||||
    
 | 
			
		||||
  parts.forEach(function (part, i) {
 | 
			
		||||
    var re = /:(\w+)/g
 | 
			
		||||
      , m
 | 
			
		||||
        // needs to be a copy, not a reference
 | 
			
		||||
      , opart = part.toString()
 | 
			
		||||
      ;
 | 
			
		||||
 | 
			
		||||
    /* jshint -W084 */
 | 
			
		||||
    while (null !== (m = re.exec(opart))) {
 | 
			
		||||
      if (permalinkTransforms[m[1]]) {
 | 
			
		||||
        part = part.replace(':' + m[1], permalinkTransforms[m[1]](entity));
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    /* jshint +W084 */
 | 
			
		||||
 | 
			
		||||
    parts[i] = part || '';
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  parts.unshift('/');
 | 
			
		||||
  purl = path.join.apply(null, parts);
 | 
			
		||||
  if (!/(\/|\.html?)$/.test(purl)) {
 | 
			
		||||
    // we just default to a slash if you were ambiguous
 | 
			
		||||
    purl += '/';
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return purl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// https://www.youtube.com/watch?v=1NryFD9_hR0&list=RDOeLUK4a6Ojc&index=2
 | 
			
		||||
cases = {
 | 
			
		||||
  "/:title.html"                  : "/my-title.html"
 | 
			
		||||
, ":title/"                       : "/my-title/"
 | 
			
		||||
, "/:bad/:title/"                 : "/:bad/my-title/"
 | 
			
		||||
, "/:slug/"                       : "/my-title/"
 | 
			
		||||
, "/:path/:name.html"             : "/posts/fun/my-title.html"
 | 
			
		||||
, "/:relative_path/:name/"        : "/fun/my-title/"
 | 
			
		||||
, "/:year-:month-:day/:name"      : "/2015-07-04/my-title/"
 | 
			
		||||
, "/:year/:i_month/:i_day/:name"  : "/2015/7/4/my-title/"
 | 
			
		||||
, "/:filename.html"               : "/my-file-name.html"
 | 
			
		||||
, "/:filename"                    : "/my-file-name/"
 | 
			
		||||
, "/:filename/"                   : "/my-file-name/"
 | 
			
		||||
, "/:collection/:title/"          : "/posts/my-title/"
 | 
			
		||||
, "/:collection/:filename"        : "/posts/my-file-name/"
 | 
			
		||||
, "/:something/:or/:other"        : "/:something/:or/:other/"
 | 
			
		||||
, "/:categories/:title/"          : "/desi/my-title/"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Object.keys(cases).forEach(function (tpl) {
 | 
			
		||||
  var entity
 | 
			
		||||
    , tpld
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
  entity = {
 | 
			
		||||
    year          : '2015'
 | 
			
		||||
  , month         : '07'
 | 
			
		||||
  , day           : '04'
 | 
			
		||||
  , title         : "My Title"
 | 
			
		||||
  , slug          : "my-title"
 | 
			
		||||
  , name          : "My-File-Name.html"
 | 
			
		||||
  , relativePath  : "posts/fun"
 | 
			
		||||
  , path          : "posts/fun/My-File-Name.html"
 | 
			
		||||
  , collection    : "posts"
 | 
			
		||||
  , yml           : { categories: ['desi'] }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  tpld = permalinker(tpl, entity);
 | 
			
		||||
 | 
			
		||||
  if (cases[tpl] !== tpld) {
 | 
			
		||||
    console.error('[ERROR]');
 | 
			
		||||
    console.error(tpl + ' ' + tpld + ' ' + cases[tpl]);
 | 
			
		||||
    throw new Error(
 | 
			
		||||
      "Did not template permalink correctly. "
 | 
			
		||||
      + tpl + ' ' + tpld + ' ' + cases[tpl]
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user