Перекрестная ссылка (названная привязка) в уценке

Ответы:

692
Take me to [pookie](#pookie)

должна быть правильный синтаксис уценки для перехода к точке якоря с именем Pookie.

Чтобы вставить точку привязки с таким именем, используйте HTML:

<a name="pookie"></a>

Уценка, кажется, не возражает против того, где вы поставили опорную точку. Полезное место, чтобы поместить это в заголовке. Например:

### <a name="tith"></a>This is the Heading

работает очень хорошо. (Я бы продемонстрировал здесь, но средство визуализации SO удаляет якорь.)

Обратите внимание на самозакрывающиеся теги и id=противname=

В более ранней версии этого поста предлагалось <a id='tith' />использовать самозакрывающийся синтаксис для XHTML и использовать idатрибут вместо name.

XHTML позволяет любому тегу быть «пустым» и «самозакрытым». Таким образом, <tag />это сокращенная <tag></tag>пара подходящих тегов с пустым телом. Большинство браузеров принимают XHTML, но некоторые нет. Чтобы избежать кросс-браузерных проблем, закройте тег явно, используя <tag></tag>, как рекомендовано выше.

Наконец, атрибут name=был объявлен устаревшим в XHTML, поэтому я изначально использовал его id=, что все признают. Тем не менее, HTML5 теперь создает глобальную переменную в JavaScript при использовании id=, и это не обязательно то, что вы хотите. Таким образом, использование name=теперь, вероятно, будет более дружественным.

(Благодаря Slipp Дугласа для объяснения XHTML мне, и гвоздезабивной для указывая на HTML5 побочный эффект - смотрите комментарии и гвоздильщик «s ответ более подробно. , name=Кажется, работает везде, хотя это не рекомендуется в XHTML.)

Стив Пауэлл
источник
1
Вы не сможете увидеть, как сделать ссылку на демонстрацию вашего заголовка после того, как StackOverflow отобразит HTML-код, потому что их отображение убирает ваш тег <a> . То есть вы не можете в StackOverflow Markdown.
Слипп Д. Томпсон
2
Тем не менее, это будет работать в других, более либеральных рендерерах Markdown, но вам понадобится закрывающий тег <a> ; <a> тег не позволяет самозакрывающихся. Кроме того, я обнаружил, что мой браузер пропускает заголовок, если тег <a> не находится перед содержимым заголовка. Исправления внесены в ваши примеры.
Слипп Д. Томпсон
2
Подожди там, ковбой. То, что у вас нет стилизации <a>без href, не означает, что он сам закрывается. Если только я полностью не сумасшедший, оба из них: test-xhtml11 и [ sln.6bitt.com/public/test-html5.html](test-html5) отображают остальную часть страницы в теге <a>. Идите вперед и проверьте с веб-инспектором по вашему выбору.
Слипп Д. Томпсон
4
@Slipp: ОК, я думаю, я понимаю, сейчас. Вы закодировали <a id="hi"/> rest of doc, но с этим обращались как <a id="hi"> rest of doc</a>. (И элементный анализ страницы тоже показывает это.) Моя ошибка: я посмотрел на элементы, отображаемые не в необработанном источнике. Как вы думаете, ответ должен быть изменен, в свете этого наблюдения?
Стив Пауэлл
3
nameАтрибут также создает глобальные переменные (см stackoverflow.com/questions/3434278/... ), так что вы можете также использовать idатрибут в качестве целевого фрагмента URL - идентификатора, как и предполагалось.
Бобби Джек
93

На bitbucket.org проголосовавшее решение не сработает. Вместо этого, при использовании заголовков (с ##), можно ссылаться на них как на якоря, используя префикс # markdown-header-my-header-name, где # markdown-header- это неявный префикс, сгенерированный средством визуализации, и остальное - заголовок в нижнем регистре с черточками, заменяющими пробелы.

пример

## My paragraph title

будет производить неявный якорь, как это

#markdown-header-my-paragraph-title

Весь URL перед каждой привязкой является необязательным, т.е.

[Some text](#markdown-header-my-paragraph-title)

эквивалентно

[Some text](https://bitbucket.org/some_project/some_page#markdown-header-my-paragraph-title) 

при условии, что они находятся на одной странице.

Источник: https://bitbucket.org/tutorials/markdowndemo/overview (отредактируйте источник этого файла .md и посмотрите, как создаются якоря).

La Muerte Peluda
источник
1
Это может сделать так же. В соответствии с этим: confluence.atlassian.com/bitbucket/… bitbucket поддерживает расширение оглавления, которое может автоматически генерировать ссылки и привязки на основе заголовков документа. Расширение TOC задокументировано здесь: pythonhosted.org/Markdown/extensions/toc.html Добавьте текст «[TOC]» в начало документа для его генерации.
Binary Phile
8
В Github ## My paragraph titleсоздаст следующий якорь user-content-my-paragraph-title, поэтому вы можете ссылаться на него с помощью [Some text] (# user-content-my-para-title). Однако я не нашел официальной документации для этого.
toto_tico
Это помогло мне и в Bitbucket - работает как шарм.
Скотт Байерс
1
Это полезная информация; благодарю вас. Однако средства визуализации с разметкой без расширений не будут генерировать эти якоря для вас, а конфликт между именами заголовков приведет к конфликту идентификаторов якорей (или к некоторому бесполезному различающему трюку, такому как достаточно числа). Явные идентификаторы привязки лучше, более управляемы, не подвержены случайным изменениям из-за обновления текста (см. Трюк выше) и полезны для привязки не только к заголовкам. Оба метода необходимы в целом.
Стив Пауэлл
On stackedit.io [linky](#header) был достаточным якорем и работал, когда публиковался в Gist.
Фелипе Альварес
67

Используйте name. Использование idHTML не обязательно в HTML 5 и создаст глобальные переменные в вашем JavaScript

См. Спецификацию HTML 5, 5.9.8 Переход к идентификатору фрагмента - оба idи nameиспользуются.

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

Пример использования имени:

Take me to [pookie](#pookie)

И якорь назначения:

### <a name="pookie"></a>Some heading
mikemaccana
источник
5
Downvoting. Аргумент глобальной переменной является слабым, так как вам все равно не следует (напрямую) определять глобальные переменные в вашем JS, поэтому никакого конфликта не произойдет. Также семантика nameи idразные.
Марнен Лайбоу-Козер
9
@ MarnenLaibow-Koser Никто не обсуждает определение глобальных переменных в JS. Создание идентификатора в HTML создает глобальный window.someid в большинстве браузеров.
mikemaccana
14
@ MarnenLaibow-Koser Многие библиотеки (т.е. не ваши собственные JS, а чужие) используют один глобальный объект - например, Fineuploader. Если вы сделаете элемент с идентификатором fineuploader, вы не сможете использовать fineuploaderмодуль. Избегание создания ненужных глобалов помогает избежать этих конфликтов.
mikemaccana
5
Мне было бы интересно запустить некоторые тесты этого случая и выяснить, какой из них имеет приоритет. Я ценю теоретическую проблему, но за годы клиентской разработки у меня никогда не было взлома идентификатора любого JS на стороне клиента (при условии, что HTML-код был действительным). Я буду продолжать использовать их, когда они семантически уместны, пока я не столкнусь с реальными проблемами.
Марнен Лайбоу-Козер
2
@ MarnenLaibow-Koser У меня (и многих других) HTML-идентификаторы нарушали настоящий JavaScript - в комментарии, на который вы отвечаете, есть один очень практичный пример! Есть много руководств по стилю и компаний, которые всегда используют классы, даже для одиноких, и вот почему.
mikemaccana
17

Markdown Anchor поддерживает хэшмарк, поэтому ссылка на якорь на странице будет просто[Pookie](#pookie)

Генерация привязки фактически не поддерживается в Gruber Markdown, но есть в других реализациях, таких как Markdown Extra .

В Markdown Extra идентификатор привязки добавляется к заголовку или подзаголовку с помощью {#pookie}.

Github Flavored Markdown на страницах репозитория Git (но не в Gists) автоматически генерирует якоря с несколькими тегами разметки на всех заголовках (h1, h2, h3 и т. Д.), Включая:

  • id="user-content-HEADERTEXT"
  • class="anchor"
  • href="#HEADERTEXT"
  • aria-hidden="true" (это для значка ссылки SVG, который отображается при наведении мыши)

Исключая значок aria / svg, когда пишется:

  • # Header Title

Github генерирует:

  • <h1><a id="user-content-header-title" class="anchor" href="#header-title">Header Title</a></h1>

Поэтому для создания ссылок на заголовки ничего не нужно делать, и всегда можно ссылаться на них с помощью:

  • Ссылка на [Header Title](#header-title)
jeffmcneill
источник
16

Нет доступного синтаксиса, чтобы сделать это в оригинальном синтаксисе Markdown, но Markdown Extra предоставляет средства, по крайней мере, для присвоения идентификаторов заголовкам, которые затем можно легко связать. Также обратите внимание, что вы можете использовать обычный HTML как в Markdown, так и в Markdown Extra, и что nameатрибут был заменен idатрибутом в более поздних версиях HTML.

Вы
источник
9

Для тех, кто ищет решение этой проблемы в GitBook. Вот как я заставил это работать (в GitBook). Вам нужно явно пометить свой заголовок, например так:

# My Anchored Heading {#my-anchor}

Тогда ссылка на этот якорь, как это

[link to my anchored heading](#my-anchor)

Решение и дополнительные примеры можно найти здесь: https://seadude.gitbooks.io/learn-gitbook/

keyoxy
источник
Спасибо! это работает! это должно быть проголосовано!
Декстер
Лучший ответ! Спасибо
Invis
7

Поздно на вечеринке, но я думаю, что это дополнение может быть полезно для людей, с которыми работает rmarkdown. В rmarkdownесть встроенная поддержка для ссылок на заголовки в документе.

Любой заголовок, определенный

# Header

может быть ссылка на

get me back to that [header](#header)

Ниже приведен минимальный автономный .rmdфайл, демонстрирующий это поведение. Это может быть связано .pdfи .html.

---
title: "references in rmarkdown"
output:
  html_document: default
  pdf_document: default
---

# Header

Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. 

Go back to that [header](#header).
symbolrush
источник
4

Используя последнюю версию Markdown, вы сможете использовать следующий синтаксис:

[](){:name='anchorName'}

Это должно создать следующий HTML:

<a name="anchorName"></a>

Если вы хотите, чтобы у привязки был текст, просто добавьте текст привязки в квадратных скобках:

[Some Text](){:name='anchorName'}

Райан МакГиннесс
источник
Кажется, только Marukuзнает об этом синтаксисе. Смотри бабелмарк.
Ulysse BN
3

Для наиболее распространенных генераторов уценки. У вас есть простой самогенерируемый якорь в каждом заголовке. Например, с помощью pandoc сгенерированный якорь будет слагом кебаба вашего заголовка.

 echo "# Hello, world\!" | pandoc
 # => <h1 id="hello-world">Hello, world!</h1>

В зависимости от того, какой анализатор уценки вы используете, якорь может измениться (возьмите пример ответов Symbolrush и La muerte Peluda, они разные!). Посмотрите эту метку, где вы можете увидеть сгенерированные привязки в зависимости от вашей реализации уценки .

Улисс Б.Н.
источник