Skip to content

Commit

Permalink
Añadida serialización en JSON
Browse files Browse the repository at this point in the history
  • Loading branch information
Foo-Manroot committed May 31, 2020
1 parent ce710b2 commit 7610661
Show file tree
Hide file tree
Showing 16 changed files with 460 additions and 6 deletions.
12 changes: 10 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ s.obtenerDef ([PALABRA A BUSCAR])
Esto devuelve los resultados obtenidos y los muestra por pantalla.
El resultado que se devuelve es una instancia de la clase `Resultado` (en un `Future`, lo que hay que tener en cuenta si se quieren manipular estos resultados).


Este resultado tiene los siguientes atributos (se puede consultar con más detalle el código fuente en `lib/src/modelos/Resultado.dart`):
- `List<Entrada> entradas`: Lista de entradas aplicables a esta palabra
- `List<String> otras`: Enlaces a otras entradas similares
Expand All @@ -63,7 +64,7 @@ En concreto, las clases implementadoras son:
`Acepc`, una acepción normal. Sus atributos son:
- `int num_acep`: Número de la acepción
- `String gram`: Clasificación gramatical
- `List<String> uso`: Especificaciones extra sobre el uso, como la zona en la que se usa, si es un vulgarismo, etc.
- `List<Uso> uso`: Especificaciones extra sobre el uso, como la zona en la que se usa, si es un vulgarismo, etc.
- `String texto`: Texto plano de la acepción.
- `List<Palabra> palabras`:Objetos de tipo Palabra que componen esta acepción.

Expand All @@ -74,6 +75,11 @@ En concreto, las clases implementadoras son:



`Uso` contiene la abreviatura usada para especificar cómo y dónde se usa esta acepción, y contiene los siguientes atributos:
- `String abrev`: Abreviatura (por ejemplo: _U._ para referirse a _Usado, usada, usados, usadas_).
- `List<String> significado`: Lista de posibles explicaciones de esa abreviatura. En el ejemplo anterior, sería `["Usado", "usada", "usados", "usadas"]`


Por último, las unidades mínimas semánticas se almacenan en el objeto `Palabra`.
Este objeto permite guardar los enlaces directos a sus definiciones.
Estos enlaces son de la forma `[urlBase]/?e=1&id=[dataId]&w=[texto]` (el último parámetro parece ser opcional) y generan menos tráfico de red porque devuelven directamente el HTML de la entrada, sin el resto de la página.
Expand All @@ -86,10 +92,12 @@ Sus atributos son:



Para serializar y deserializar se pueden usar los métodos `.toJson()` y `.fromJson()`, respectivamente.

----


**TODO**:

1. Obtener la palabra del día
2. Implementar `Palabra.obtenerDef()`
2. Caché con los resultados para disminuir el consumo de red
33 changes: 31 additions & 2 deletions lib/src/modelos/Acepc.dart
Original file line number Diff line number Diff line change
@@ -1,46 +1,76 @@
import 'package:json_annotation/json_annotation.dart';

import 'enums.dart';
import 'package:html/dom.dart' as dom;

import 'Palabra.dart';
import 'Definic.dart';
import 'Uso.dart';


/* Para la serialización */
part 'Acepc.g.dart';

