Как я могу обратиться к заголовку в MD-файл, используя Jekyll?

Вставка текстовых файлов

Если мы говорим о текстовых файлах, они легко могут быть встроены в исходный код. Просто используйте обратные кавычки, чтобы объявить литерал string следующим образом:

const html = `

Example embedded HTML content.

`

// Sending it:
w.Write([]byte(html))  // w is an io.Writer

Совет по оптимизации:

. В большинстве случаев вам нужно будет только записать ресурс в io.Writer , вы также можете сохранить результат преобразования []byte:

var html = []byte(`
Example...
`)

// Sending it:
w.Write(html)  // w is an io.Writer

Единственное, о чем вы должны быть осторожны, это то, что необработанные строковые литералы не могут содержать символ обратной цитаты (`). Необработанные строковые литералы не могут содержать последовательности (в отличие от интерпретируемых строковых литералов), поэтому, если текст, который вы хотите внедрить, содержит обратные кавычки, вам нужно разбить исходный строковый литерал и объединить кавычки в качестве интерпретированных строковых литералов, как в этом примере:

var html = `

This is a back quote followed by a dot: ` + "`" + `.

`

Производительность не изменяется, так как эти конкатенации будут выполняться компилятором.

Вставка двоичных файлов

Фиксация как байтового фрагмента

Для двоичных файлов (например, изображений) наиболее компактных (в отношении результирующего нативного двоичного файла) и наиболее эффективных было бы иметь содержимое файла как []byte в исходном коде. Это может быть создано сторонними toos / libraries, такими как go-bindata .

Если вы не хотите использовать стороннюю библиотеку для этого, вот простой фрагмент кода, который читает двоичный файл и выводит исходный код Go, который объявляет переменную типа []byte, которая будет инициализирована с точным содержимым файла:

imgdata, err := ioutil.ReadFile("someimage.png")
if err != nil {
    panic(err)
}

fmt.Print("var imgdata = []byte{")
for i, v := range imgdata {
    if i > 0 {
        fmt.Print(", ")
    }
    fmt.Print(v)
}
fmt.Println("}")

Пример вывода, если файл будет содержать байты из 0 до 16 (попробуйте на Go Playground ):

var imgdata = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}

Хранение в качестве base64 string

Если файл не «слишком большой» «(большинство изображений / значков соответствуют критериям), есть и другие жизнеспособные варианты. Вы можете преобразовать содержимое файла в Base64 string и сохранить его в исходном коде. При запуске приложения (func init()) или при необходимости вы можете декодировать его до исходного []byte контента. Go имеет хорошую поддержку кодировки Base64 в пакете encoding/base64 .

Преобразование двоичного файла в base64 string выполняется так же, как:

data, err := ioutil.ReadFile("someimage.png")
if err != nil {
    panic(err)
}
fmt.Println(base64.StdEncoding.EncodeToString(data))

Сохраните строку result64 в исходном коде, например как const.

Декодирование это всего лишь один вызов функции:

const imgBase64 = ""

data, err := base64.StdEncoding.DecodeString(imgBase64) // data is of type []byte

Хранение как указано string

Более эффективно, чем сохранение в качестве base64 , но может быть более длинным в исходном коде, это сохранение строкового литерала , цитируемого двоичных данных. Мы можем получить цитированную форму любой строки, используя функцию strconv.Quote() :

data, err := ioutil.ReadFile("someimage.png")
if err != nil {
    panic(err)
}
fmt.Println(strconv.Quote(string(data))

Для двоичных данных, содержащих значения от 0 до 64, это то, как будет выглядеть вывод (попробуйте на Go Playground ):

"\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?"

(Обратите внимание, что strconv.Quote() добавляет и добавляет к нему кавычку.)

Вы можете напрямую использовать эту цитированную строку в своем исходном коде, например:

const imgdata = "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?"

Он готов к использованию, нет необходимости его декодировать; unquoting выполняется компилятором Go во время компиляции.

Вы также можете сохранить его в виде байтового фрагмента, если вам это нужно:

var imgdata = []byte("\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?")
0
задан Dannad 11 March 2019 в 13:47
поделиться

2 ответа

Если ваши файлы находятся в корневом каталоге, то это не posts, а pages.

Вы можете перемещаться по такому пространству имен, как: {% for page in site.pages %}

0
ответ дан marcanuy 11 March 2019 в 13:47
поделиться

Как подсказывает @marcanuy, я бы положил ваши файлы в каталог _pages. Обязательно добавьте include: ['_pages'] к настройкам вашей сборки в _config.yml

. Теперь вы можете просматривать страницы с помощью {% for page in site.pages %}. Это все еще оставляет проблему получения всех заголовков. Когда я создавал TOC определенного типа в jekyll, я нашел этот фрагмент кода очень полезным. Вы можете использовать элементы оттуда.

Базовая версия того, что вы хотите, будет следующей. Вам придется настроить это на основе вашей настройки, но она должна делать то, что вы хотите. Вы можете поместить это в отдельный HTML-документ в _includes или поместить прямо в вашу панель навигации.


{% for page in site.pages %}

<ul>
    {% assign headers = page.content | split: '<h' %}
        {% for header in headers %}
            {% assign _string = header | split: '</h' %}
            {% capture _hAttrToStrip %}{{ _string[0] | split: '>' | first }}>{% endcapture %}
            {% assign title = _string[0] | replace: _hAttrToStrip, '' %}

            {% assign _idstring = header | split: 'id="' %}
            {% assign _idstring = _idstring[1] | split: '"' %}
            {% assign html_id = _idstring[0] %}

            <li>
                <a href={{page.url}}#{{html_id}}>{{title}}</a>
            </li>
        {% endfor %}
</ul>
{% endfor %}

Надеюсь, это поможет!

0
ответ дан RobbeVP 11 March 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: