Подчеркивание не отображается в Ooxml - PullRequest
1 голос
/ 04 марта 2020

Я отлаживаю надстройку Word office js. Одна вещь, которую он должен сделать, это создать скрытый раздел в документе Word. Для этого я передаю некоторую информацию в функцию javascript, которая создает строку Oo XML. Я даю пользователю возможность встраивать некоторый текст в раздел, и пользователь должен иметь возможность выделять курсивом, выделять жирным шрифтом, подчеркивать или применять любую комбинацию этих форматов к встроенному тексту. Курсив и выделение жирным шрифтом работают нормально, но подчеркивание не работает.

Встроенный текст вводится в текстовое поле html в надстройке. Пользователь может щелкнуть кнопку курсивом, другую кнопку жирным шрифтом, третью кнопку подчеркивания или четвертую кнопку, чтобы удалить эти украшения. События нажатия кнопок предшествуют и добавляют теги html, поэтому строка текста, выделенная жирным шрифтом, курсивом и подчеркиванием, будет отправлена ​​следующим образом:

<b><i><u>string of text</u></i></b>

Затем другая функция преобразует это в Oo xml. Получившийся oo xml выглядит следующим образом:

<w:r> <w:rPr> <w:b /> <w:i /> <w:u /> </w:rPr> <w:instrText xml:space="preserve">string of text</w:instrText> </w:r>

(я вижу строку oo xml в моем журнале консоли).

После того, как код вставит это в документ, оно выделено жирным шрифтом и курсивом, но не подчеркнуто. Я попытался поиграться с функцией, которая генерирует код, например, убрав пробел между w: u и />:

<w:r> <w:rPr> <w:b/>  <w:i/> <w:u/> </w:rPr> <w:instrText xml:space="preserve">string of text</w:instrText> </w:r>

Я попытался удалить конечную обратную косую черту sh на этих тегах, но это нарушило вызов range.insertOo xml (). Я также попытался добавить атрибут aw: val = "single", потому что я не был уверен, требуется ли val, ie.:

<w:r> <w:rPr> <w:b />  <w:i /> <w:u w:val="single" /> </w:rPr> <w:instrText xml:space="preserve">string of text</w:instrText> </w:r>

Я в этой точке тупик. Код агности c относительно того, какой тег используется - ему все равно, ab, i или u. Я понимаю, что <w:b /> и <w:i /> являются переключателями, а <w:u /> может и не быть - мне нужно обрабатывать это по-другому? Кто-нибудь еще сталкивался с этой проблемой, и есть ли что-то не так с Oo xml, на который кто-то может указать?

Спасибо.

РЕДАКТИРОВАТЬ: Чтобы уточнить, что я изначально включил, было только форматирование текста внутри скрытого раздела. Ниже приведен полный OO Xml, который создает код. Я разделяю код до и после исходного отформатированного текста, чтобы вы могли видеть, где он вписывается во весь код Oo Xml:

Перед строкой форматированного текста:

<pkg:package xmlns:pkg='http://schemas.microsoft.com/office/2006/xmlPackage'><pkg:part pkg:name='/_rels/.rels' pkg:contentType='application/vnd.openxmlformats-package.relationships+xml' pkg:padding='512'><pkg:xmlData><Relationships xmlns='http://schemas.openxmlformats.org/package/2006/relationships'><Relationship Id='rId1' Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument' Target='word/document.xml'/></Relationships></pkg:xmlData></pkg:part><pkg:part pkg:name='/word/document.xml' pkg:contentType='application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml'><pkg:xmlData><w:document xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' >
<w:body><w:p><w:r> <w:fldChar w:fldCharType='begin' /> </w:r> <w:r><w:rPr><w:color w:val='C00000'/></w:rPr><w:instrText xml:space="preserve">
"XE Startindex_1_id_000014_e"</w:instrText> </w:r> 

Форматированная текстовая строка:

<w:r> <w:rPr> <w:b /> <w:i /> <w:u /> </w:rPr> <w:instrText xml:space="preserve">string of text</w:instrText> </w:r>

