Нужна помощь в импорте NodeJS-модуля "htmlparser2" в SmartMobileStudio
Я пытался использовать модуль htmlparser2 (установлен через npm install htmlparser2
) в SmartMobileStudio. Сам модуль хорошо работает в прямом javascript (используя слегка измененный пример с домашней страницы htmlparser2):
var htmlparser = require("htmlparser2");
var parser = new htmlparser.Parser({
onopentag: function(name, attribs){
console.log(name);
console.log(attribs);
}
});
parser.write("<img src='image1.jpg'>");
parser.end();
С помощью SMS (2.0.0.9 Beta) я попытался импортировать модуль следующим образом:
unit NodeJS.htmlparser2;
interface
uses
NodeJS.Core,
NodeJS.events;
type
TOnTag = procedure(name: string; attribs: Variant);
TOnText = procedure(text: string);
JParser = class external(NodeJS.events.JNodeEventEmitter)
procedure write(s: string);
procedure &end;
end;
Jhtmlparser_Exports = class external
public
function Parser(onopentag: TOnTag; ontext: TOnText; onclosetag: TOnTag): JParser;
end;
function htmlparser2: Jhtmlparser_Exports;
implementation
function htmlparser2: Jhtmlparser_Exports;
begin
result := Jhtmlparser_Exports( require("htmlparser2") );
end;
end.
Я изменил проект, сгенерированный Node.js-New-Project-Template, следующим образом:
[...]
procedure TServer.Run;
begin
var htmlparser := NodeJS.htmlparser2.htmlparser2;
var parser := htmlparser.Parser(
procedure (Name: string; Attribs: Variant)
begin
console_.log([Name]);
console_.log([Attribs]);
end,
nil,
nil);
parser.write("<img src='image1.jpg'>");
parser.end();
end;
Проблема в том, что выданный код не является правильным, но почти:
[...]
parser = htmlparser.Parser(function (Name$3, Attribs) {
console_().log([Name$3].slice());
console_().log([Attribs].slice());
},null,null);
[...]
Это работает:
[...]
parser = new htmlparser.Parser({onopentag: function (Name$3, Attribs) {
console_().log([Name$3].slice());
console_().log([Attribs].slice());
}});
[...]
Разница заключается в ключевом слове "new" и обратном вызове именованного события "onopentag". Что мне нужно написать, чтобы генерировать рабочий код JS?
2 ответа
Поскольку класс не может быть "экспортирован" в паскале, как вы можете это сделать с помощью javascript и requirejs / nodejs, нам нужно использовать трюк с внешним классом: мы можем установить некоторый код для имени внешнего класса. Во-вторых, нам нужно предоставить объект "options" (более подробный, но необходимый для безопасности типов).
JParserOptions = class
onopentag : TOnTag;
ontext : TOnText;
onclosetag: TOnTag
end;
JParser = class external '(htmlparser2()).Parser' (NodeJS.events.JNodeEventEmitter)
constructor Create(options: JParserOptions);
procedure write(s: string);
procedure &end;
end;
Мы можем использовать это следующим образом:
var options = JParserOptions.Create;
options.onopentag := procedure (Name: string; Attribs: Variant)
begin
console_.log([Name]);
console_.log([Attribs]);
end;
var parser := new JParser(options);
Кстати, я нашел лучшее решение: использовать ссылку на класс (JParserClass = класс JParser)
JParser = class external(NodeJS.events.JNodeEventEmitter)
constructor Create(onopentag: TOnTag; ontext: TOnText; onclosetag: TOnTag);
procedure write(s: string);
procedure &end;
end;
JParserClass = class of JParser;
Jhtmlparser_Exports = class external
public
Parser: JParserClass;
end;
Затем вы можете создать класс следующим образом:
var parser := new (htmlparser2.Parser)(
Или вот так:
var parserclass = htmlparser2.Parser;
var parser := new parserclass(
Или же:
var parserclass = htmlparser2.Parser;
var parser := parserclass.Create(