

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Adición de automatización con Liquid
<a name="sms-custom-templates-step2-automate"></a>

Nuestro sistema de plantillas personalizado utiliza [Liquid](https://shopify.github.io/liquid/) para la automatización. Se trata de un lenguaje de marcado en línea de código abierto. En Liquid, el texto entre llaves y símbolos de porcentaje es una instrucción o *etiqueta* que lleva a cabo una operación, como un flujo de control o una iteración. El texto que está entre llaves dobles es una variable u *objeto* que genera su valor.

El uso más frecuente de Liquid consistirá en analizar los datos procedentes del archivo de manifiesto de entrada y extraer las variables pertinentes para crear la tarea. Ground Truth genera automáticamente las tareas a menos que se especifique una función de Lambda previa a la anotación. El objeto `taskInput` devuelto por Ground Truth o [Pre-annotation Lambda](sms-custom-templates-step3-lambda-requirements.md#sms-custom-templates-step3-prelambda) es el objeto `task.input` de las plantillas.

Las propiedades del manifiesto de entrada se transfieren a la plantilla como `event.dataObject`.

**Example objeto de datos de manifiesto**  

```
{
  "source": "This is a sample text for classification",
  "labels": [ "angry" , "sad" , "happy" , "inconclusive" ],
  "header": "What emotion is the speaker feeling?"
}
```

**Example HTML de ejemplo que usa variables**  

```
<crowd-classifier 
  name='tweetFeeling'
  categories='{{ task.input.labels | to_json }}'
  header='{{ task.input.header }}' >
<classification-target>
  {{ task.input.source }}
</classification-target>
```

Tenga en cuenta la incorporación de ` | to_json` a la propiedad `labels` anterior. Es un filtro que convierte la matriz de manifiesto de entrada en una representación JSON de esta. Los filtros de variables se explican en la siguiente sección.

La siguiente lista incluye dos tipos de etiquetas de Liquid que podrían ser útiles para automatizar el procesamiento de los datos de entrada de las plantillas. Si selecciona uno de los siguientes tipos de etiquetas, se le redirigirá a la documentación de Liquid.
+ [Flujo de control](https://shopify.github.io/liquid/tags/control-flow/): incluye operadores lógicos de programación, como `if/else`, `unless` y `case/when`.
+ [Iteración](https://shopify.github.io/liquid/tags/iteration/): permite ejecutar bloques de código repetidamente con instrucciones como los bucles for. 

  Para ver un ejemplo de una plantilla HTML que utiliza elementos de Liquid para crear un bucle for, consulte [translation-review-and-correction.liquid.html](https://github.com/aws-samples/amazon-sagemaker-ground-truth-task-uis/blob/8ae02533ea5a91087561b1daecd0bc22a37ca393/text/translation-review-and-correction.liquid.html) en. GitHub 

Para obtener más información y documentación, visite la [página de inicio de Liquid](https://shopify.github.io/liquid/).

## Filtros de variables
<a name="sms-custom-templates-step2-automate-filters"></a>

Además de los [filtros](https://shopify.github.io/liquid/filters/abs/) y acciones estándar de Liquid, Ground Truth ofrece varios filtros adicionales. Los filtros se aplican colocando una barra vertical (`|`) después del nombre de la variable y luego especificando un nombre de filtro. Los filtros se pueden encadenar en forma de:

**Example**  

```
{{ <content> | <filter> | <filter> }}
```

### Autoescape y escape explícito
<a name="sms-custom-templates-step2-automate-filters-autoescape"></a>

De forma predeterminada, las entradas tendrán un escape de HTML para evitar que haya confusión entre el texto de la variable y HTML. Puede añadir de forma explícita el filtro `escape` para que sea más evidente para la persona que esté leyendo la fuente de la plantilla que se esta realizando un escape.

### escape\_once
<a name="sms-custom-templates-step2-automate-escapeonce"></a>

`escape_once` garantiza que si ya ha escapado el código, no se vuelva a realizar un escape encima de este. Por ejemplo, garantiza que &amp; no se convierta en &amp;amp;.

### skip\_autoescape
<a name="sms-custom-templates-step2-automate-skipautoescape"></a>

`skip_autoescape` es útil cuando se prevé utilizar el contenido como HTML. Por ejemplo, puede que tenga unos cuantos párrafos de texto y algunas imágenes en las instrucciones completas de un cuadro delimitador.

**`Usa skip_autoescape con moderación`**  
La práctica recomendada en el caso de las plantillas es evitar trasferir código funcional o de marcado con `skip_autoescape`, a menos que esté absolutamente seguro de que tiene un control estricto sobre lo que se transfiere. Si está pasando entradas de usuario, podría estar dejando a sus trabajadores desprotegidos ante un ataque de scripts de sitios.

### to\_json
<a name="sms-custom-templates-step2-automate-tojson"></a>

`to_json`codificará lo que introduzcas en JSON (Object Notation). JavaScript Si introduce un objeto, lo serializará.

### grant\_read\_access
<a name="sms-custom-templates-step2-automate-grantreadaccess"></a>

`grant_read_access` toma un URI de S3 y lo codifica en una URL de HTTPS con un token de acceso de duración limitada para dicho recurso. Esto permite mostrar a los trabajadores objetos de foto, audio o vídeo almacenados en buckets de S3 a los que, de lo contrario, no se podrían acceder públicamente.

### s3\_presign
<a name="sms-custom-templates-step2-automate-s3"></a>

 El filtro `s3_presign` funciona de la misma forma que el filtro `grant_read_access`. `s3_presign` toma un URI de Amazon S3 y lo codifica en una URL de HTTPS con un token de acceso de duración limitada para dicho recurso. Esto permite mostrar a los trabajadores objetos de foto, audio o vídeo almacenados en buckets de S3 a los que, de lo contrario, no se podría obtener acceso públicamente.

**Example de los filtros de variables**  
Input  

```
auto-escape: {{ "Have you read 'James & the Giant Peach'?" }}
explicit escape: {{ "Have you read 'James & the Giant Peach'?" | escape }}
explicit escape_once: {{ "Have you read 'James &amp; the Giant Peach'?" | escape_once }}
skip_autoescape: {{ "Have you read 'James & the Giant Peach'?" | skip_autoescape }}
to_json: {{ jsObject | to_json }}                
grant_read_access: {{ "s3://amzn-s3-demo-bucket/myphoto.png" | grant_read_access }}
s3_presign: {{ "s3://amzn-s3-demo-bucket/myphoto.png" | s3_presign }}
```

**Example**  
Output  

```
auto-escape: Have you read &#39;James &amp; the Giant Peach&#39;?
explicit escape: Have you read &#39;James &amp; the Giant Peach&#39;?
explicit escape_once: Have you read &#39;James &amp; the Giant Peach&#39;?
skip_autoescape: Have you read 'James & the Giant Peach'?
to_json: { "point_number": 8, "coords": [ 59, 76 ] }
grant_read_access: https://s3.amazonaws.com/amzn-s3-demo-bucket/myphoto.png?{{<access token and other params>}}
s3_presign: https://s3.amazonaws.com/amzn-s3-demo-bucket/myphoto.png?{{<access token and other params>}}
```

**Example de una plantilla de clasificación automatizada.**  
Para automatizar el ejemplo de clasificación de texto sencillo, sustituya el texto del tweet por una variable.  
La plantilla de clasificación de texto siguiente tiene automatización añadida. changes/additions Están resaltados en negrita.  

```
<script src="https://assets.crowd.aws/crowd-html-elements.js"></script>
<crowd-form>
  <crowd-classifier 
    name="tweetFeeling"
    categories="['positive', 'negative', 'neutral', 'cannot determine']"
    header="Which term best describes this tweet?" 
  >
    <classification-target>
       {{ task.input.source }}
    </classification-target>

    <full-instructions header="Analyzing a sentiment">
      Try to determine the feeling the author 
      of the tweet is trying to express. 
      If none seem to match, choose "other."
    </full-instructions>

    <short-instructions>
      Pick the term best describing the sentiment 
      of the tweet. 
    </short-instructions>

  </crowd-classifier>
</crowd-form>
```
Ahora el texto del tuit del ejemplo anterior se ha sustituido por un objeto. El objeto `entry.taskInput` utiliza `source` (u otro nombre que especifique en la función de Lambda previa a la anotación) como nombre de la propiedad para el texto y se inserta directamente en el HTML por estar entre llaves dobles.