После форматированной текстовой строки:

<w:r><w:rPr><w:color w:val='C00000'/></w:rPr><w:instrText xml:space="preserve">"XE Endindex_1_id_000014"</w:instrText> </w:r> <w:r> <w:fldChar w:fldCharType='end' /> </w:r></w:p></w:body></w:document></pkg:xmlData></pkg:part></pkg:package>

1 Ответ

0 голосов
/ 09 марта 2020

Хотя я не совсем уверен относительно требований к «скрытому разделу», здесь есть два варианта разметки Open XML, которые Word будет отображать как жирный, выделенный курсивом и подчеркнутый текст.

Давайте начните с обычного текста, для которого вы бы использовали элемент w:t. Текст ниже не скрыт, однако. Если вы хотите скрыть это, вам нужно добавить элемент w:vanish к w:rPr. В этом случае Word будет отображать тонкую пунктирную линию и не будет отображать нормальное подчеркивание (которое в любом случае не следует использовать в документах с профессиональным набором текста).

    <w:p>
      <w:r>
        <w:rPr>
          <w:b/>
          <w:i/>
          <w:u w:val="single"/>
        </w:rPr>
        <w:t>string of text</w:t>
      </w:r>
    </w:p>

В вашем вопросе вы используете w:instrText элемент, который обычно является частью сложного поля. Таким образом, в следующем примере показано сложное поле:

    <w:p>
      <w:r>
        <w:fldChar w:fldCharType="begin"/>
      </w:r>
      <w:r>
        <w:rPr>
          <w:b/>
          <w:i/>
          <w:u w:val="single"/>
        </w:rPr>
        <w:instrText>string of text</w:instrText>
      </w:r>
      <w:r>
        <w:fldChar w:fldCharType="separate"/>
      </w:r>
      <!--
        Note that Word will insert a w:r with an error message (Bookmark not found)
        at this point, if you ever update fields.
        -->
      <w:r>
        <w:fldChar w:fldCharType="end"/>
      </w:r>
    </w:p>

Код поля обычно не отображается, поэтому текст скрыт. Однако если вы обновите поля, Word отобразит сообщение об ошибке, в котором вы поместили поле.

В вашем вопросе вы не включили элементы w:r с дочерними элементами w:fldChar, поэтому ваш текст будет всегда быть видимым, а также подчеркнутым. Кроме того, Word превратит w:instrText в w:t, поэтому вы вернетесь к моему первому примеру.

Обновление 2020-03-12

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

Word Index

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

enter image description here

У меня есть просто отформатировал текст в фигурных скобках вручную. Главное, на что нужно обратить внимание, это то, что это фактическое поле XE (индексная запись). Поэтому вам нужно создать разметку для фактического поля (как показано в моем втором примере) и убедиться, что поле выглядит так (используя первый абзац в качестве примера):

    <w:p>
      <w:r>
        <w:t>This is some</w:t>
      </w:r>

      <!-- Your field begins here -->

      <w:r>
        <w:fldChar w:fldCharType="begin"/>
      </w:r>
      <w:r>
        <w:instrText xml:space="preserve"> XE "</w:instrText>
      </w:r>
      <w:r>
        <w:rPr>
          <w:i/>
        </w:rPr>
        <w:instrText>Defoe</w:instrText>
      </w:r>
      <w:r>
        <w:instrText xml:space="preserve">, Daniel\; </w:instrText>
      </w:r>
      <w:r>
        <w:rPr>
          <w:b/>
        </w:rPr>
        <w:instrText>Moby Dick</w:instrText>
      </w:r>
      <w:r>
        <w:instrText xml:space="preserve">" </w:instrText>
      </w:r>
      <w:r>
        <w:fldChar w:fldCharType="end"/>
      </w:r>

      <!-- Your field ends here -->

      <w:r>
        <w:t xml:space="preserve"> text.</w:t>
      </w:r>
    </w:p>

Обратите внимание, что вы должны escape-двоеточие (:) и точка с запятой (;) в коде поля.

...