2016-09-09 2 views
1

Я общался с командой Assemble по этой проблеме, которая, по их мнению, кажется проблемой реализации, а не ошибкой.Шаблоны Lodash/Переменные, не обработанные в YAML Front-matter для файлов .hbs

В основном у меня есть сборка (не сжимается), и я пытаюсь извлечь некоторые данные из файла YAML в шаблон руля через сборку YAML front-matter, передавая ее частичной визуализации.

Что я получаю, когда регистрируется сбор данных, так это то, что переменные фронт-материи не определены.

Вместо того, чтобы пройти через все, что я сделал, и фрагменты кода здесь вы можете увидеть эту нить для истории разговора, фрагменты кода и все пытались до сих пор: https://github.com/assemble/assemble/issues/758

Я также создал публичную демонстрацию репо на моем github для тех, кто хочет вытащить его/вилку для дальнейшего расследования.

https://github.com/tgdev/assemble-yaml-demo

Почему шаблон lodash в вводной части возврата не определен, а не содержимое внешнего файла YAML?

UPDATE 11/09/16: Использование JSON, кажется, работает нормально

Изменение данных в YML файлов в формате JSON (с .json расширением) оказывает, как ожидается, с предисловия промежуточного слоя в tools/templates.js так кажется, что на сборке и/или в рулевом дескрипторе возникает проблема с анализом файлов yml.

Вот копия основного файла YML я тестирую с:

content: > 
    <h2>Page sub heading</h2> 
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> 
    <p> 
    <img src="http://placehold.it/1170x658" alt="" class="align-left" /> 
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 
    </p> 
    <p><img src="http://placehold.it/1170x658" alt="" class="align-right" /> 
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 
    </p> 

Итак, мой вопрос, почему не шаблоны lodash в сборке титульных рулей шаблона синтаксического анализа файлы yaml (не определены в журналах)?

+0

Да, хотя на вопросы «Кто-нибудь ...» могут отвечать только «да» и «нет» (и не о программировании, а о возможностях людей). Прямые вопросы лучше. – Anthon

ответ

0

Хорошо, поэтому я, наконец, добрался до конца.

Проблема была в этом ...

Собирают не поддерживает внешние файлы YAML шрифта, так что мне нужно, чтобы использовать этот фрагмент кода непосредственно перед моим ППО.

import yaml from 'js-yaml'; 

templates.dataLoader('yml', function(str) { 
    return yaml.safeLoad(str); 
}); 

Затем расширитель промежуточный слой загружает содержимое YAML файлов с помощью шаблона lodash из предисловия, добавив его в контекст данных.

Итак, вот весь сборщик заданий для справки (я надеюсь, что это поможет кому-то в будущем).

import assemble from 'assemble'; 
import expander from 'expander'; 
import merge from 'lodash.merge'; 
import yaml from 'js-yaml'; 
import through from 'through2'; 
import plumber from 'gulp-plumber'; 
import { projectName, templatesPathConfig as path } from '../project.config'; 

export default function templates() { 

    // Create assemble instance 
    let templates = assemble(); 

    function expand(data) { 
     // `data` is front-matter 
     const ctx = merge({}, templates.cache.data, data); 
     return expander.process(ctx, data); 
    } 

    // @reference 
    // https://github.com/node-base/base-data#dataloader 
    // 
    // @notes 
    // Loading yaml files is not built in. Assemble uses 
    // base-data now. You can add yaml loading by using 
    // a custom dataLoader. 
    templates.dataLoader('yml', function(str) { 
     return yaml.safeLoad(str); 
    }); 

    templates.data(path.data); // path.data = ./src/templates/data/**/*.yml 

    templates.preRender(/\.(hbs|html)$/, function (view, next) { 
     view.data = expand(view.data); 
     next(); 
    }); 

    templates.task('preload', function(cb) { 

     templates.partials(path.partials); 
     templates.layouts(path.layouts); 

     // Register helpers 
     templates.helpers(path.helpers); 

     // Add master pages and listing page 
     templates.pages(path.pages); 
     templates.pages(path.referencePages); 
     templates.pages(path.index); 

     // Add custom data 
     templates.data({ 
      projectName: projectName 
     }); 

     cb(); 

    }); 

    // Assemble task to build template files 
    templates.task('build', ['preload'],() => { 

     // Render out the template files to 'dist' 
     return templates.toStream('pages') 
      .pipe(plumber({ 
       errorHandler: err => { 
        log.error(`${err.message}.`); 
       } 
      })) 
      .pipe(templates.renderFile()) 
      .pipe(plumber.stop()) 
      .pipe(renameExt()) 
      .pipe(templates.dest('dist')); 
    }); 

    // Run the Assemble build method 
    templates.build('build'); 
} 

// Change the file extension through node stream 
function renameExt() { 
    return through.obj((file, enc, next) => { 
     file.extname = '.html'; 
     next(null, file); 
    }); 
} 
Смежные вопросы