Преобразование тегов HTML в WordML с помощью JavaScript

Знаете ли вы какой-либо способ конвертировать теги HTML в WordML только с помощью JavaScript. Мне нужно получить содержимое элемента DOM и преобразовать то, что внутри, в WordML.


person Popescu Andrei Vlad    schedule 29.02.2016    source источник
comment
Нужно ли вообще его менять или это уже фактически действующий WordML?   -  person justin.m.chase    schedule 29.02.2016
comment
Мне нужно изменить его. По сути, я хочу получить содержимое DOM, изменить разметку на допустимый WordML и создать документ XML Word с помощью FileSaver.js.   -  person Popescu Andrei Vlad    schedule 29.02.2016


Ответы (1)


Глядя на npm похоже, что для этого уже нет библиотеки.

Так что я думаю, вам придется сделать свой собственный. При этом WordML — это всего лишь разновидность XML, верно? Вы имеете в виду WordML?

Таким образом, получить содержимое элемента DOM довольно просто, вы можете сделать это с помощью jQuery.

var ele = $('#wordml-element');

Оттуда вы теперь захотите преобразовать его в WordML совместимый XML. Вы можете попробовать использовать для этого библиотеку xml на npm.

Таким образом, вы будете преобразовывать элементы DOM с древовидной структурой в элементы XML с древовидной структурой. Рекомендуемый шаблон для этого известен как Шаблон посетителя.

Оттуда у вас останется структура XML, которой вы сможете манипулировать, используя тот же шаблон. В конце вы преобразуете структуру XML в строку и сохраните ее в файл.

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

var xml = require('xml')

function onTransformButtonClick() {
  var options = {} // see documentation
  var ele = $('#wordml-element')[0]
  var wordml = transformElement(ele)
  var text = xml(wordml, options);
  fileSave(text);
}

function transformElement(ele) {
  switch(ele.tagName) { // You could use attributes or whatever
    case 'word-document':
      return transformDocument(ele);
    case 'word-body':
      return transformBody(ele);
    case 'word-p':
      return transformParagraph(ele);
    case 'word-r':
      return transformRun(ele);
    case 'word-text':
      return transformText(ele);
  }
}

function transformDocument(ele) {
  var wordDocument = xml.element({...})
  ele.childNodes.forEach(function (child) {
    wordDocument.push(transformElement(child))
  })
  return [wordDocument]
}

function transformBody(ele) {
  // create new element via xml library...
}

function transformParagraph(ele) {
  // create new element via xml library...
}

function transformRun(ele) {
  // create new element via xml library...
}

function transformText(ele) {
  // create new element via xml library...
}

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

person justin.m.chase    schedule 29.02.2016
comment
Разве оператор switch не будет использовать теги HTML, а не теги WordML, поскольку он хочет преобразовать HTML в WordML? Также я думаю, что вам нужно будет сделать ele[0].tagName, так как это селектор jQuery, а не собственный элемент DOM. - person dmeglio; 29.02.2016
comment
Это должно включать теги HTML да. Вы можете иметь такие элементы в html, как <word-document>, если хотите, но, может быть, он использует <div kind="word-document">. Я не знаю, но это было бы совсем другое, если включить: ele.attr('kind'). Идея заключается в том, что посетитель ориентируется на некое идентифицирующее значение. Но вы правы насчет ele[0], если только вы не хотите использовать jquery для получения имени тега. Я обновлю фрагмент. - person justin.m.chase; 29.02.2016