45 lines
1.8 KiB
Python
45 lines
1.8 KiB
Python
from typing import Union
|
|
import numpy as np
|
|
|
|
from interpreter import imageFunctions as imageWrapper
|
|
from interpreter import colors as colors
|
|
from interpreter import movementFunctions as movement
|
|
from interpreter import tokens as tokens
|
|
from interpreter import errors as errors
|
|
from interpreter.dataStructures import edge
|
|
|
|
|
|
def edgeToToken(image: np.ndarray, inputEdge: edge) -> Union[tokens.baseLexerToken, BaseException]:
|
|
"""
|
|
This function creates a token based on the given edge
|
|
:param image: input image
|
|
:param inputEdge: an edge containing (coords, direction)
|
|
:return: Either a newly created token, or an exception
|
|
"""
|
|
if not imageWrapper.boundsChecker(image, inputEdge.edge[0]):
|
|
return IndexError("Edge position {} is not in image".format(inputEdge.edge[0]))
|
|
|
|
nextPosition = movement.getNextPosition(inputEdge.edge[0], inputEdge.edge[1].pointers[0])
|
|
if not imageWrapper.boundsChecker(image, nextPosition):
|
|
return tokens.toBlackToken("edge")
|
|
|
|
pixel = imageWrapper.getPixel(image, nextPosition)
|
|
|
|
if colors.isBlack(pixel):
|
|
return tokens.toBlackToken("toBlack")
|
|
|
|
if colors.isWhite(pixel):
|
|
return tokens.toWhiteToken()
|
|
|
|
if not colors.isColor(pixel):
|
|
return tokens.toBlackToken("Unknown color")
|
|
|
|
colorChange = colors.getPixelChange(imageWrapper.getPixel(image, inputEdge.edge[0]), imageWrapper.getPixel(image, nextPosition))
|
|
if isinstance(colorChange, BaseException):
|
|
# Modify existing error message with location
|
|
newText = "{} at position {}".format(colorChange.args[0], nextPosition)
|
|
return errors.UnknownColorError(newText)
|
|
|
|
tokenType = tokens.getTokenType(colorChange['hueChange'], colorChange['lightChange'])
|
|
return tokens.toColorToken(tokenType, len(imageWrapper.getCodel(image, inputEdge.edge[0]).codel))
|