3

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 コードを生成するには何を書く必要がありますか?

4

2 に答える 2

2

ところで、私はより良い解決策を見つけました: クラス参照を使用します (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(
于 2014-01-07T12:12:52.057 に答える