2018-05-28 00:27:11 +02:00
/ * *
* @ author tlwr [ toby @ toby . codes ]
* @ copyright Crown Copyright 2017
* @ license Apache - 2.0
* /
import { fromBase64 , toBase64 } from "../lib/Base64" ;
import { fromHex } from "../lib/Hex" ;
import Operation from "../Operation" ;
2018-05-29 00:42:43 +02:00
import OperationError from "../errors/OperationError" ;
2018-05-28 00:27:11 +02:00
import Utils from "../Utils" ;
2018-12-18 18:44:42 +01:00
import { detectFileType } from "../lib/FileType" ;
2018-05-28 00:27:11 +02:00
/ * *
* Render Image operation
* /
class RenderImage extends Operation {
/ * *
* RenderImage constructor
* /
constructor ( ) {
super ( ) ;
this . name = "Render Image" ;
this . module = "Image" ;
this . description = "Displays the input as an image. Supports the following formats:<br><br><ul><li>jpg/jpeg</li><li>png</li><li>gif</li><li>webp</li><li>bmp</li><li>ico</li></ul>" ;
this . inputType = "string" ;
2018-08-09 20:17:24 +02:00
this . outputType = "byteArray" ;
this . presentType = "html" ;
2018-05-28 00:27:11 +02:00
this . args = [
{
"name" : "Input format" ,
"type" : "option" ,
"value" : [ "Raw" , "Base64" , "Hex" ]
}
] ;
this . patterns = [
{
"match" : "^(?:\\xff\\xd8\\xff|\\x89\\x50\\x4e\\x47|\\x47\\x49\\x46|.{8}\\x57\\x45\\x42\\x50|\\x42\\x4d)" ,
"flags" : "" ,
2018-05-29 00:42:43 +02:00
"args" : [ "Raw" ] ,
2018-05-28 00:27:11 +02:00
"useful" : true
}
] ;
}
/ * *
* @ param { string } input
* @ param { Object [ ] } args
* @ returns { html }
* /
run ( input , args ) {
const inputFormat = args [ 0 ] ;
2018-08-09 20:17:24 +02:00
if ( ! input . length ) return [ ] ;
2018-05-28 00:27:11 +02:00
// Convert input to raw bytes
switch ( inputFormat ) {
case "Hex" :
input = fromHex ( input ) ;
break ;
case "Base64" :
// Don't trust the Base64 entered by the user.
// Unwrap it first, then re-encode later.
input = fromBase64 ( input , undefined , "byteArray" ) ;
break ;
case "Raw" :
default :
input = Utils . strToByteArray ( input ) ;
break ;
}
// Determine file type
2018-12-18 18:44:42 +01:00
const types = detectFileType ( input ) ;
if ( ! ( types . length && types [ 0 ] . mime . indexOf ( "image" ) === 0 ) ) {
2018-08-09 20:17:24 +02:00
throw new OperationError ( "Invalid file type" ) ;
}
return input ;
}
/ * *
* Displays the image using HTML for web apps .
*
* @ param { byteArray } data
* @ returns { html }
* /
async present ( data ) {
if ( ! data . length ) return "" ;
let dataURI = "data:" ;
// Determine file type
2018-12-18 18:44:42 +01:00
const types = detectFileType ( data ) ;
if ( types . length && types [ 0 ] . mime . indexOf ( "image" ) === 0 ) {
dataURI += types [ 0 ] . mime + ";" ;
2018-05-28 00:27:11 +02:00
} else {
2018-05-29 00:42:43 +02:00
throw new OperationError ( "Invalid file type" ) ;
2018-05-28 00:27:11 +02:00
}
// Add image data to URI
2018-08-09 20:17:24 +02:00
dataURI += "base64," + toBase64 ( data ) ;
2018-05-28 00:27:11 +02:00
return "<img src='" + dataURI + "'>" ;
}
}
export default RenderImage ;