migrate to d4rt package

This commit is contained in:
Moustapha Kodjo Amadou 2025-05-09 17:47:27 +01:00
parent b54aa3e2df
commit c558c08376
22 changed files with 1966 additions and 7327 deletions

View file

@ -1,470 +1,58 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:d4rt/d4rt.dart';
import 'package:html/dom.dart';
import 'package:mangayomi/eval/dart/bridge/element.dart';
import 'package:mangayomi/eval/model/document.dart';
import 'package:mangayomi/eval/model/element.dart';
class $MDocument implements MDocument, $Instance {
$MDocument.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MDocument'),
);
static const $declaration = BridgeClassDef(
BridgeClassType($type),
class MDocumentBridge {
final documentBridgedClass = BridgedClassDefinition(
nativeType: MDocument,
name: 'MDocument',
constructors: {
'': BridgeConstructorDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation($type),
params: [
BridgeParameter(
'document',
BridgeTypeAnnotation($Element.$type, nullable: true),
false,
),
],
),
),
'': (visitor, positionalArgs, namedArgs) {
return MDocument(positionalArgs[0] as Document);
},
},
fields: {'document': BridgeFieldDef(BridgeTypeAnnotation($Element.$type))},
getters: {
'body': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation($MElement.$type, nullable: true),
),
),
'documentElement': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation($MElement.$type, nullable: true),
),
),
'head': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation($MElement.$type, nullable: true),
),
),
'parent': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation($MElement.$type, nullable: true),
),
),
'outerHtml': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
),
),
'text': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
),
),
'children': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [$MElement.$type]),
nullable: true,
),
),
),
'body': (visitor, target) => (target as MDocument).body,
'documentElement':
(visitor, target) => (target as MDocument).documentElement,
'head': (visitor, target) => (target as MDocument).head,
'parent': (visitor, target) => (target as MDocument).parent,
'outerHtml': (visitor, target) => (target as MDocument).outerHtml,
'text': (visitor, target) => (target as MDocument).text,
'children': (visitor, target) => (target as MDocument).children,
},
methods: {
'select': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [$MElement.$type]),
nullable: true,
),
params: [
BridgeParameter(
'selector',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'selectFirst': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation($MElement.$type, nullable: true),
params: [
BridgeParameter(
'selector',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'getElementsByClassName': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [$type]),
nullable: true,
),
params: [
BridgeParameter(
'classNames',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'getElementsByTagName': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [$type]),
nullable: true,
),
params: [
BridgeParameter(
'localNames',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'getElementById': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation($MElement.$type, nullable: true),
params: [
BridgeParameter(
'id',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'xpath': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [BridgeTypeRef(CoreTypes.string)]),
),
params: [
BridgeParameter(
'xpath',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'xpathFirst': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
params: [
BridgeParameter(
'xpath',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'attr': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
params: [
BridgeParameter(
'attr',
BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
false,
),
],
),
),
'hasAttr': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)),
params: [
BridgeParameter(
'attr',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'select':
(visitor, target, positionalArgs, namedArgs) =>
(target as MDocument).select(positionalArgs[0] as String),
'selectFirst':
(visitor, target, positionalArgs, namedArgs) =>
(target as MDocument).selectFirst(positionalArgs[0] as String),
'getElementsByClassName':
(visitor, target, positionalArgs, namedArgs) => (target as MDocument)
.getElementsByClassName(positionalArgs[0] as String),
'getElementsByTagName':
(visitor, target, positionalArgs, namedArgs) => (target as MDocument)
.getElementsByTagName(positionalArgs[0] as String),
'getElementById':
(visitor, target, positionalArgs, namedArgs) =>
(target as MDocument).getElementById(positionalArgs[0] as String),
'attr':
(visitor, target, positionalArgs, namedArgs) =>
(target as MDocument).attr(positionalArgs[0] as String),
'hasAttr':
(visitor, target, positionalArgs, namedArgs) =>
(target as MDocument).hasAttr(positionalArgs[0] as String),
'xpath':
(visitor, target, positionalArgs, namedArgs) =>
(target as MDocument).xpath(positionalArgs[0] as String),
'xpathFirst':
(visitor, target, positionalArgs, namedArgs) =>
(target as MDocument).xpathFirst(positionalArgs[0] as String),
},
wrap: true,
);
@override
get $reified => $value;
@override
final MDocument $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'body':
final res = $value.body;
return res == null ? const $null() : $MElement.wrap(res);
case 'documentElement':
final res = $value.documentElement;
return res == null ? const $null() : $MElement.wrap(res);
case 'head':
final res = $value.head;
return res == null ? const $null() : $MElement.wrap(res);
case 'parent':
final res = $value.parent;
return res == null ? const $null() : $MElement.wrap(res);
case 'outerHtml':
final res = $value.outerHtml;
return res == null ? const $null() : $String(res);
case 'text':
final res = $value.text;
return res == null ? const $null() : $String(res);
case 'children':
final res = $value.children;
return res == null
? const $null()
: $List.wrap(res.map((e) => $MElement.wrap(e)).toList());
case 'select':
return __select;
case 'selectFirst':
return __selectFirst;
case 'getElementsByClassName':
return __getElementsByClassName;
case 'getElementsByTagName':
return __getElementsByTagName;
case 'getElementById':
return __getElementById;
case 'xpath':
return __xpath;
case 'xpathFirst':
return __xpathFirst;
case 'attr':
return __attr;
case 'hasAttr':
return __hasAttr;
default:
return _superclass.$getProperty(runtime, identifier);
}
void registerBridgedClasses(D4rt interpreter) {
interpreter.registerBridgedClass(documentBridgedClass);
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {}
static const $Function __select = $Function(_select);
static $Value? _select(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MDocument).select(args[0]?.$value);
return res == null
? const $null()
: $List.wrap(res.map((e) => $MElement.wrap(e)).toList());
}
static const $Function __selectFirst = $Function(_selectFirst);
static $Value? _selectFirst(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MDocument).selectFirst(args[0]?.$value);
return res == null ? const $null() : $MElement.wrap(res);
}
static $Value? $new(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
return $MDocument.wrap(MDocument(args[0]?.$value));
}
static const $Function __getElementsByClassName = $Function(
_getElementsByClassName,
);
static $Value? _getElementsByClassName(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MDocument).getElementsByClassName(
args[0]?.$value,
);
return res == null
? const $null()
: $List.wrap(res.map((e) => $MElement.wrap(e)).toList());
}
static const $Function __getElementsByTagName = $Function(
_getElementsByTagName,
);
static $Value? _getElementsByTagName(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MDocument).getElementsByTagName(
args[0]?.$value,
);
return res == null
? const $null()
: $List.wrap(res.map((e) => $MElement.wrap(e)).toList());
}
static const $Function __getElementById = $Function(_getElementById);
static $Value? _getElementById(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MDocument).getElementById(args[0]?.$value);
return res == null ? const $null() : $MElement.wrap(res);
}
static const $Function __xpath = $Function(_xpath);
static $Value? _xpath(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MDocument).xpath(args[0]?.$value);
return $List.wrap(res.map((e) => $String(e)).toList());
}
static const $Function __xpathFirst = $Function(_xpathFirst);
static $Value? _xpathFirst(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MDocument).xpathFirst(args[0]?.$value);
return res == null ? const $null() : $String(res);
}
static const $Function __attr = $Function(_attr);
static $Value? _attr(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MDocument).attr(args[0]?.$value ?? "");
return res == null ? const $null() : $String(res);
}
static const $Function __hasAttr = $Function(_hasAttr);
static $Value? _hasAttr(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MDocument).attr(args[0]?.$value ?? "");
return res == null ? const $null() : $String(res);
}
@override
List<MElement>? select(String selector) => $value.select(selector);
@override
MElement? selectFirst(String selector) => $value.selectFirst(selector);
@override
List<String> xpath(String xpath) => $value.xpath(xpath);
@override
String? xpathFirst(String xpath) => $value.xpathFirst(xpath);
@override
List<MElement>? getElementsByClassName(String classNames) =>
$value.getElementsByClassName(classNames);
@override
List<MElement>? getElementsByTagName(String localNames) =>
$value.getElementsByTagName(localNames);
@override
String? attr(String attr) => $value.attr(attr);
@override
bool hasAttr(String attr) => $value.hasAttr(attr);
@override
MElement? getElementById(String id) => $value.getElementById(id);
@override
MElement? get body => $value.body;
@override
List<MElement>? get children => $value.children;
@override
MElement? get documentElement => $value.documentElement;
@override
MElement? get head => $value.head;
@override
String? get outerHtml => $value.outerHtml;
@override
MElement? get parent => $value.parent;
@override
String? get text => $value.text;
}
class $Document implements $Instance {
$Document.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'Document'),
);
static const $declaration = BridgeClassDef(
BridgeClassType($type),
constructors: {
'': BridgeConstructorDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type, nullable: true)),
),
},
wrap: true,
);
@override
get $reified => $value;
@override
final Document $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
return _superclass.$getProperty(runtime, identifier);
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {}
}

View file

