random

- collection of un-sorted bollocks
git clone git://git.acid.vegas/random.git
Log | Files | Refs | Archive

commit d85993469f6332a07a575d8885eb32324af567e0
parent a68a59bf5e6cb64bfdf97a5ed2ac34df193b7ade
Author: acidvegas <acid.vegas@acid.vegas>
Date: Thu, 18 May 2023 18:18:06 -0400

Ascii to png script added

Diffstat:
Airc/ascii2png.py | 167+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

1 file changed, 167 insertions(+), 0 deletions(-)

diff --git a/irc/ascii2png.py b/irc/ascii2png.py
@@ -0,0 +1,166 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Scroll IRC Art Bot - Developed by acidvegas in Python (https://acid.vegas/scroll)
+# ascii2png.py
+
+'''
+Credits to VXP for making the original "pngbot" script (https://github.com/lalbornoz/MiRCARTools)
+'''
+
+import os
+import urllib.request
+
+from PIL import Image, ImageDraw, ImageFont
+
+def flip_cell_state(cellState, bit):
+	if cellState & bit:
+		return cellState & ~bit
+	else:
+		return cellState | bit
+
+def parse_char(colourSpec, curColours):
+	if len(colourSpec) > 0:
+		colourSpec = colourSpec.split(',')
+		if len(colourSpec) == 2 and len(colourSpec[1]) > 0:
+			return (int(colourSpec[0] or curColours[0]), int(colourSpec[1]))
+		elif len(colourSpec) == 1 or len(colourSpec[1]) == 0:
+			return (int(colourSpec[0]), curColours[1])
+	else:
+		return (15, 1)
+
+def ascii_png(url):
+	text_file = os.path.join('data','temp.txt')
+	if os.path.isfile(text_file):
+		os.remove(text_file)
+	urllib.request.urlretrieve(url, text_file)
+	data = open(text_file)
+	inCurColourSpec = ''
+	inCurRow = -1
+	inLine = data.readline()
+	inSize = [0, 0]
+	inMaxCols = 0
+	outMap = []
+	while inLine:
+		inCellState = 0x00
+		inParseState = 1
+		inCurCol = 0
+		inMaxCol = len(inLine)
+		inCurColourDigits = 0
+		inCurColours = (15, 1)
+		inCurColourSpec = ''
+		inCurRow += 1
+		outMap.append([])
+		inRowCols = 0
+		inSize[1] += 1
+		while inCurCol < inMaxCol:
+			inChar = inLine[inCurCol]
+			if inChar in set('\r\n'):
+				inCurCol += 1
+			elif inParseState == 1:
+				inCurCol += 1
+				if inChar == '':
+					inCellState = flip_cell_state(inCellState, 0x01)
+				elif inChar == '':
+					inParseState = 2
+				elif inChar == '':
+					inCellState = flip_cell_state(inCellState, 0x02)
+				elif inChar == '':
+					inCellState |= 0x00
+					inCurColours = (15, 1)
+				elif inChar == '':
+					inCurColours = (inCurColours[1], inCurColours[0])
+				elif inChar == '':
+					inCellState = flip_cell_state(inCellState, 0x04)
+				else:
+					inRowCols += 1
+					outMap[inCurRow].append([*inCurColours, inCellState, inChar])
+			elif inParseState == 2 or inParseState == 3:
+				if inChar == ',' and inParseState == 2:
+					if (inCurCol + 1) < inMaxCol and not inLine[inCurCol + 1] in set('0123456789'):
+						inCurColours = parse_char(inCurColourSpec, inCurColours)
+						inCurColourDigits = 0
+						inCurColourSpec = ''
+						inParseState = 1
+					else:
+						inCurCol += 1
+						inCurColourDigits = 0
+						inCurColourSpec += inChar
+						inParseState = 3
+				elif inChar in set('0123456789') and inCurColourDigits == 0:
+					inCurCol += 1
+					inCurColourDigits += 1
+					inCurColourSpec += inChar
+				elif inChar in set('0123456789') and inCurColourDigits == 1 and inCurColourSpec[-1] == '0':
+					inCurCol += 1
+					inCurColourDigits += 1
+					inCurColourSpec += inChar
+				elif inChar in set('012345') and inCurColourDigits == 1 and inCurColourSpec[-1] == '1':
+					inCurCol += 1
+					inCurColourDigits += 1
+					inCurColourSpec += inChar
+				else:
+					inCurColours = parse_char(inCurColourSpec, inCurColours)
+					inCurColourDigits = 0
+					inCurColourSpec = ''
+					inParseState = 1
+		inMaxCols = max(inMaxCols, inRowCols)
+		inLine = data.readline()
+	inSize[0] = inMaxCols
+	canvas_data = outMap
+	numRowCols = 0
+	for numRow in range(len(outMap)):
+		numRowCols = max(numRowCols, len(outMap[numRow]))
+	for numRow in range(len(outMap)):
+		if len(outMap[numRow]) != numRowCols:
+			for numColOff in range(numRowCols - len(outMap[numRow])):
+				outMap[numRow].append([1,1,0,' '])
+		outMap[numRow].insert(0,[1,1,0,' '])
+		outMap[numRow].append([1,1,0,' '])
+	outMap.insert(0,[[1,1,0,' ']] * len(outMap[0]))
+	outMap.append([[1,1,0,' ']] * len(outMap[0]))
+	inCanvasMap = outMap
+	outImgFont = ImageFont.truetype(os.path.join('data','DejaVuSansMono.ttf'), 11)
+	outImgFontSize = [*outImgFont.getsize(' ')]
+	outImgFontSize[1] += 3
+	ColorsBold   = [[255,255,255],[85,85,85],[85,85,255],[85,255,85],[255,85,85],[255,85,85],[255,85,255],[255,255,85],[255,255,85],[85,255,85],[85,255,255],[85,255,255],[85,85,255],[255,85,255],[85,85,85],[255,255,255]]
+	ColorsNormal = [[255,255,255],[0,0,0],[0,0,187],[0,187,0],[255,85,85],[187,0,0],[187,0,187],[187,187,0],[255,255,85],[85,255,85],[0,187,187],[85,255,255],[85,85,255],[255,85,255],[85,85,85],[187,187,187]]
+	inSize = (len(inCanvasMap[0]), len(inCanvasMap))
+	outSize = [a*b for a,b in zip(inSize, outImgFontSize)]
+	outCurPos = [0, 0]
+	outImg = Image.new('RGBA', outSize, (*ColorsNormal[1], 255))
+	outImgDraw = ImageDraw.Draw(outImg)
+	for inCurRow in range(len(inCanvasMap)):
+		for inCurCol in range(len(inCanvasMap[inCurRow])):
+			inCurCell = inCanvasMap[inCurRow][inCurCol]
+			outColours = [0, 0]
+			if inCurCell[2] & 0x01:
+				if inCurCell[3] != ' ':
+					if inCurCell[3] == '█':
+						outColours[1] = ColorsNormal[inCurCell[0]]
+					else:
+						outColours[0] = ColorsBold[inCurCell[0]]
+						outColours[1] = ColorsNormal[inCurCell[1]]
+				else:
+					outColours[1] = ColorsNormal[inCurCell[1]]
+			else:
+				if inCurCell[3] != ' ':
+					if inCurCell[3] == '█':
+						outColours[1] = ColorsNormal[inCurCell[0]]
+					else:
+						outColours[0] = ColorsNormal[inCurCell[0]]
+						outColours[1] = ColorsNormal[inCurCell[1]]
+				else:
+					outColours[1] = ColorsNormal[inCurCell[1]]
+			outImgDraw.rectangle((*outCurPos,outCurPos[0] + outImgFontSize[0], outCurPos[1] + outImgFontSize[1]), fill=(*outColours[1], 255))
+			if  not inCurCell[3] in ' █' and outColours[0] != outColours[1]:
+				outImgDraw.text(outCurPos,inCurCell[3], (*outColours[0], 255), outImgFont)
+			if inCurCell[2] & 0x04:
+				outColours[0] = ColorsNormal[inCurCell[0]]
+				outImgDraw.line(xy=(outCurPos[0], outCurPos[1] + (outImgFontSize[1] - 2), outCurPos[0] + outImgFontSize[0], outCurPos[1] + (outImgFontSize[1] - 2)), fill=(*outColours[0], 255))
+			outCurPos[0] += outImgFontSize[0]
+		outCurPos[0] = 0
+		outCurPos[1] += outImgFontSize[1]
+	out_file = os.path.join('data','temp.png')
+	if os.path.isfile(out_file):
+		os.remove(out_file)
+	outImg.save(out_file)
+\ No newline at end of file