Введение
Включение одного набора данных в другой, автоматическая трансклюзия в Википедии.
transclusion on Wikipedia
В информатике трансклюзия — это включение части или всего электронного документа в один или несколько других документов по ссылке через гипертекст. Трансклюзия обычно выполняется при отображении ссылающегося документа и, как правило, происходит автоматически и незаметно для конечного пользователя. Результатом трансклюзии является единый интегрированный документ, состоящий из частей, динамически собираемых из отдельных источников, которые могут храниться на разных компьютерах в разных местах. Трансклюзия облегчает модульный дизайн (с использованием модели "единого источника достоверной информации" для данных, кода или контента): ресурс хранится один раз и распространяется для повторного использования в нескольких документах. Обновления или исправления ресурса затем автоматически отражаются во всех ссылающихся документах. В системах, где трансклюзия недоступна, или в ситуациях, когда она доступна, но нежелательна, часто используется альтернативный подход – подстановка, при которой статическая копия "единого источника достоверной информации" интегрируется в соответствующий документ. Примеры обоих подходов можно увидеть в способах создания контента в Википедии (подробнее см. Википедия:Трансклюзия и Википедия:Подстановка). Подставленные статические копии требуют иного подхода к контролю версий, чем трансклюзия, но иногда они необходимы. Термин "трансклюзия" был введен Тедом Нельсоном в его нелинейной книге "Литературные машины" 1980 года, однако идея мастер-копии и ее экземпляров была применена за 17 лет до этого в Sketchpad.
Нейтральность контекста
Трансклюзия работает эффективнее, когда трансклюзируемые фрагменты текста являются самодостаточными, чтобы смысл и корректность текста не зависели от контекста. Например, формулировки вроде "как описано в предыдущем разделе" создают проблемы, поскольку трансклюзированный фрагмент может оказаться в другом контексте, что вызовет недоразумения. Что именно считается "независимым от контекста" текстом, может варьироваться, но часто к этому относится информация о компании или типовой текст. Чтобы решить проблемы, связанные с зависимостью от контекста, подобные вышеупомянутым, системы, поддерживающие трансклюзию, часто также способны отключать определенные элементы внутри трансклюзируемого контента. Например, Википедия использует теги, такие как "noinclude", "onlyinclude" и "includeonly" для этой цели. Типичными примерами элементов, для которых часто требуются такие исключения, являются заголовки документов, сноски и перекрестные ссылки; таким образом, они могут быть автоматически исключены при трансклюзии, без необходимости ручной правки в каждом конкретном случае.
Параметризация
При определенных обстоятельствах и в некоторых технических контекстах, включенные разделы текста могут не требовать строгого соблюдения принципа "контекстной нейтральности", поскольку включенные разделы допускают параметризацию. Параметризация подразумевает возможность изменения определенных частей или подраздела включенного текста в зависимости от внешних переменных, которые могут быть изменены независимо. Обычно это достигается путем предоставления включенному тексту одного или нескольких заполнителей для подстановки. Эти заполнители затем заменяются соответствующими значениями переменных перед отображением окончательного результата в контексте.
Происхождение
Концепция повторного использования содержимого файлов зародилась в языках компьютерного программирования: COBOL в 1960 году, затем BCPL, PL/I, C, а к 1978 году даже FORTRAN. Директива include позволяет повторно использовать общий исходный код, избегая проблем, связанных с копированием и вставкой кода, а также с жестким кодированием констант. Как и многие инновации, это привело к возникновению новой проблемы. Несколько директив include могут предоставлять одно и то же содержимое, что непреднамеренно приводит к повторению одного и того же исходного кода в конечном результате и, как следствие, к ошибке. Защитные блоки (include guards) помогают решить эту проблему, исключая повторное включение одного и того же содержимого после его первого включения. Идея единого, повторно используемого источника информации легла в основу таких принципов, как "Не повторяйся" (Don't Repeat Yourself) и принцип абстракции. Кроме того, это оказалось полезным для повышения переносимости программ. Переносимый исходный код использует директиву include для указания стандартной библиотеки, которая содержит системный код, специфичный для каждой компьютерной среды.
История и реализация проекта Xanadu
Тед Нельсон, автор терминов "гипертекст" и "гипермедиа", также ввел термин "трансклюзия" в своей книге 1980 года "Литературные машины". Частью его предложения была идея автоматического взимания микроплатежей с читателя за весь текст, вне зависимости от количества извлеченных фрагментов контента из различных источников. Однако, по словам Нельсона, концепция трансклюзии уже фигурировала в его описании гипертекста 1965 года. Нельсон определяет трансклюзию как "одно и то же содержание, однозначно идентифицируемое в нескольких местах", отличая её от более частных случаев, таких как включение контента из другого источника (которое он называет трансливерией) или явная цитата, сохраняющая связь со своим первоисточником (которую он называет транскуотацией). Некоторые гипертекстовые системы, включая проект Теда Нельсона Xanadu, поддерживают трансклюзию. Нельсон продемонстрировал веб-трансклюзию с помощью программы "Маленький Трансквотер" (разработанной Эндрю Пэмом по спецификации Нельсона в 2004–2005 годах). Она создает новый формат, основанный на адресных частях веб-страниц; при переходе по ссылкам каждая часть на результирующей странице остается связанной со своим исходным контекстом.
Реализация в Интернете
HTTP, как протокол передачи, имеет базовую поддержку включения (трансклюзии) посредством передачи байтов: указания диапазона байтов в HTTP-запросе. Включение может происходить до (на стороне сервера) или после (на стороне клиента) передачи. Например:
HTML-документ может быть предварительно скомпонован сервером перед отправкой клиенту с использованием Server Side Includes или другого серверного приложения. XML-сущности или HTML-объекты могут быть обработаны клиентом, который затем запрашивает соответствующие ресурсы отдельно от основного документа. Веб-браузер может кэшировать элементы, используя собственные алгоритмы, которые могут работать без явных директив в разметке документа. AngularJS использует включение для работы с вложенными директивами. Издатели веб-контента могут возражать против включения материалов с их веб-сайтов на другие веб-сайты или требовать соглашения на это. Критики этой практики могут называть различные формы встроенных ссылок кражей трафика или паразитированием. Другие издатели, напротив, могут стремиться к тому, чтобы их материалы включались на другие веб-сайты, например, в виде веб-рекламы или виджетов, таких как счетчик посещений или веб-маяк. Mashup-приложения используют включение для сборки ресурсов или данных в новое приложение, например, размещая фотографии с геометками на интерактивной карте или отображая бизнес-метрики на интерактивной панели управления.
An HTML document may be pre composed by the server before delivery to the client using Server Side Includes or another server side application. XML Entities or HTML Objects may be parsed by the client, which then requests the corresponding resources separately from the main document. A web browser may cache elements using its own algorithms, which can operate without explicit directives in the document's markup. AngularJS employs transclusion for nested directive operation. Publishers of web content may object to the transclusion of material from their own web sites into other web sites, or they may require an agreement to do so. Critics of the practice may refer to various forms of inline linking as bandwidth theft or leeching. Other publishers may seek specifically to have their materials transcluded into other web sites, as in the form of web advertising, or as widgets like a hit counter or web bug. Mashups make use of transclusion to assemble resources or data into a new application, as by placing geo tagged photos on an interactive map, or by displaying business metrics in an interactive dashboard.
HTML на стороне клиента
HTML определяет элементы для клиентской трансклюзии изображений, скриптов, таблиц стилей, других документов и других типов медиафайлов. HTML с самого начала развития Web в значительной степени опирался на клиентскую трансклюзию (чтобы веб-страницы могли отображаться быстрее, до завершения загрузки мультимедийных элементов), а не на встраивание необработанных данных для таких объектов непосредственно в разметку веб-страницы. Благодаря таким технологиям, как Ajax, скрипты, связанные с HTML-документом, могут давать веб-браузеру указание изменять документ непосредственно в браузере, в отличие от прежнего метода, требовавшего загрузки полностью новой версии страницы с веб-сервера. Эти скрипты могут трансклюзировать элементы или документы с сервера после того, как веб-браузер отрисует страницу, например, в ответ на действия пользователя или изменение условий. Будущие версии HTML могут поддерживать более глубокую трансклюзию фрагментов документов с использованием XML-технологий, таких как сущности, ссылки на документы XPointer и преобразования XSLT. Прокси-серверы могут использовать трансклюзию для сокращения избыточной передачи часто запрашиваемых ресурсов. Популярный Front-End фреймворк AngularJS, разработанный и поддерживаемый Google, имеет директиву ng-transclude, которая указывает точку вставки для трансклюдированного DOM ближайшей родительской директивы, использующей трансклюзию.
Трансклюзирование на стороне сервера
Трансклюзия может быть реализована на стороне сервера, например, с помощью Server Side Includes и ссылок на сущности разметки, обрабатываемых серверным программным обеспечением. Это характеристика шаблонов подстановки.
Запрет на использование исходного кода
Трансклюзия исходного кода в конструкторскую или справочную документацию позволяет включать исходный код в документ, но не выполнять его интерпретацию как часть документа, сохраняя при этом семантическую целостность включенного кода по отношению к его исходной кодовой базе.
Трансклюзия в управлении контентом
В управлении контентом для публикации из единого источника, современные системы управления контентом всё чаще поддерживают трансклюзию и подстановку. Особенно системы управления компонентным контентом стремятся довести принцип модульного дизайна до оптимальной степени реализации. MediaWiki предоставляет возможности трансклюзии и подстановки и является хорошим готовым решением для многих небольших организаций (например, небольших некоммерческих организаций и малого и среднего бизнеса), у которых может не быть средств на другие коммерческие решения; подробности см. в статье «Система управления компонентным контентом».
Внедрение в разработке программного обеспечения
Общая черта языков программирования — возможность одного файла исходного кода включать в себя, целиком или частично, другой файл исходного кода. Включенная часть интерпретируется так, как если бы она была частью включающего файла. Некоторые из методов:
Включение: Некоторые программы явно включают другой файл. Включенный файл может содержать исполняемый код, объявления, инструкции компилятора и/или переходы к более поздним частям документа, в зависимости от переменных времени компиляции. Макросы: Языки ассемблера и некоторые языки программирования высокого уровня обычно предоставляют макросы — специальные именованные инструкции, используемые для определения, генерации исполняемого кода, организации циклов и других ветвлений, а также для изменения создаваемого документа в соответствии с параметрами, передаваемыми макросу при обработке файла. Копирование: В языке программирования Cobol есть команда COPY, которая вставляет скопированный файл в копирующий документ, заменяя команду COPY. Код и объявления в скопированном файле могут быть изменены с помощью аргумента REPLACING как части команды копирования.
Include: Some programs will explicitly INCLUDE another file. The included file can consist of executable code, declarations, compiler instructions, and/or branching to later parts of the document, depending on compile time variables. Macro: Assembly languages, and some high level programming languages, will typically provide for macros, special named instructions used to make definitions, generate executable code, provide looping and other decisions, and modify the document produced according to parameters supplied to the macro when the file is rendered. Copy: The Cobol programming language has the COPY command, in which a copied file is inserted into the copying document, replacing the COPY command. Code and declarations in the copied file can be modified by a REPLACING argument as part of the copying command.