@ -1,564 +1,66 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:d4rt/d4rt.dart';
import 'package:html/dom.dart';
import 'package:mangayomi/eval/model/element.dart';
class $MElement implements MElement, $Instance {
$MElement.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MElement'),
);
static const $declaration = BridgeClassDef(
BridgeClassType($type),
class MElementBridge {
final elementBridgedClass = BridgedClassDefinition(
nativeType: MElement,
name: 'MElement',
constructors: {
'': BridgeConstructorDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation($type),
params: [
BridgeParameter(
'element',
BridgeTypeAnnotation($Element.$type, nullable: true),
false,
),
],
),
),
'': (visitor, positionalArgs, namedArgs) {
return MElement(positionalArgs[0] as Element);
},
},
fields: {'element': BridgeFieldDef(BridgeTypeAnnotation($Element.$type))},
getters: {
'outerHtml': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
),
),
'innerHtml': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
),
),
'text': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
),
),
'className': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
),
),
'localName': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
),
),
'namespaceUri': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
),
),
'getSrc': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
),
),
'getImg': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
),
),
'getHref': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
),
),
'getDataSrc': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
),
),
'children': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [$type]),
nullable: true,
),
),
),
'parent': BridgeMethodDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type, nullable: true)),
),
'nextElementSibling': BridgeMethodDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type, nullable: true)),
),
'previousElementSibling': BridgeMethodDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type, nullable: true)),
),
'outerHtml': (visitor, target) => (target as MElement).outerHtml,
'innerHtml': (visitor, target) => (target as MElement).innerHtml,
'text': (visitor, target) => (target as MElement).text,
'className': (visitor, target) => (target as MElement).className,
'localName': (visitor, target) => (target as MElement).localName,
'namespaceUri': (visitor, target) => (target as MElement).namespaceUri,
'getSrc': (visitor, target) => (target as MElement).getSrc,
'getImg': (visitor, target) => (target as MElement).getImg,
'getHref': (visitor, target) => (target as MElement).getHref,
'getDataSrc': (visitor, target) => (target as MElement).getDataSrc,
'children': (visitor, target) => (target as MElement).children,
'parent': (visitor, target) => (target as MElement).parent,
'nextElementSibling':
(visitor, target) => (target as MElement).nextElementSibling,
'previousElementSibling':
(visitor, target) => (target as MElement).previousElementSibling,
},
methods: {
'attr': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
params: [
BridgeParameter(
'attr',
BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
false,
),
],
),
),
'text': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
),
),
'select': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [$type]),
nullable: true,
),
params: [
BridgeParameter(
'selector',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'selectFirst': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation($type, nullable: true),
params: [
BridgeParameter(
'selector',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'getElementsByClassName': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [$type]),
nullable: true,
),
params: [
BridgeParameter(
'classNames',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'getElementsByTagName': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [$type]),
nullable: true,
),
params: [
BridgeParameter(
'localNames',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'xpath': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [BridgeTypeRef(CoreTypes.string)]),
nullable: true,
),
params: [
BridgeParameter(
'xpath',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'xpathFirst': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.string),
nullable: true,
),
params: [
BridgeParameter(
'xpath',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'hasAttr': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)),
params: [
BridgeParameter(
'attr',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
],
),
),
'attr':
(visitor, target, positionalArgs, namedArgs) =>
(target as MElement).attr(positionalArgs[0] as String),
'text':
(visitor, target, positionalArgs, namedArgs) =>
(target as MElement).text,
'select':
(visitor, target, positionalArgs, namedArgs) =>
(target as MElement).select(positionalArgs[0] as String),
'selectFirst':
(visitor, target, positionalArgs, namedArgs) =>
(target as MElement).selectFirst(positionalArgs[0] as String),
'getElementsByClassName':
(visitor, target, positionalArgs, namedArgs) => (target as MElement)
.getElementsByClassName(positionalArgs[0] as String),
'getElementsByTagName':
(visitor, target, positionalArgs, namedArgs) => (target as MElement)
.getElementsByTagName(positionalArgs[0] as String),
'xpath':
(visitor, target, positionalArgs, namedArgs) =>
(target as MElement).xpath(positionalArgs[0] as String),
'xpathFirst':
(visitor, target, positionalArgs, namedArgs) =>
(target as MElement).xpathFirst(positionalArgs[0] as String),
'hasAttr':
(visitor, target, positionalArgs, namedArgs) =>
(target as MElement).hasAttr(positionalArgs[0] as String),
},
wrap: true,
);
@override
get $reified => $value;
@override
final MElement $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'outerHtml':
final res = $value.outerHtml;
return res == null ? const $null() : $String(res);
case 'innerHtml':
final res = $value.innerHtml;
return res == null ? const $null() : $String(res);
case 'text':
final res = $value.text;
return res == null
? const $null()
: $String(res.trim().trimLeft().trimRight());
case 'className':
final res = $value.className;
return res == null
? const $null()
: $String(res.trim().trimLeft().trimRight());
case 'localName':
final res = $value.localName;
return res == null
? const $null()
: $String(res.trim().trimLeft().trimRight());
case 'namespaceUri':
final res = $value.namespaceUri;
return res == null
? const $null()
: $String(res.trim().trimLeft().trimRight());
case 'getSrc':
final res = $value.getSrc;
return res == null
? const $null()
: $String(res.trim().trimLeft().trimRight());
case 'getImg':
final res = $value.getImg;
return res == null
? const $null()
: $String(res.trim().trimLeft().trimRight());
case 'getHref':
final res = $value.getHref;
return res == null
? const $null()
: $String(res.trim().trimLeft().trimRight());
case 'getDataSrc':
final res = $value.getDataSrc;
return res == null
? const $null()
: $String(res.trim().trimLeft().trimRight());
case 'parent':
final res = $value.parent;
return res == null ? const $null() : $MElement.wrap(res);
case 'nextElementSibling':
final res = $value.nextElementSibling;
return res == null ? const $null() : $MElement.wrap(res);
case 'previousElementSibling':
final res = $value.previousElementSibling;
return res == null ? const $null() : $MElement.wrap(res);
case 'attr':
return __attr;
case 'select':
return __select;
case 'selectFirst':
return __selectFirst;
case 'getElementsByClassName':
return __getElementsByClassName;
case 'getElementsByTagName':
return __getElementsByTagName;
case 'xpath':
return __xpath;
case 'xpathFirst':
return __xpathFirst;
case 'hasAttr':
return __hasAttr;
default:
return _superclass.$getProperty(runtime, identifier);
}
void registerBridgedClasses(D4rt interpreter) {
interpreter.registerBridgedClass(elementBridgedClass);
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {}
static $Value? $new(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
return $MElement.wrap(MElement(args[0]?.$value));
}
static const $Function __attr = $Function(_attr);
static $Value? _attr(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MElement).attr(args[0]?.$value ?? "");
return res == null ? const $null() : $String(res);
}
static const $Function __select = $Function(_select);
static $Value? _select(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MElement).select(args[0]?.$value);
return res == null
? const $null()
: $List.wrap(res.map((e) => $MElement.wrap(e)).toList());
}
static const $Function __selectFirst = $Function(_selectFirst);
static $Value? _selectFirst(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MElement).selectFirst(args[0]?.$value);
return res == null ? const $null() : $MElement.wrap(res);
}
static const $Function __getElementsByClassName = $Function(
_getElementsByClassName,
);
static $Value? _getElementsByClassName(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MElement).getElementsByClassName(
args[0]?.$value,
);
return res == null
? const $null()
: $List.wrap(res.map((e) => $MElement.wrap(e)).toList());
}
static const $Function __getElementsByTagName = $Function(
_getElementsByTagName,
);
static $Value? _getElementsByTagName(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MElement).getElementsByTagName(
args[0]?.$value,
);
return res == null
? const $null()
: $List.wrap(res.map((e) => $MElement.wrap(e)).toList());
}
static const $Function __xpath = $Function(_xpath);
static $Value? _xpath(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MElement).xpath(args[0]?.$value);
return res == null
? const $null()
: $List.wrap(res.map((e) => $String(e)).toList());
}
static const $Function __xpathFirst = $Function(_xpathFirst);
static $Value? _xpathFirst(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MElement).xpathFirst(args[0]?.$value);
return res == null ? const $null() : $String(res);
}
static const $Function __hasAttr = $Function(_hasAttr);
static $Value? _hasAttr(
final Runtime runtime,
final $Value? target,
final List<$Value?> args,
) {
final res = (target!.$value as MElement).attr(args[0]?.$value ?? "");
return res == null ? const $null() : $String(res);
}
@override
List<String>? xpath(String xpath) => $value.xpath(xpath);
@override
String? xpathFirst(String xpath) => $value.xpathFirst(xpath);
@override
String? attr(String attr) => $value.attr(attr);
@override
List<MElement>? select(String selector) => $value.select(selector);
@override
MElement? selectFirst(String selector) => $value.selectFirst(selector);
@override
List<MElement>? get children => $value.children;
@override
List<MElement>? getElementsByClassName(String classNames) =>
$value.getElementsByClassName(classNames);
@override
List<MElement>? getElementsByTagName(String localNames) =>
$value.getElementsByTagName(localNames);
@override
bool hasAttr(String attr) => $value.hasAttr(attr);
@override
String? get className => $value.className;
@override
String? get getDataSrc => $value.getDataSrc;
@override
String? get getHref => $value.getHref;
@override
String? get getImg => $value.getImg;
@override
String? get getSrc => $value.getSrc;
@override
String? get innerHtml => $value.innerHtml;
@override
String? get localName => $value.localName;
@override
String? get namespaceUri => $value.namespaceUri;
@override
MElement? get nextElementSibling => $value.nextElementSibling;
@override
String? get outerHtml => $value.outerHtml;
@override
MElement? get parent => $value.parent;
@override
MElement? get previousElementSibling => $value.previousElementSibling;
@override
String? get text => $value.text;
}
class $Element implements $Instance {
$Element.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'Element'),
);
static const $declaration = BridgeClassDef(
BridgeClassType($type),
constructors: {
'': BridgeConstructorDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type, nullable: true)),
),
},
wrap: true,
);
@override
get $reified => $value;
@override
final Element $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
return _superclass.$getProperty(runtime, identifier);
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,147 +1,42 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/eval/model/m_chapter.dart';
class $MChapter implements MChapter, $Instance {
$MChapter.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MChapter'),
);
static const $declaration = BridgeClassDef(
BridgeClassType($type),
class MChapterBridge {
final mChapterBridgedClass = BridgedClassDefinition(
nativeType: MChapter,
name: 'MChapter',
constructors: {
'': BridgeConstructorDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation($type),
params: [],
namedParams: [
BridgeParameter(
'name',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
BridgeParameter(
'url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
BridgeParameter(
'dateUpload',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
BridgeParameter(
'scanlator',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
true,
),
],
),
),
'': (visitor, positionalArgs, namedArgs) {
return MChapter(
name: namedArgs.get<String?>('name'),
url: namedArgs.get<String?>('url'),
dateUpload: namedArgs.get<String?>('dateUpload'),
scanlator: namedArgs.get<String?>('scanlator'),
);
},
},
// Specify class fields
fields: {
'name': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'url': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'dateUpload': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'scanlator': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
getters: {
'name': (visitor, target) => (target as MChapter).name,
'url': (visitor, target) => (target as MChapter).url,
'dateUpload': (visitor, target) => (target as MChapter).dateUpload,
'scanlator': (visitor, target) => (target as MChapter).scanlator,
},
setters: {
'name':
(visitor, target, value) =>
(target as MChapter).name = value as String?,
'url':
(visitor, target, value) =>
(target as MChapter).url = value as String?,
'dateUpload':
(visitor, target, value) =>
(target as MChapter).dateUpload = value as String?,
'scanlator':
(visitor, target, value) =>
(target as MChapter).scanlator = value as String?,
},
wrap: true,
);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $MChapter.wrap(
MChapter(
name: args[0]?.$reified,
url: args[1]?.$reified,
dateUpload: args[2]?.$reified,
scanlator: args[3]?.$reified,
),
);
void registerBridgedClasses(D4rt interpreter) {
interpreter.registerBridgedClass(mChapterBridgedClass);
}
@override
final MChapter $value;
@override
MChapter get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'name':
return $String($value.name!);
case 'url':
return $String($value.url!);
case 'dateUpload':
return $String($value.dateUpload!);
case 'scanlator':
return $String($value.scanlator!);
default:
return _superclass.$getProperty(runtime, identifier);
}
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
switch (identifier) {
case 'name':
$value.name = value.$reified;
case 'url':
$value.url = value.$reified;
case 'dateUpload':
$value.dateUpload = value.$reified;
case 'scanlator':
$value.scanlator = value.$reified;
default:
_superclass.$setProperty(runtime, identifier, value);
}
}
@override
String? get name => $value.name;
@override
String? get url => $value.url;
@override
String? get dateUpload => $value.dateUpload;
@override
String? get scanlator => $value.scanlator;
@override
set name(String? name) {}
@override
set url(String? url) {}
@override
set dateUpload(String? dateUpload) {}
@override
set scanlator(String? scanlator) {}
@override
Map<String, dynamic> toJson() => {
'name': name,
'url': url,
'dateUpload': dateUpload,
'scanlator': scanlator,
};
}

View file

@ -1,222 +1,67 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/dart/bridge/m_chapter.dart';
import 'package:mangayomi/eval/dart/bridge/m_status.dart';
import 'package:mangayomi/eval/model/m_chapter.dart';
import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart';
class $MManga implements MManga, $Instance {
$MManga.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MManga'),
);
static const $declaration = BridgeClassDef(
BridgeClassType($type),
class MMangaBridge {
final mMangaBridgedClass = BridgedClassDefinition(
nativeType: MManga,
name: 'MManga',
constructors: {
'': BridgeConstructorDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type), params: []),
),
},
// Specify class fields
fields: {
'author': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'artist': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'status': BridgeFieldDef(BridgeTypeAnnotation($MStatus.$type)),
'genre': BridgeFieldDef(
BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [BridgeTypeRef(CoreTypes.string)]),
),
),
'imageUrl': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'name': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'link': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'description': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'chapters': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.list, [$MChapter.$type])),
),
},
wrap: true,
);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $MManga.wrap(MManga());
}
@override
final MManga $value;
@override
MManga get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'author':
return $String($value.author!);
case 'artist':
return $String($value.artist!);
case 'status':
return $MStatus.wrap($value.status!);
case 'genre':
return $List.wrap($value.genre!);
case 'imageUrl':
return $String($value.imageUrl!);
case 'name':
return $String($value.name!);
case 'link':
return $String($value.link!);
case 'description':
return $String($value.description!);
case 'chapters':
return $List.wrap(
$value.chapters!.map((e) => $MChapter.wrap(e)).toList(),
'': (visitor, positionalArgs, namedArgs) {
return MManga(
artist: namedArgs.get<String?>('artist'),
author: namedArgs.get<String?>('author'),
description: namedArgs.get<String?>('description'),
genre: namedArgs.get<List?>('genre')?.cast(),
status: namedArgs.get<Status?>('status'),
imageUrl: namedArgs.get<String?>('imageUrl'),
link: namedArgs.get<String?>('link'),
chapters: namedArgs.get<List?>('chapters')?.cast(),
name: namedArgs.get<String?>('name'),
);
default:
return _superclass.$getProperty(runtime, identifier);
}
},
},
getters: {
'name': (visitor, target) => (target as MManga).name,
'artist': (visitor, target) => (target as MManga).artist,
'author': (visitor, target) => (target as MManga).author,
'description': (visitor, target) => (target as MManga).description,
'genre': (visitor, target) => (target as MManga).genre,
'status': (visitor, target) => (target as MManga).status,
'imageUrl': (visitor, target) => (target as MManga).imageUrl,
'link': (visitor, target) => (target as MManga).link,
'chapters': (visitor, target) => (target as MManga).chapters,
},
setters: {
'name':
(visitor, target, value) =>
(target as MManga).name = value as String?,
'artist':
(visitor, target, value) =>
(target as MManga).artist = value as String?,
'author':
(visitor, target, value) =>
(target as MManga).author = value as String?,
'description':
(visitor, target, value) =>
(target as MManga).description = value as String?,
'genre':
(visitor, target, value) =>
(target as MManga).genre = (value as List?)?.cast(),
'status':
(visitor, target, value) =>
(target as MManga).status = value as Status?,
'imageUrl':
(visitor, target, value) =>
(target as MManga).imageUrl = value as String?,
'link':
(visitor, target, value) => (target as MManga).link = value as String,
'chapters':
(visitor, target, value) =>
(target as MManga).chapters = (value as List?)?.cast(),
},
);
void registerBridgedClasses(D4rt interpreter) {
interpreter.registerBridgedClass(mMangaBridgedClass);
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
switch (identifier) {
case 'author':
$value.author = value.$reified;
case 'artist':
$value.artist = value.$reified;
case 'status':
$value.status = value.$reified;
case 'genre':
$value.genre =
(value.$reified as List).map((e) => e.toString()).toList();
case 'imageUrl':
$value.imageUrl = value.$reified;
case 'name':
$value.name = value.$reified;
case 'link':
$value.link = value.$reified;
case 'description':
$value.description = value.$reified;
case 'chapters':
$value.chapters =
(value.$reified as List)
.map(
(e) => MChapter(
dateUpload: e.dateUpload,
url: e.url,
name: e.name,
scanlator: e.scanlator,
),
)
.toList();
default:
_superclass.$setProperty(runtime, identifier, value);
}
}
@override
String? get author => $value.author;
@override
String? get artist => $value.artist;
@override
String? get description => $value.description;
@override
String? get imageUrl => $value.imageUrl;
@override
String? get name => $value.name;
@override
String? get link => $value.link;
@override
Status? get status => $value.status;
@override
List<MChapter>? get chapters => $value.chapters;
@override
List<String>? get genre => $value.genre;
@override
set author(String? author) {
// implement author
}
@override
set artist(String? artist) {
// implement artist
}
@override
set description(String? description) {
// implement description
}
@override
set imageUrl(String? imageUrl) {
// implement imageUrl
}
@override
set link(String? link) {
// implement link
}
@override
set name(String? name) {
// implement name
}
@override
set genre(List<String>? genre) {
// implement genre
}
@override
set status(Status? status) {
// implement status
}
@override
set chapters(List<MChapter>? chapters) {}
@override
Map<String, dynamic> toJson() => {
'name': name,
'link': link,
'imageUrl': imageUrl,
'description': description,
'author': author,
'artist': artist,
'status': status.toString().substringAfter("."),
'genre': genre,
'chapters': chapters?.map((e) => e.toJson()).toList(),
};
}

