abner / flutter_js

A Javascript engine to use with flutter. It uses quickjs on Android and JavascriptCore on IOS
MIT License
473 stars 119 forks source link

Can't find variable at Global code #92

Open altrdev opened 2 years ago

altrdev commented 2 years ago

Hi, I haven't find an alternative in Flutter for make a XSLT transformation. So I tried to follow a Js way. In that case I build a desktop app (Mac) and the code is:

JsEvalResult jsResult = flutterJs.evaluate("""
              var xsltProcessor, resultDocument;

              var xml = '<?xml version="1.0" encoding="UTF-8"?><catalog><cd><title>Empire Burlesque</title></cd></catalog>';
              var xsl = '<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/">    <xsl:for-each select="catalog/cd">      <xsl:value-of select="title" />    </xsl:for-each></xsl:template></xsl:stylesheet>';

              var parser = new DOMParser();
              var xsl_doc = parser.parseFromString(xsl, "application/xml");
              var xml_doc = parser.parseFromString(xml, "application/xml");

              xsltProcessor = new XSLTProcessor();
              xsltProcessor.importStylesheet(xsl_doc);
              xsltProcessor.transformToDocument(xml_doc);
            """);

The error is the follow: Can't find variable: DOMParser at global code@ XSLTProcessor have the same problem

Any ideas to solve?

y-alkhateeb commented 2 years ago

try this

class ExpressionService{

  late JavascriptRuntime _flutterJs;

  /// constructor
  ExpressionService(){
    _init();
  }

  _init(){

    try{
      /// initialize javascript engine
      _flutterJs = getJavascriptRuntime();
    }
    catch(e,s){
      print("error when initialize javascript engine: $e");
      print(s);
    }
    /// initialize javascript map to set value into it
    _flutterJs.evaluate("""const value = {};""");

  }

  /// put value into javascript map
  setValueMapper(Map<String, dynamic> valueMap){
    valueMap.forEach((key, value){;
      _flutterJs.evaluate("""Object.assign(value,{$key: '$value'});""");
    });

  }

  String calculateExpression(String expression){
    try {
      JsEvalResult jsResult =  _flutterJs.evaluate(expression);
      return jsResult.stringResult;
    } on PlatformException catch (e) {
      print("error: $e");
      return "";
    }
  }

  dispose(){
    _flutterJs.dispose();
  }

}

for test

test('test set value to javascript object and calculate expression', () async{
 WidgetsFlutterBinding.ensureInitialized();
  late ExpressionService expressionService = new ExpressionService();
      late DateTime _startTime;
      late DateTime _endTime;
      print('----------Start----------');
      _startTime = DateTime.now();
      expressionService.setValueMapper({"first_name": "Yousef"});
      expressionService.setValueMapper({"last_name": "Alkhateeb"});
      String expected = expressionService.calculateExpression("value.first_name + value.last_name");
      expressionService.dispose();
      _endTime = DateTime.now();
      int duration = _endTime.difference(_startTime).inMilliseconds;
      print('----------End: $duration millisecond----------');
      expectAsync0((){
        expect(expected, "YousefAlkhateeb");
      });
    });