SmartMobileStudio で htmlparser2 モジュール (経由でインストール) を使用しようとしnpm install htmlparser2
ました。モジュール自体は直接の JavaScript でうまく動作します ( htmlparser2 の Homepageからわずかに変更されたサンプルを使用):
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 コードを生成するには何を書く必要がありますか?