View file

@ -1,107 +1,33 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/dart/bridge/m_manga.dart';
import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
class $MPages implements MPages, $Instance {
$MPages.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MPages'),
);
static const $declaration = BridgeClassDef(
BridgeClassType($type),
class MPagesBridge {
final mPageBridgedClass = BridgedClassDefinition(
nativeType: MPages,
name: 'MPages',
constructors: {
'': BridgeConstructorDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation($type),
params: [
BridgeParameter(
'list',
BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [$MManga.$type]),
),
false,
),
BridgeParameter(
'hasNextPage',
BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.bool),
nullable: true,
),
true,
),
],
),
),
'': (visitor, positionalArgs, namedArgs) {
return MPages(
list: (positionalArgs[0] as List).map((e) => e as MManga).toList(),
hasNextPage: positionalArgs[1] as bool,
);
},
},
fields: {
'list': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.list, [$MManga.$type])),
),
'hasNextPage': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool), nullable: true),
),
getters: {
'list': (visitor, target) => (target as MPages).list,
'hasNextPage': (visitor, target) => (target as MPages).hasNextPage,
},
setters: {
'list':
(visitor, target, value) =>
(target as MPages).list = (value as List).cast<MManga>(),
'hasNextPage':
(visitor, target, value) =>
(target as MPages).hasNextPage = value as bool,
},
wrap: true,
);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
List<$Value> list = args[0]!.$value;
return $MPages.wrap(
MPages(
list: list.map((e) => e as MManga).toList(),
hasNextPage: args[1]?.$value ?? false,
),
);
void registerBridgedClasses(D4rt interpreter) {
interpreter.registerBridgedClass(mPageBridgedClass);
}
@override
final MPages $value;
@override
MPages get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'list':
return $List.wrap($value.list);
case 'hasNextPage':
return $bool($value.hasNextPage);
default:
return _superclass.$getProperty(runtime, identifier);
}
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
return _superclass.$setProperty(runtime, identifier, value);
}
@override
List<MManga> get list => $value.list;
@override
bool get hasNextPage => $value.hasNextPage;
@override
set hasNextPage(bool hasNextPage) {}
@override
set list(List<MManga> list) {}
@override
Map<String, dynamic> toJson() => {
'list': list.map((v) => v.toJson()).toList(),
'hasNextPage': hasNextPage,
};
}

File diff suppressed because it is too large Load diff

View file