/**
* Clase para representar una acepción.
*/
@JsonSerializable(
fieldRename: FieldRename.snake,
explicitToJson: true
)
class Acepc extends Definic {


/**
* Número de acepción.
* (<span class="n_acep">)
*/
@JsonKey(required: true)
final int num_acep;

/**
* Clasificación gramatical.
* (<abbr class="g" title="...">)
*/
@JsonKey(required: true)
final String gram;

/**
* Especificaciones extra sobre el uso, como la zona en la que se usa, si es un
* vulgarismo, etc.
*/
@JsonKey(defaultValue: [])
final List<Uso> uso;

/**
* Texto plano de la acepción. Esta se compone de los elementos [Palabra.texto] de
* [palabras].
*/
@JsonKey(required: true)
final String texto;

/**
* Objetos de tipo Palabra que componen esta acepción.
*/
@JsonKey(required: true)
final List<Palabra> palabras;


/*******************/
/** SERIALIZACIÓN **/
/*******************/
/* https://flutter.dev/docs/development/data-and-backend/json#code-generation */

/// A necessary factory constructor for creating a new User instance
/// from a map. Pass the map to the generated `_$UserFromJson()` constructor.
/// The constructor is named after the source class, in this case, User.
factory Acepc.fromJson(Map<String, dynamic> json) => _$AcepcFromJson (json);

/// `toJson` is the convention for a class to declare support for serialization
/// to JSON. The implementation simply calls the private, generated
/// helper method `_$UserToJson`.
Map<String, dynamic> toJson () => _$AcepcToJson (this);


/*******************/
/** CONSTRUCTORES **/
Expand All @@ -53,8 +83,7 @@ class Acepc extends Definic {
Acepc (int this.num_acep, String this.gram, String this.texto
, List<Palabra> this.palabras
, { ClaseAcepc clase = ClaseAcepc.manual, List<Uso> uso = null
, String id = null
}
, String id = null }
):
this.uso = (uso == null)? [] : uso
, super (id, clase)
Expand Down
78 changes: 78 additions & 0 deletions lib/src/modelos/Acepc.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

52 changes: 51 additions & 1 deletion lib/src/modelos/Definic.dart
Original file line number Diff line number Diff line change
@@ -1,23 +1,73 @@
import 'package:json_annotation/json_annotation.dart';

import 'enums.dart';
import 'Acepc.dart';
import 'Expr.dart';


/* Para la serialización */
part 'Definic.g.dart';

/**
* Clase base para cualquier tipo de definición (frases hechas, definiciones normales...)
* Clase base para cualquier tipo de definición (frases hechas, definiciones normales...),
*/
@JsonSerializable(
fieldRename: FieldRename.snake,
explicitToJson: true,
createFactory: false
)
abstract class Definic {

/**
* Identificador (HTML) de la acepción (si existe).
*/
@JsonKey(defaultValue: null)
final String id;

/**
* Tipo de acepción, por si se necesita diferenciar en algún momento
*/
@JsonKey(defaultValue: ClaseAcepc.manual)
final ClaseAcepc clase;


/*******************/
/** SERIALIZACIÓN **/
/*******************/
/* https://flutter.dev/docs/development/data-and-backend/json#code-generation */

/**
* Al ser una clase abstracta, hay que crear un constructor propio:
* https://github.com/dart-lang/json_serializable/issues/606#issuecomment-587993029
*/
factory Definic.fromJson(Map<String, dynamic> json) {

switch (json ["clase"]) {

/* Al serializar no se usan los valores 'ClaseAcepc', sino sus
representaciones como String */
case "manual":
case "normal":
case "enlace":
return Acepc.fromJson (json);

case "frase_hecha":
return Expr.fromJson (json);

default:
throw ArgumentError ("Invalid value provided: ${json["clase"]}. "
" Should be one of ${ClaseAcepc.values}"
);
}
}

/// `toJson` is the convention for a class to declare support for serialization
/// to JSON. The implementation simply calls the private, generated
/// helper method `_$UserToJson`.
Map<String, dynamic> toJson () => _$DefinicToJson (this);



Definic (String this.id, ClaseAcepc this.clase);


Expand Down
19 changes: 19 additions & 0 deletions lib/src/modelos/Definic.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions lib/src/modelos/Entrada.dart
Original file line number Diff line number Diff line change
@@ -1,34 +1,61 @@
import 'package:html/dom.dart' as dom;
import 'package:json_annotation/json_annotation.dart';

import 'Definic.dart';
import 'Acepc.dart';
import 'Expr.dart';

/* Para la serialización */
part 'Entrada.g.dart';

/**
* Clase para representar una entrada, que es un conjunto de acepciones.
*/
@JsonSerializable(
fieldRename: FieldRename.snake,
explicitToJson: true
)
class Entrada {

/**
* Lista con todas las acepciones encontradas
*/
@JsonKey(defaultValue: [])
final List<Definic> definiciones;

/**
* Lo que haya en el atributo "title" del elemento <header>
*/
@JsonKey(required: true)
final String title;

/**
* Etimología
*/
@JsonKey(required: true)
final String etim;

/**
* Identificador (HTML) de la entrada (si existe).
*/
@JsonKey(defaultValue: null)
final String id;

/*******************/
/** SERIALIZACIÓN **/
/*******************/
/* https://flutter.dev/docs/development/data-and-backend/json#code-generation */

/// A necessary factory constructor for creating a new User instance
/// from a map. Pass the map to the generated `_$UserFromJson()` constructor.
/// The constructor is named after the source class, in this case, User.
factory Entrada.fromJson(Map<String, dynamic> json) => _$EntradaFromJson (json);

/// `toJson` is the convention for a class to declare support for serialization
/// to JSON. The implementation simply calls the private, generated
/// helper method `_$UserToJson`.
Map<String, dynamic> toJson () => _$EntradaToJson (this);


/*******************/
/** CONSTRUCTORES **/
Expand Down
28 changes: 28 additions & 0 deletions lib/src/modelos/Entrada.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 7610661

Please sign in to comment.