@ -1,211 +1,44 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/eval/model/m_source.dart';
class $MSource implements MSource, $Instance {
$MSource.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MSource'),
);
static const $declaration = BridgeClassDef(
BridgeClassType($type),
class MSourceBridge {
final mSourceBridgedClass = BridgedClassDefinition(
nativeType: MSource,
name: 'MSource',
constructors: {
'': BridgeConstructorDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type), params: []),
),
'': (visitor, positionalArgs, namedArgs) {
return MSource(
id: namedArgs.get<int?>('id'),
name: namedArgs.get<String?>('name'),
baseUrl: namedArgs.get<String?>('baseUrl'),
lang: namedArgs.get<String?>('lang'),
isFullData: namedArgs.get<bool?>('isFullData'),
hasCloudflare: namedArgs.get<bool?>('hasCloudflare'),
dateFormat: namedArgs.get<String?>('dateFormat'),
dateFormatLocale: namedArgs.get<String?>('dateFormatLocale'),
apiUrl: namedArgs.get<String?>('apiUrl'),
additionalParams: namedArgs.get<String?>('additionalParams'),
notes: namedArgs.get<String?>('notes'),
);
},
},
fields: {
'id': BridgeFieldDef(BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int))),
'name': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'baseUrl': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'lang': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'isFullData': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)),
),
'hasCloudflare': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)),
),
'dateFormat': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'dateFormatLocale': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'apiUrl': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'additionalParams': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'notes': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
getters: {
'id': (visitor, target) => (target as MSource).id,
'name': (visitor, target) => (target as MSource).name,
'baseUrl': (visitor, target) => (target as MSource).baseUrl,
'lang': (visitor, target) => (target as MSource).lang,
'isFullData': (visitor, target) => (target as MSource).isFullData,
'hasCloudflare': (visitor, target) => (target as MSource).hasCloudflare,
'dateFormat': (visitor, target) => (target as MSource).dateFormat,
'dateFormatLocale':
(visitor, target) => (target as MSource).dateFormatLocale,
'apiUrl': (visitor, target) => (target as MSource).apiUrl,
'additionalParams':
(visitor, target) => (target as MSource).additionalParams,
'notes': (visitor, target) => (target as MSource).notes,
},
wrap: true,
);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $MSource.wrap(MSource());
void registerBridgedClasses(D4rt interpreter) {
interpreter.registerBridgedClass(mSourceBridgedClass);
}
@override
final MSource $value;
@override
MSource get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'id':
return $int($value.id!);
case 'name':
return $String($value.name!);
case 'baseUrl':
return $String($value.baseUrl!);
case 'lang':
return $String($value.lang!);
case 'isFullData':
return $bool($value.isFullData!);
case 'hasCloudflare':
return $bool($value.hasCloudflare!);
case 'dateFormat':
return $String($value.dateFormat!);
case 'dateFormatLocale':
return $String($value.dateFormatLocale!);
case 'apiUrl':
return $String($value.apiUrl!);
case 'additionalParams':
return $String($value.additionalParams!);
case 'notes':
return $String($value.notes!);
default:
return _superclass.$getProperty(runtime, identifier);
}
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
switch (identifier) {
case 'id':
$value.id = value.$reified;
case 'name':
$value.name = value.$reified;
case 'baseUrl':
$value.baseUrl = value.$reified;
case 'lang':
$value.lang = value.$reified;
case 'isFullData':
$value.isFullData = value.$reified;
case 'hasCloudflare':
$value.hasCloudflare = value.$reified;
case 'dateFormat':
$value.dateFormat = value.$reified;
case 'dateFormatLocale':
$value.dateFormatLocale = value.$reified;
case 'apiUrl':
$value.apiUrl = value.$reified;
case 'additionalParams':
$value.additionalParams = value.$reified;
case 'notes':
$value.notes = value.$reified;
default:
_superclass.$setProperty(runtime, identifier, value);
}
}
@override
String? get apiUrl => $value.apiUrl;
@override
String? get baseUrl => $value.baseUrl;
@override
String? get dateFormat => $value.dateFormat;
@override
String? get dateFormatLocale => $value.dateFormatLocale;
@override
bool? get hasCloudflare => $value.hasCloudflare;
@override
int? get id => $value.id;
@override
bool? get isFullData => $value.isFullData;
@override
String? get lang => $value.lang;
@override
String? get name => $value.name;
@override
String? get additionalParams => $value.additionalParams;
@override
String? get notes => $value.notes;
@override
set apiUrl(String? apiUrl) {}
@override
set baseUrl(String? baseUrl) {}
@override
set dateFormat(String? dateFormat) {}
@override
set dateFormatLocale(String? dateFormatLocale) {}
@override
set hasCloudflare(bool? hasCloudflare) {}
@override
set id(int? id) {}
@override
set isFullData(bool? isFullData) {}
@override
set lang(String? lang) {}
@override
set name(String? name) {}
@override
set additionalParams(String? additionalParams) {}
@override
set notes(String? notes) {}
@override
Map<String, dynamic> toJson() => {
'apiUrl': apiUrl,
'baseUrl': baseUrl,
'dateFormat': dateFormat,
'dateFormatLocale': dateFormatLocale,
'hasCloudflare': hasCloudflare,
'id': id,
'isFullData': isFullData,
'lang': lang,
'name': name,
'additionalParams': additionalParams,
'notes': notes,
};
}

View file

@ -1,57 +1,12 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/models/manga.dart';
class $MStatus implements $Instance {
static $MStatus $wrap(Runtime runtime, $Value? target, List<$Value?> args) =>
$MStatus.wrap(args[0]!.$value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MStatus'),
class MStatusBridge {
final statusDefinition = BridgedEnumDefinition<Status>(
name: 'MStatus',
values: Status.values,
);
static const $declaration = BridgeEnumDef(
$type,
values: [
'ongoing',
'completed',
'canceled',
'unknown',
'onHiatus',
'publishingFinished',
],
methods: {},
getters: {},
setters: {},
fields: {},
);
static final $values = Status.values.asNameMap().map(
(key, value) => MapEntry(key, $MStatus.wrap(value)),
);
const $MStatus.wrap(this.$value);
@override
final Status $value;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'index':
return $int($value.index);
case 'name':
return $String($value.name);
case 'hashCode':
return $int($value.hashCode);
}
throw UnimplementedError();
void registerBridgedEnum(D4rt interpreter) {
interpreter.registerBridgedEnum(statusDefinition);
}
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
throw UnimplementedError('Cannot set property on an enum');
}
@override
get $reified => $value;
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
}

View file

@ -1,88 +1,31 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/models/video.dart';
class $MTrack implements Track, $Instance {
$MTrack.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MTrack'),
);
static const $declaration = BridgeClassDef(
BridgeClassType($type),
class MTrackBridge {
final mTrackBridgedClass = BridgedClassDefinition(
nativeType: Track,
name: 'MTrack',
constructors: {
'': BridgeConstructorDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type)),
),
'': (visitor, positionalArgs, namedArgs) {
return Track(
file: namedArgs.get<String?>('file'),
label: namedArgs.get<String?>('label'),
);
},
},
// Specify class fields
fields: {
'file': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'label': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
getters: {
'file': (visitor, target) => (target as Track).file,
'label': (visitor, target) => (target as Track).label,
},
setters: {
'file':
(visitor, target, value) => (target as Track).file = value as String?,
'label':
(visitor, target, value) =>
(target as Track).label = value as String?,
},
wrap: true,
);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $MTrack.wrap(Track());
}
@override
final Track $value;
@override
Track get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'file':
return $String($value.file!);
case 'label':
return $String($value.label!);
default:
return _superclass.$getProperty(runtime, identifier);
}
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
switch (identifier) {
case 'file':
$value.file = value.$reified;
case 'label':
$value.label = value.$reified;
default:
_superclass.$setProperty(runtime, identifier, value);
}
}
@override
String? get file => $value.file;
@override
String? get label => $value.label;
@override
set file(String? file) {}
@override
set label(String? label) {}
@override
Map<String, dynamic> toJson() {
throw UnimplementedError();
void registerBridgedClasses(D4rt interpreter) {
interpreter.registerBridgedClass(mTrackBridgedClass);
}
}

View file

@ -1,164 +1,51 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/dart/bridge/m_track.dart';
import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/models/video.dart';
class $MVideo implements Video, $Instance {
$MVideo.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'MVideo'),
);
static const $declaration = BridgeClassDef(
BridgeClassType($type),
class MVideoBridge {
final mVideoBridgedClass = BridgedClassDefinition(
nativeType: Video,
name: 'MVideo',
constructors: {
'': BridgeConstructorDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation($type)),
),
'': (visitor, positionalArgs, namedArgs) {
return Video(
positionalArgs.get<String?>(0) ?? '',
positionalArgs.get<String?>(1) ?? '',
positionalArgs.get<String?>(2) ?? '',
headers: namedArgs.get<Map?>('headers')?.cast(),
subtitles: namedArgs.get<List<Track>?>('subtitles'),
audios: namedArgs.get<List<Track>?>('audios'),
);
},
},
// Specify class fields
fields: {
'url': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'quality': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'originalUrl': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
),
'headers': BridgeFieldDef(
BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.map, [
BridgeTypeRef(CoreTypes.string),
BridgeTypeRef(CoreTypes.string),
]),
nullable: true,
),
),
'subtitles': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.list, [$MTrack.$type])),
),
'audios': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.list, [$MTrack.$type])),
),
getters: {
'url': (visitor, target) => (target as Video).url,
'quality': (visitor, target) => (target as Video).quality,
'originalUrl': (visitor, target) => (target as Video).originalUrl,
'headers': (visitor, target) => (target as Video).headers,
'subtitles': (visitor, target) => (target as Video).subtitles,
'audios': (visitor, target) => (target as Video).audios,
},
setters: {
'url':
(visitor, target, value) => (target as Video).url = value as String,
'quality':
(visitor, target, value) =>
(target as Video).quality = value as String,
'originalUrl':
(visitor, target, value) =>
(target as Video).originalUrl = value as String,
'headers':
(visitor, target, value) =>
(target as Video).headers = (value as Map?)?.cast(),
'subtitles':
(visitor, target, value) =>
(target as Video).subtitles = (value as List?)?.cast(),
'audios':
(visitor, target, value) =>
(target as Video).audios = (value as List?)?.cast(),
},
wrap: true,
);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $MVideo.wrap(Video("", "", ""));
}
@override
final Video $value;
@override
Video get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'url':
return $String($value.url);
case 'quality':
return $String($value.quality);
case 'originalUrl':
return $String($value.originalUrl);
case 'headers':
return $Map.wrap($value.headers ?? {});
case 'subtitles':
return $List.wrap(
$value.subtitles!
.map((e) => $MTrack.wrap(Track(file: e.file, label: e.label)))
.toList(),
);
case 'audios':
return $List.wrap(
$value.audios!
.map((e) => $MTrack.wrap(Track(file: e.file, label: e.label)))
.toList(),
);
default:
return _superclass.$getProperty(runtime, identifier);
}
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
switch (identifier) {
case 'url':
$value.url = value.$reified;
case 'quality':
$value.quality = value.$reified;
case 'originalUrl':
$value.originalUrl = value.$reified;
case 'headers':
$value.headers = (value.$reified as Map).map(
(key, value) => MapEntry(key.toString(), value.toString()),
);
case 'subtitles':
$value.subtitles =
(value.$reified as List)
.map((e) => Track(file: e.file, label: e.label))
.toList();
case 'audios':
$value.audios =
(value.$reified as List)
.map((e) => Track(file: e.file, label: e.label))
.toList();
default:
_superclass.$setProperty(runtime, identifier, value);
}
}
@override
String get url => $value.url;
@override
List<Track>? get subtitles => $value.subtitles;
@override
List<Track>? get audios => $value.audios;
@override
String get quality => $value.quality;
@override
Map<String, String>? get headers => $value.headers;
@override
String get originalUrl => $value.originalUrl;
@override
set url(String? url) {}
@override
set quality(String? quality) {}
@override
set headers(Map? headers) {}
@override
set originalUrl(String? originalUrl) {}
@override
set subtitles(List? subtitles) {}
@override
set audios(List? audios) {}
@override
Map<String, dynamic> toJson() {
throw UnimplementedError();
void registerBridgedClasses(D4rt interpreter) {
interpreter.registerBridgedClass(mVideoBridgedClass);
}
}

View file

@ -0,0 +1,32 @@
import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/eval/dart/bridge/document.dart';
import 'package:mangayomi/eval/dart/bridge/element.dart';
import 'package:mangayomi/eval/dart/bridge/filter.dart';
import 'package:mangayomi/eval/dart/bridge/http.dart';
import 'package:mangayomi/eval/dart/bridge/m_chapter.dart';
import 'package:mangayomi/eval/dart/bridge/m_manga.dart';
import 'package:mangayomi/eval/dart/bridge/m_pages.dart';
import 'package:mangayomi/eval/dart/bridge/m_provider.dart';
import 'package:mangayomi/eval/dart/bridge/m_source.dart';
import 'package:mangayomi/eval/dart/bridge/m_status.dart';
import 'package:mangayomi/eval/dart/bridge/m_track.dart';
import 'package:mangayomi/eval/dart/bridge/m_video.dart';
import 'package:mangayomi/eval/dart/bridge/source_preference.dart';
class RegistrerBridge {
static void registerBridge(D4rt interpreter) {
MDocumentBridge().registerBridgedClasses(interpreter);
MElementBridge().registerBridgedClasses(interpreter);
FilterBridge().registerBridgedClasses(interpreter);
HttpBridge().registerBridgedClasses(interpreter);
MMangaBridge().registerBridgedClasses(interpreter);
MChapterBridge().registerBridgedClasses(interpreter);
MPagesBridge().registerBridgedClasses(interpreter);
MProviderBridged().registerBridgedClasses(interpreter);
MSourceBridge().registerBridgedClasses(interpreter);
MStatusBridge().registerBridgedEnum(interpreter);
MTrackBridge().registerBridgedClasses(interpreter);
MVideoBridge().registerBridgedClasses(interpreter);
SourcePreferenceBridge().registerBridgedClasses(interpreter);
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,15 +0,0 @@
import 'dart:typed_data';
import 'package:dart_eval/dart_eval.dart';
import 'package:mangayomi/eval/dart/plugin.dart';
Uint8List compilerEval(String code) {
late Compiler compiler = Compiler();
final plugin = MEvalPlugin();
compiler.addPlugin(plugin);
final program = compiler.compile({
'mangayomi': {'main.dart': code},
});
final bytecode = program.write();
return bytecode;
}

View file

@ -1,205 +0,0 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:mangayomi/eval/dart/bridge/document.dart';
import 'package:mangayomi/eval/dart/bridge/element.dart';
import 'package:mangayomi/eval/dart/bridge/http.dart';
import 'package:mangayomi/eval/dart/bridge/m_chapter.dart';
import 'package:mangayomi/eval/dart/bridge/filter.dart';
import 'package:mangayomi/eval/dart/bridge/m_pages.dart';
import 'package:mangayomi/eval/dart/bridge/m_status.dart';
import 'package:mangayomi/eval/dart/bridge/m_provider.dart';
import 'package:mangayomi/eval/dart/bridge/m_manga.dart';
import 'package:mangayomi/eval/dart/bridge/m_source.dart';
import 'package:mangayomi/eval/dart/bridge/m_track.dart';
import 'package:mangayomi/eval/dart/bridge/m_video.dart';
import 'package:mangayomi/eval/dart/bridge/source_preference.dart';
class MEvalPlugin extends EvalPlugin {
@override
String get identifier => 'package:mangayomi';
@override
void configureForCompile(BridgeDeclarationRegistry registry) {
registry.defineBridgeClass($MProvider.$declaration);
registry.defineBridgeClass($MPages.$declaration);
registry.defineBridgeClass($MSource.$declaration);
registry.defineBridgeClass($MVideo.$declaration);
registry.defineBridgeClass($MTrack.$declaration);
registry.defineBridgeClass($MChapter.$declaration);
registry.defineBridgeClass($MManga.$declaration);
registry.defineBridgeEnum($MStatus.$declaration);
//Filter
registry.defineBridgeClass($FilterList.$declaration);
registry.defineBridgeClass($SelectFilter.$declaration);
registry.defineBridgeClass($SeparatorFilter.$declaration);
registry.defineBridgeClass($HeaderFilter.$declaration);
registry.defineBridgeClass($TextFilter.$declaration);
registry.defineBridgeClass($SortFilter.$declaration);
registry.defineBridgeClass($TriStateFilter.$declaration);
registry.defineBridgeClass($GroupFilter.$declaration);
registry.defineBridgeClass($CheckBoxFilter.$declaration);
registry.defineBridgeClass($SortState.$declaration);
registry.defineBridgeClass($SelectFilterOption.$declaration);
//SourcePreferences
registry.defineBridgeClass($CheckBoxPreference.$declaration);
registry.defineBridgeClass($SwitchPreferenceCompat.$declaration);
registry.defineBridgeClass($ListPreference.$declaration);
registry.defineBridgeClass($MultiSelectListPreference.$declaration);
registry.defineBridgeClass($CheckBoxPreference.$declaration);
registry.defineBridgeClass($EditTextPreference.$declaration);
//DOM HTML
registry.defineBridgeClass($MElement.$declaration);
registry.defineBridgeClass($Element.$declaration);
registry.defineBridgeClass($MDocument.$declaration);
registry.defineBridgeClass($Document.$declaration);
//HTTP CLIENT
registry.defineBridgeClass($Client.$declaration);
registry.defineBridgeClass($Response.$declaration);
registry.defineBridgeClass($BaseRequest.$declaration);
registry.defineBridgeClass($StreamedResponse.$declaration);
registry.defineBridgeClass($ByteStream.$declaration);
}
@override
void configureForRuntime(Runtime runtime) {
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'MProvider.',
$MProvider.$construct,
isBridge: true,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'MChapter.',
$MChapter.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'MManga.',
$MManga.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'MPages.',
$MPages.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'MSource.',
$MSource.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'MVideo.',
$MVideo.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'MTrack.',
$MTrack.$new,
);
runtime.registerBridgeEnumValues(
'package:mangayomi/bridge_lib.dart',
'MStatus',
$MStatus.$values,
);
//Filter
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'FilterList.',
$FilterList.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'SelectFilter.',
$SelectFilter.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'SeparatorFilter.',
$SeparatorFilter.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'HeaderFilter.',
$HeaderFilter.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'TextFilter.',
$TextFilter.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'SortFilter.',
$SortFilter.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'TriStateFilter.',
$TriStateFilter.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'GroupFilter.',
$GroupFilter.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'CheckBoxFilter.',
$CheckBoxFilter.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'SortState.',
$SortState.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'SelectFilterOption.',
$SelectFilterOption.$new,
);
//Sources preferences
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'CheckBoxPreference.',
$CheckBoxPreference.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'SwitchPreferenceCompat.',
$SwitchPreferenceCompat.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'ListPreference.',
$ListPreference.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'MultiSelectListPreference.',
$MultiSelectListPreference.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'EditTextPreference.',
$EditTextPreference.$new,
);
//DOM HTML
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'MElement.',
$MElement.$new,
);
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'MDocument.',
$MDocument.$new,
);
//HTTP CLIENT
runtime.registerBridgeFunc(
'package:mangayomi/bridge_lib.dart',
'Client.',
$Client.$new,
);
}
}

View file

@ -1,10 +0,0 @@
import 'dart:typed_data';
import 'package:dart_eval/dart_eval.dart';
import 'package:mangayomi/eval/dart/plugin.dart';
Runtime runtimeEval(Uint8List bytecode) {
final runtime = Runtime(bytecode.buffer.asByteData());
final plugin = MEvalPlugin();
runtime.addPlugin(plugin);
return runtime;
}

View file

@ -1,13 +1,9 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/dart/bridge/m_source.dart';
import 'package:mangayomi/eval/dart/compiler/compiler.dart';
import 'package:mangayomi/eval/dart/runtime/runtime.dart';
import 'package:d4rt/d4rt.dart';
import 'package:mangayomi/eval/dart/bridge/registrer.dart';
import 'package:mangayomi/eval/model/filter.dart';
import 'package:mangayomi/eval/javascript/http.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/model/m_provider.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/models/page.dart';
import 'package:mangayomi/models/source.dart';
@ -21,38 +17,31 @@ class DartExtensionService implements ExtensionService {
DartExtensionService(this.source);
MProvider _executeLib() {
final bytecode = compilerEval(source.sourceCode!);
D4rt _executeLib() {
final interpreter = D4rt();
RegistrerBridge.registerBridge(interpreter);
final runtime = runtimeEval(bytecode);
return runtime.executeLib('package:mangayomi/main.dart', 'main', [
$MSource.wrap(source.toMSource()),
])
as MProvider;
interpreter.execute(
source.sourceCode!.replaceAll(
"final Client client = Client(source)",
"final Client client = Client()",
),
mainArgs: source.toMSource(),
);
return interpreter;
}
@override
Map<String, String> getHeaders() {
Map<String, String> headers = {};
try {
final bytecode = compilerEval(source.sourceCode!);
final runtime = runtimeEval(bytecode);
runtime.args = [$String(source.baseUrl!)];
var res = runtime.executeLib('package:mangayomi/main.dart', 'getHeader');
if (res is $Map) {
headers = (res.$reified).toMapStringString!;
} else if (res is Map) {
headers = res.toMapStringString!;
} else {
throw "";
}
headers = _executeLib().invoke('headers', []) as Map<String, String>;
} catch (_) {
try {
headers = _executeLib().headers;
} catch (_) {
return {};
}
headers =
_executeLib().invoke('getHeader', [source.baseUrl!])
as Map<String, String>;
} catch (_) {}
}
return headers;
}
@ -61,10 +50,9 @@ class DartExtensionService implements ExtensionService {
String get sourceBaseUrl {
String? baseUrl;
try {
baseUrl = _executeLib().baseUrl;
} catch (_) {
//
}
final interpreter = _executeLib();
baseUrl = interpreter.invoke('baseUrl', []) as String?;
} catch (_) {}
return baseUrl == null || baseUrl.isEmpty ? source.baseUrl! : baseUrl;
}
@ -73,36 +61,55 @@ class DartExtensionService implements ExtensionService {
bool get supportsLatest {
bool? supportsLatest;
try {
supportsLatest = _executeLib().supportsLatest;
final interpreter = _executeLib();
supportsLatest = interpreter.invoke('supportsLatest', []) as bool?;
} catch (e) {
supportsLatest = true;
}
return supportsLatest;
return supportsLatest ?? true;
}
@override
Future<MPages> getPopular(int page) async {
return await _executeLib().getPopular(page);
try {
final interpreter = _executeLib();
final result = await interpreter.invoke('getPopular', [page]);
return result as MPages;
} catch (e) {
rethrow;
}
}
@override
Future<MPages> getLatestUpdates(int page) async {
return await _executeLib().getLatestUpdates(page);
final interpreter = _executeLib();
final result = await interpreter.invoke('getLatestUpdates', [page]);
return result as MPages;
}
@override
Future<MPages> search(String query, int page, List<dynamic> filters) async {
return await _executeLib().search(query, page, FilterList(filters));
final interpreter = _executeLib();
final result = await interpreter.invoke('search', [
query,
page,
FilterList(filters),
]);
return result as MPages;
}
@override
Future<MManga> getDetail(String url) async {
return await _executeLib().getDetail(url);
final interpreter = _executeLib();
final result = await interpreter.invoke('getDetail', [url]);
return result as MManga;
}
@override
Future<List<PageUrl>> getPageList(String url) async {
return (await _executeLib().getPageList(url))
final interpreter = _executeLib();
final result = await interpreter.invoke('getPageList', [url]);
return (result as List)
.map(
(e) =>
e is String
@ -114,45 +121,593 @@ class DartExtensionService implements ExtensionService {
@override
Future<List<Video>> getVideoList(String url) async {
return await _executeLib().getVideoList(url);
final interpreter = _executeLib();
final result = await interpreter.invoke('getVideoList', [url]);
return (result as List).cast<Video>();
}
@override
Future<String> getHtmlContent(String name, String url) async {
return await _executeLib().getHtmlContent(name, url);
Future<String> getHtmlContent(String url, String? referer) async {
final interpreter = _executeLib();
final result = await interpreter.invoke('getHtmlContent', [url, referer]);
return result as String;
}
@override
Future<String> cleanHtmlContent(String html) async {
return await _executeLib().cleanHtmlContent(html);
final interpreter = _executeLib();
final result = await interpreter.invoke('cleanHtmlContent', [html]);
return result as String;
}
@override
FilterList getFilterList() {
List<dynamic> list;
try {
list =
_executeLib()
.getFilterList()
.map((e) => e is $Value ? e.$reified : e)
.toList();
final interpreter = _executeLib();
list = interpreter.invoke('getFilterList', []) as List;
} catch (_) {
list = [];
}
return FilterList(list);
return FilterList(_toValueList(list));
}
List _toValueList(List filters) {
return (filters).map((e) {
if (e is BridgedInstance) {
e = e.nativeObject;
}
if (e is SelectFilter) {
return SelectFilter(
e.type,
e.name,
e.state,
_toValueList(e.values),
e.typeName,
);
} else if (e is SortFilter) {
return SortFilter(
e.type,
e.name,
e.state,
_toValueList(e.values),
e.typeName,
);
} else if (e is GroupFilter) {
return GroupFilter(e.type, e.name, _toValueList(e.state), e.typeName);
}
return e;
}).toList();
}
@override
List<SourcePreference> getSourcePreferences() {
final interpreter = _executeLib();
try {
return _executeLib()
.getSourcePreferences()
.map((e) => (e is $Value ? e.$reified : e) as SourcePreference)
.toList();
final result = interpreter.invoke('getSourcePreferences', []);
return (result as List).cast();
} catch (_) {
return [];
}
}
}
final aaaaaa = r'''
import 'package:mangayomi/bridge_lib.dart';
import 'dart:convert';
class AniZone extends MProvider {
AniZone({required this.source});
final MSource source;
final Client client = Client(source);
// Constants for the xpath
static const String urlXpath =
'//*[contains(@class,"flw-item item-qtip")]/div[@class="film-poster"]/a/@href';
static const String nameXpath =
'//*[contains(@class,"flw-item item-qtip")]/div[@class="film-detail"]/h3/text()';
static const String imageXpath =
'//*[contains(@class,"flw-item item-qtip")]/div[@class="film-poster"]/img/@data-src';
// Methods for fetching the manga list (popular, latest & search)
Future<MPages> _getMangaList(String url) async {
final doc = (await client.get(Uri.parse(url))).body;
List<MManga> animeList = [];
final urls = xpath(doc, urlXpath);
final names = xpath(doc, nameXpath);
final images = xpath(doc, imageXpath);
if (urls.isEmpty || names.isEmpty || images.isEmpty) {
return MPages([], false);
}
for (var i = 0; i < names.length; i++) {
print(names[i]);
MManga anime = MManga();
anime.name = names[i];
anime.imageUrl = images[i];
anime.link = urls[i];
animeList.add(anime);
}
return MPages(animeList, urls.isNotEmpty);
}
@override
Future<MPages> getPopular(int page) async {
return _getMangaList("${source.baseUrl}/most-popular/?page=$page");
}
@override
Future<MPages> getLatestUpdates(int page) async {
return _getMangaList("${source.baseUrl}/recently-added/?page=$page");
}
@override
Future<MPages> search(String query, int page, FilterList filterList) async {
String baseUrl = "${source.baseUrl}/filter?keyword=$query";
final filterHandlers = {
"TypeFilter": "type",
"LanguageFilter": "lang",
"SaisonFilter": "season",
"StatusFilter": "status",
"GenreFilter": "genre",
};
final activeFilterParams = <String, String>{};
for (var filter in filterList.filters) {
final paramKey = filterHandlers[filter.type];
if (paramKey != null && filter.state is List) {
final selectedValues =
(filter.state as List)
.where((item) {
return item.state == true && item.value != null;
})
.map((item) => item.value as String)
.toList();
if (selectedValues.isNotEmpty) {
activeFilterParams[paramKey] = selectedValues.join("%2C");
}
}
}
if (activeFilterParams.isNotEmpty) {
final queryString = activeFilterParams.entries
.map((entry) => '${Uri.encodeComponent(entry.key)}=${entry.value}')
.join('&');
baseUrl += '&$queryString';
}
return _getMangaList("$baseUrl&page=$page");
}
Future<MManga> getDetail(String url) async {
MManga anime = MManga();
try {
final doc = (await client.get(Uri.parse(url))).body;
final description = xpath(doc, '//p[contains(@class,"short")]/text()');
anime.description = description.isNotEmpty ? description.first : "";
final statusList = xpath(
doc,
'//div[contains(@class,"col2")]//div[contains(@class,"item")]//div[contains(@class,"item-content")]/text()',
);
if (statusList.isNotEmpty) {
if (statusList[0] == "Terminer") {
anime.status = MStatus.completed;
} else if (statusList[0] == "En cours") {
anime.status = MStatus.ongoing;
} else {
anime.status = MStatus.unknown;
}
} else {
anime.status = MStatus.unknown;
}
anime.genre = xpath(
doc,
'//div[contains(@class,"item")]//div[contains(@class,"item-content")]//a[contains(@href,"genre")]/text()',
);
final regex = RegExp(r'(\d+)$');
final match = regex.firstMatch(url);
if (match == null) {
throw Exception('Numéro de l\'épisode non trouvé dans l\'URL.');
}
final res =
(await client.get(
Uri.parse("${source.baseUrl}/ajax/episode/list/${match.group(1)}"),
)).body;
List<MChapter> episodesList = [];
final episodeElements = parseHtml(
json.decode(res)["html"],
).select(".ep-item");
// Associer chaque titre à son URL et récupérer les vidéos
for (var element in episodeElements) {
MChapter episode = MChapter();
episode.name = element.attr("title");
String id = substringAfterLast(element.attr("href"), "=");
episode.url = "${source.baseUrl}/ajax/episode/servers?episodeId=$id";
episodesList.add(episode);
}
anime.chapters = episodesList.reversed.toList();
return anime;
} catch (e) {
throw Exception('Erreur lors de la récupération des détails: $e');
}
}
@override
Future<List<MVideo>> getVideoList(String url) async {
final videoRes =
(await client.get(
Uri.parse(url),
headers: {"Referer": "${source.baseUrl}/"},
)).body;
final lang = xpath(
videoRes.replaceAll(r'\', ''),
'//div[contains(@class,"item server-item")]/@data-type',
);
final links = xpath(
videoRes.replaceAll(r'\', ''),
'//div[contains(@class,"item server-item")]/@data-id',
);
final playersNames = xpath(
videoRes.replaceAll(r'\', ''),
'//div[contains(@class,"item server-item")]/text()',
);
List<Map<String, String>> players = [];
for (int j = 0; j < links.length; j++) {
// schema of players https://v1.animesz.xyz/ajax/episode/servers?episodeId=(id_episode)
// schema or url https://v1.animesz.xyz/ajax/episode/sources?id=(player_id)&epid=(id_episode)
if (playersNames.isNotEmpty && playersNames[j] == "sibnet") {
final playerUrl =
"https://video.sibnet.ru/shell.php?videoid=${links[j]}";
players.add({"lang": lang[j], "player": playerUrl});
} else if (playersNames.isNotEmpty && playersNames[j] == "sendvid") {
final playerUrl = "https://sendvid.com/embed/${links[j]}";
players.add({"lang": lang[j], "player": playerUrl});
} else if (playersNames.isNotEmpty && playersNames[j] == "VidCDN") {
final playerUrl =
"https://r.vidcdn.xyz/v1/api/get_sources/${links[j].replaceFirst(RegExp(r'vidcdn$'), '')}";
players.add({"lang": lang[j], "player": playerUrl});
} else if (playersNames.isNotEmpty && playersNames[j] == "Voe") {
final playerUrl = "https://voe.sx/e/${links[j]}";
players.add({"lang": lang[j], "player": playerUrl});
} else if (playersNames.isNotEmpty && playersNames[j] == "Fmoon") {
final playerUrl =
"https://filemoon.sx/e/${links[j]}&data-realid=${links[j]}&epid=${substringAfter(url, "episodeId=")}";
players.add({"lang": lang[j], "player": playerUrl});
}
}
List<MVideo> videos = [];
for (var player in players) {
String lang = (player["lang"] as String).toUpperCase();
String playerUrl = player["player"];
List<MVideo> a = [];
if (playerUrl.contains("sendvid")) {
a = await sendVidExtractorr(playerUrl, "$lang ");
} else if (playerUrl.contains("sibnet.ru")) {
a = await sibnetExtractor(playerUrl, lang);
} else if (playerUrl.contains("voe.sx")) {
a = await voeExtractor(playerUrl, "$lang ");
} else if (playerUrl.contains("vidcdn")) {
a = await vidcdnExtractor(playerUrl, lang);
} else if (playerUrl.contains("filemoon")) {
a = await filemoonExtractor(playerUrl, "$lang Filemoon - ", "");
} else if (playerUrl.contains("vidhide")) {
a = await streamHideExtractor(playerUrl, lang);
}
videos.addAll(a);
}
return sortVideos(videos, source.id);
}
Future<List<MVideo>> streamHideExtractor(String url, String prefix) async {
final res = (await client.get(Uri.parse(url))).body;
final masterUrl = substringBefore(
substringAfter(
substringAfter(substringAfter(unpackJs(res), "sources:"), "file:\""),
"src:\"",
),
'"',
);
final masterPlaylistRes = (await client.get(Uri.parse(masterUrl))).body;
List<MVideo> videos = [];
for (var it in substringAfter(
masterPlaylistRes,
"#EXT-X-STREAM-INF:",
).split("#EXT-X-STREAM-INF:")) {
final quality =
"${substringBefore(substringBefore(substringAfter(substringAfter(it, "RESOLUTION="), "x"), ","), "\n")}p";
String videoUrl = substringBefore(substringAfter(it, "\n"), "\n");
if (!videoUrl.startsWith("http")) {
videoUrl =
"${masterUrl.split("/").sublist(0, masterUrl.split("/").length - 1).join("/")}/$videoUrl";
}
MVideo video = MVideo();
video
..url = videoUrl
..originalUrl = videoUrl
..quality = "$prefix StreamHideVid - $quality";
videos.add(video);
}
return videos;
}
@override
List<dynamic> getFilterList() {
return [
GroupFilter("TypeFilter", "Type", [
CheckBoxFilter("Film", "1"),
CheckBoxFilter("Anime", "2"),
CheckBoxFilter("OVA", "3"),
CheckBoxFilter("ONA", "4"),
CheckBoxFilter("Special", "5"),
CheckBoxFilter("Music", "6"),
]),
GroupFilter("LanguageFilter", "Langue", [
CheckBoxFilter("VF", "3"),
CheckBoxFilter("VOSTFR", "4"),
CheckBoxFilter("Multicc", "2"),
CheckBoxFilter("EN", "1"),
]),
GroupFilter("SaisonFilter", "Saison", [
CheckBoxFilter("Printemps", "1"),
CheckBoxFilter("Été", "2"),
CheckBoxFilter("Automne", "3"),
CheckBoxFilter("Hiver", "4"),
]),
GroupFilter("StatusFilter", "Statut", [
CheckBoxFilter("Terminés", "1"),
CheckBoxFilter("En cours", "2"),
CheckBoxFilter("Pas encore diffusés", "3"),
]),
GroupFilter("GenreFilter", "Genre", [
CheckBoxFilter("Action", "1"),
CheckBoxFilter("Aventure", "2"),
CheckBoxFilter("Voitures", "3"),
CheckBoxFilter("Comédie", "4"),
CheckBoxFilter("Démence", "5"),
CheckBoxFilter("Démons", "6"),
CheckBoxFilter("Drame", "8"),
CheckBoxFilter("Ecchi", "9"),
CheckBoxFilter("Fantastique", "10"),
CheckBoxFilter("Jeu", "11"),
CheckBoxFilter("Harem", "35"),
CheckBoxFilter("Historique", "13"),
CheckBoxFilter("Horreur", "14"),
CheckBoxFilter("Isekai", "44"),
CheckBoxFilter("Josei", "43"),
CheckBoxFilter("Enfants", "25"),
CheckBoxFilter("Magie", "16"),
CheckBoxFilter("Arts martiaux", "17"),
CheckBoxFilter("Mecha", "18"),
CheckBoxFilter("Militaire", "38"),
CheckBoxFilter("Musique", "19"),
CheckBoxFilter("Mystère", "7"),
CheckBoxFilter("Parodie", "20"),
CheckBoxFilter("Police", "39"),
CheckBoxFilter("Psychologique", "40"),
CheckBoxFilter("Romance", "22"),
CheckBoxFilter("Samouraï", "21"),
CheckBoxFilter("École", "23"),
CheckBoxFilter("Science-Fiction", "24"),
CheckBoxFilter("Seinen", "42"),
CheckBoxFilter("Shoujo Ai", "26"),
CheckBoxFilter("Shoujo", "25"),
CheckBoxFilter("Shounen Ai", "28"),
CheckBoxFilter("Tranche de vie", "36"),
CheckBoxFilter("Shounen", "27"),
CheckBoxFilter("Espace", "29"),
CheckBoxFilter("Sports", "30"),
CheckBoxFilter("Super Pouvoir", "31"),
CheckBoxFilter("Surnaturel", "37"),
CheckBoxFilter("Vampire", "32"),
CheckBoxFilter("Yaoi", "33"),
CheckBoxFilter("Yuri", "34"),
]),
];
}
@override
List<dynamic> getSourcePreferences() {
return [
ListPreference(
key: "preferred_quality",
title: "Qualité préférée",
summary: "",
valueIndex: 0,
entries: ["1080p", "720p", "480p", "360p"],
entryValues: ["1080", "720", "480", "360"],
),
ListPreference(
key: "voices_preference",
title: "Préférence des voix",
summary: "",
valueIndex: 0,
entries: ["Préférer VOSTFR", "Préférer VF"],
entryValues: ["vostfr", "vf"],
),
];
}
List<MVideo> sortVideos(List<MVideo> videos, int sourceId) {
String quality = getPreferenceValue(sourceId, "preferred_quality");
String voice = getPreferenceValue(sourceId, "voices_preference");
videos.sort((MVideo a, MVideo b) {
int qualityMatchA = 0;
if (a.quality.contains(quality) &&
a.quality.toLowerCase().contains(voice)) {
qualityMatchA = 1;
}
int qualityMatchB = 0;
if (b.quality.contains(quality) &&
b.quality.toLowerCase().contains(voice)) {
qualityMatchB = 1;
}
if (qualityMatchA != qualityMatchB) {
return qualityMatchB - qualityMatchA;
}
final regex = RegExp(r'(\d+)p');
final matchA = regex.firstMatch(a.quality);
final matchB = regex.firstMatch(b.quality);
final int qualityNumA = int.tryParse(matchA?.group(1) ?? '0') ?? 0;
final int qualityNumB = int.tryParse(matchB?.group(1) ?? '0') ?? 0;
return qualityNumB - qualityNumA;
});
return videos;
}
Future<List<MVideo>> sendVidExtractorr(String url, String prefix) async {
final res = (await client.get(Uri.parse(url))).body;
final document = parseHtml(res);
final masterUrl = document.selectFirst("source#video_source")?.attr("src");
print(masterUrl);
if (masterUrl == null) return [];
final masterHeaders = {
"Accept": "*/*",
"Host": Uri.parse(masterUrl).host,
"Origin": "https://${Uri.parse(url).host}",
"Referer": "https://${Uri.parse(url).host}/",
};
List<MVideo> videos = [];
if (masterUrl.contains(".m3u8")) {
final masterPlaylistRes = (await client.get(Uri.parse(masterUrl))).body;
for (var it in substringAfter(
masterPlaylistRes,
"#EXT-X-STREAM-INF:",
).split("#EXT-X-STREAM-INF:")) {
final quality =
"${substringBefore(substringBefore(substringAfter(substringAfter(it, "RESOLUTION="), "x"), ","), "\n")}p";
String videoUrl = substringBefore(substringAfter(it, "\n"), "\n");
if (!videoUrl.startsWith("http")) {
videoUrl =
"${masterUrl.split("/").sublist(0, masterUrl.split("/").length - 1).join("/")}/$videoUrl";
}
final videoHeaders = {
"Accept": "*/*",
"Host": Uri.parse(videoUrl).host,
"Origin": "https://${Uri.parse(url).host}",
"Referer": "https://${Uri.parse(url).host}/",
};
var video = MVideo();
video
..url = videoUrl
..originalUrl = videoUrl
..quality = prefix + "Sendvid:$quality"
..headers = videoHeaders;
videos.add(video);
}
} else {
var video = MVideo();
video
..url = masterUrl
..originalUrl = masterUrl
..quality = prefix + "Sendvid:default"
..headers = masterHeaders;
videos.add(video);
}
return videos;
}
Future<List<MVideo>> vidcdnExtractor(String url, String prefix) async {
final res = await client.get(Uri.parse(url));
if (res.statusCode != 200) {
print("Erreur lors de la récupération de la page : ${res.statusCode}");
return [];
}
final jsonResponse = jsonDecode(res.body);
String masterUrl = jsonResponse['sources'][0]['file'] ?? '';
final quality = jsonResponse['quality'] ?? '';
List<MVideo> videos = [];
final masterPlaylistRes = await client.get(Uri.parse(masterUrl));
if (masterPlaylistRes.statusCode != 200) {
print(
"Error lors de la récupération de la playlist M3U8 : ${masterPlaylistRes.statusCode}",
);
return [];
}
final masterPlaylistBody = masterPlaylistRes.body;
final playlistLines = masterPlaylistBody.split("\n");
for (int i = 0; i < playlistLines.length; i++) {
final line = playlistLines[i];
if (line.startsWith("#EXT-X-STREAM-INF")) {
final resolutionLine = line.split("RESOLUTION=").last;
final resolution = resolutionLine.split(",").first;
final width = int.parse(resolution.split("x").first);
final height = int.parse(resolution.split("x").last);
String videoQuality;
if (height >= 1080) {
videoQuality = "1080p";
} else if (height >= 720) {
videoQuality = "720p";
} else if (height >= 480) {
videoQuality = "480p";
} else if (height >= 360) {
videoQuality = "360p";
} else {
videoQuality = "${height}p";
}
String videoUrl = playlistLines[i + 1].trim();
if (!videoUrl.startsWith("http")) {
videoUrl =
"${masterUrl.substring(0, masterUrl.lastIndexOf('/'))}/$videoUrl";
}
var video = MVideo();
video
..url = masterUrl
..originalUrl = masterUrl
..quality = "$prefix VidCDN:$videoQuality";
videos.add(video);
}
}
return videos;
}
}
AniZone main(MSource source) {
return AniZone(source: source);
}
''';

View file

@ -1,7 +1,5 @@
import 'dart:convert';
import 'package:bot_toast/bot_toast.dart';
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:go_router/go_router.dart';
@ -9,7 +7,6 @@ import 'package:html/dom.dart' hide Text;
import 'package:intl/date_symbol_data_local.dart';
import 'package:intl/intl.dart';
import 'package:js_packer/js_packer.dart';
import 'package:json_path/json_path.dart';
import 'package:mangayomi/eval/model/document.dart';
import 'package:mangayomi/eval/javascript/http.dart';
import 'package:mangayomi/main.dart';
@ -70,11 +67,8 @@ class MBridge {
}
///Create query by html string
static const $Function xpath = $Function(_xpath);
static $Value? _xpath(_, __, List<$Value?> args) {
String html = args[0]!.$reified;
String xpath = args[1]!.$reified;
static List<String>? xpath(String html, String xpath) {
List<String> attrs = [];
try {
var htmlXPath = HtmlXPath.html(html);
@ -92,9 +86,9 @@ class MBridge {
attrs = [attr];
}
}
return $List.wrap(attrs.map((e) => $String(e)).toList());
return attrs;
} catch (_) {
return $List.wrap([]);
return [];
}
}
@ -104,11 +98,7 @@ class MBridge {
static Status parseStatus(String status, List statusList) {
for (var element in statusList) {
Map statusMap = {};
if (element is $Map<$Value, $Value>) {
statusMap = element.$reified;
} else {
statusMap = element;
}
statusMap = element;
for (var element in statusMap.entries) {
if (element.key.toString().toLowerCase().contains(
status.toLowerCase().trim().trimLeft().trimRight(),
@ -128,103 +118,25 @@ class MBridge {
}
///Unpack a JS code
static const $Function unpackJs = $Function(_unpackJs);
static $Value? _unpackJs(_, __, List<$Value?> args) {
String code = args[0]!.$reified;
static String? unpackJs(String code) {
try {
final jsPacker = JSPacker(code);
return $String(jsPacker.unpack() ?? "");
return jsPacker.unpack() ?? "";
} catch (_) {
return $String("");
return "";
}
}
///Unpack a JS code
static const $Function unpackJsAndCombine = $Function(_unpackJsAndCombine);
static $Value? _unpackJsAndCombine(_, __, List<$Value?> args) {
String code = args[0]!.$reified;
static String? unpackJsAndCombine(String code) {
try {
return $String(JsUnpacker.unpackAndCombine(code) ?? "");
return JsUnpacker.unpackAndCombine(code) ?? "";
} catch (_) {
return $String("");
return "";
}
}
///Read values in parsed JSON object and return resut to List<String>
static final $Function jsonPathToList = $Function(
(runtime, thisObj, List<$Value?> args) =>
_jsonPathToStringOrList(runtime, thisObj, true, args),
);
static $Value? _jsonPathToStringOrList(
Object? runtime, // unused by bridge
Object? thisObj, // unused by bridge
bool toList, // new flag: list vs. single-string
List<$Value?> args, // [ sourceJson, jsonPathExpr ]
) {
final source = args[0]!.$reified;
final expression = args[1]!.$reified;
dynamic decoded;
try {
decoded = jsonDecode(source);
} catch (_) {
return toList ? $List.wrap(<$Value>[]) : $String('');
}
// Normalize a JSON element (either Map or List) into a Map<String, dynamic>
Map<String, dynamic> normalize(dynamic elt) {
if (elt is Map) {
return elt.map((k, v) => MapEntry(k.toString(), v));
}
return <String, dynamic>{};
}
/// Common JSONPath read logic
List<dynamic> extractList(Map<String, dynamic> dataMap) {
// readValues returns all matches; .read returns Match objects
final matches = JsonPath(expression).read(dataMap);
return matches.map((m) => m.value).toList();
}
if (decoded is List) {
// Branch: JSON root is a list always return a List<$String>
final out = <$Value>[];
for (var elt in decoded) {
final map = normalize(elt);
final extracted = extractList(map);
if (toList) {
// join into JSON strings per element
out.addAll(extracted.map((e) => $String(jsonEncode(e))));
} else if (extracted.isNotEmpty) {
// only first match as string
out.add($String(extracted.first.toString()));
} else {
out.add($String(''));
}
}
return $List.wrap(out);
} else if (decoded is Map) {
// Branch: JSON root is object
final map = normalize(decoded);
final extracted = extractList(map);
if (toList) {
return $List.wrap(
extracted
.map((e) => $String(e == null ? '{}' : jsonEncode(e)))
.toList(),
);
} else {
return $String(extracted.isNotEmpty ? extracted.first.toString() : '');
}
}
// Fallback: neither List nor Map
return toList ? $List.wrap(<$Value>[]) : $String('');
}
///GetMapValue
static String getMapValue(String source, String attr, bool encode) {
try {
@ -238,12 +150,6 @@ class MBridge {
}
}
///Read values in parsed JSON object and return resut to String
static final $Function jsonPathToString = $Function(
(runtime, thisObj, List<$Value?> args) =>
_jsonPathToStringOrList(runtime, thisObj, false, args),
);
//Parse a list of dates to millisecondsSinceEpoch
static List parseDates(
List value,
@ -252,11 +158,7 @@ class MBridge {
) {
List<dynamic> val = [];
for (var element in value) {
if (element is $Value) {
val.add(element.$reified.toString());
} else {
val.add(element);
}
val.add(element);
}
bool error = false;
List<dynamic> valD = [];

View file

@ -121,10 +121,9 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
AsyncValue<MPages?>? _getManga;
int _length = 0;
bool _isFiltering = false;
late final supportsLatest = ref.watch(supportsLatestProvider(source: source));
@override
Widget build(BuildContext context) {
final supportsLatest = ref.watch(supportsLatestProvider(source: source));
final filterList = getFilterList(source: source);
if (_selectedIndex == 2 && (_isSearch && _query.isNotEmpty) ||
_isFiltering) {

View file

@ -222,14 +222,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.1"
change_case:
dependency: transitive
description:
name: change_case
sha256: e41ef3df58521194ef8d7649928954805aeb08061917cf658322305e61568003
url: "https://pub.dev"
source: hosted
version: "2.2.0"
characters:
dependency: transitive
description:
@ -358,14 +350,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.0+7.3.0"
dart_eval:
d4rt:
dependency: "direct main"
description:
name: dart_eval
sha256: bbad8246a99a3c61925e19b3d2c2bd6311f8186fb4642a16bf3d22153b3ade55
name: d4rt
sha256: c59d4546fe58a76250dda4cd7db9ec5bb2eb633f47f5104a1f60de72b111639e
url: "https://pub.dev"
source: hosted
version: "0.7.10"
version: "0.0.1"
dart_style:
dependency: transitive
description:
@ -415,14 +407,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "7.0.2"
directed_graph:
dependency: transitive
description:
name: directed_graph
sha256: "6582283519fc08a6a14172d8a3798238f09275a1147e7599baf09c6245e3104a"
url: "https://pub.dev"
source: hosted
version: "0.4.5"
draggable_menu:
dependency: "direct main"
description:
@ -446,14 +430,6 @@ packages:
relative: true
source: path
version: "4.0.3"
exception_templates:
dependency: transitive
description:
name: exception_templates
sha256: "517f7c770da690073663f867ee2057ae2f4ffb28edae9da9faa624aa29ac76eb"
url: "https://pub.dev"
source: hosted
version: "0.3.1"
expandable_text:
dependency: "direct main"
description:
@ -1076,14 +1052,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.4.15"
lazy_memo:
dependency: transitive
description:
name: lazy_memo
sha256: dcb30b4184a6d767e1d779d74ce784d752d38313b8fb4bad6b659ae7af4bb34d
url: "https://pub.dev"
source: hosted
version: "0.2.3"
leak_tracker:
dependency: transitive
description:
@ -1525,14 +1493,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.2.2"
quote_buffer:
dependency: transitive
description:
name: quote_buffer
sha256: c4cd07e55ed1b1645a1cc74278a03b2a642c9f6ea3c0528d51827fdd320acf87
url: "https://pub.dev"
source: hosted
version: "0.2.6"
re_editor:
dependency: "direct main"
description:

View file

@ -36,7 +36,6 @@ dependencies:
file_picker: ^10.0.0
path_provider: ^2.1.5
scrollable_positioned_list: ^0.3.8
dart_eval: ^0.7.10
json_path: ^0.7.4
bot_toast: ^4.1.3
flutter_web_auth_2: ^3.1.2
@ -88,6 +87,7 @@ dependencies:
marquee: ^2.2.3
epubx:
path: ./epubx
d4rt: ^0.0.1
dependency_overrides:
ffi: ^2.1.3