Toggle Navigation
Hatchery
Eggs
MD reader legacy
reader.py
Users
Badges
Login
Register
MCH2022 badge?
go to mch2022.badge.team
reader.py
raw
Content
import ugfx, easydraw, system, badge ugfx.init() ugfx.clear(ugfx.BLACK) ugfx.flush() ugfx.clear(ugfx.WHITE) ugfx.flush() ugfx.orientation(0) screen_size = (ugfx.width()-15,ugfx.height()) max_onscreen = 10 # 10 lines is max that can fit on screen font_types = ( ("Roboto_Regular12", 12, 45), ("Roboto_Regular18", 18, 33), ("Roboto_Regular22", 22, 20)) ugfx.input_init() ugfx.input_attach(ugfx.JOY_DOWN, lambda pressed: move_view("down", pressed)) ugfx.input_attach(ugfx.JOY_UP, lambda pressed: move_view("up", pressed)) ugfx.input_attach(ugfx.JOY_LEFT, lambda pressed: move_view("left", pressed)) ugfx.input_attach(ugfx.JOY_RIGHT, lambda pressed: move_view("right", pressed)) ugfx.input_attach(ugfx.BTN_START, lambda pressed: quit(pressed)) def quit(pressed): if pressed: system.home() def get_string_width(string, font_id): return ugfx.get_string_width(string, font_types[font_id][0]) def parse_input_line(input_line, breaking_mode): if input_line.startswith("###"): font_id = 0 elif input_line.startswith("##"): font_id = 1 elif input_line.startswith("#"): font_id = 2 else: font_id = 0 input_line = input_line.lstrip("#") if breaking_mode=="experimental": smallletters=['ijl !1t():\'.,'] halfletters=['IJT[]'] words=input_line.split(" ") sentencelen=0 sentence="" output_lines=[] output_fonts = [font_id] for word in words: wordlen=2 for letter in word: if letter in smallletters: wordlen+=2 elif letter in halfletters: wordlen+=4 else: wordlen+=6 if sentencelen+wordlen<screen_size[0]: sentencelen+=wordlen sentence=sentence+" "+word if len(sentence) else word else: output_fonts += [font_id] output_lines+=[sentence] sentencelen=wordlen sentence=word output_lines+=[sentence] elif breaking_mode=="better": output_lines = [""] output_fonts = [font_id] counter = 0 current_width = 0 for char in input_line: current_char_width = get_string_width(char, font_id) if current_width + current_char_width < screen_size[0]: output_lines[counter] += char current_width += current_char_width else: output_lines += [char] output_fonts += [font_id] counter += 1 current_width = 0 elif breaking_mode == "worse": output_lines = [] output_fonts = [] length = font_types[font_id][2] while input_line: if len(input_line) >= length: output_lines += [input_line[:length]] output_fonts += [font_id] input_line = input_line[length:] else: output_lines += [input_line] output_fonts += [font_id] input_line = "" else: raise ValueError("this breaking mode does not exist") return output_lines, output_fonts def create_view(start_position, action): global view,parsed_lines,parsed_fonts,article_length ugfx.clear(ugfx.WHITE) steps = 0 if action == "next": current_height = 0, font_types[parsed_fonts[start_position]][1] while current_height[1] <= screen_size[1] and steps+start_position < article_length: ugfx.string( 5, current_height[0], parsed_lines[start_position+steps].strip(), font_types[parsed_fonts[start_position+steps]][0], ugfx.BLACK) steps += 1 current_height = (current_height[1], current_height[1] + font_types[parsed_fonts[start_position+steps]][1]) view = (start_position, start_position + steps) elif action == "prev": current_height = 0, font_types[parsed_fonts[start_position]][1] while current_height[1] <= screen_size[1] and steps+start_position > 0: ugfx.string( 5, screen_size[1] - current_height[1], parsed_lines[start_position+steps].strip(), font_types[parsed_fonts[start_position+steps]][0], ugfx.BLACK) steps -= 1 current_height = (current_height[1], current_height[1] + font_types[parsed_fonts[start_position+steps]][1]) view = (start_position+steps, start_position) else: raise ValueError("this action doesn't exist") ugfx.flush() return view def move_view(button_direction, pressed): global view,article_length,start,max_onscreen,f,eof if pressed: if button_direction == "down": start_position = view[0]+1 action = "next" elif button_direction == "up": start_position = view[0]-1 action = "next" elif button_direction == "right": start_position = view[1] action = "next" elif button_direction == "left": start_position = view[0] action = "prev" else: raise ValueError("this direction doesn't exist") if start_position <= 0: start_position = 0 action = "next" elif start_position >= article_length: start_position = article_length action= "prev" if start_position + max_onscreen >= article_length: if f: ugfx.fill_circle(291, 5, 10, ugfx.BLACK) ugfx.flush() if not eof: if not read_data(): eof = True print('EOF') else: print('File not yet read!') print("scroll: " + str(start_position)+" "+str(article_length)) view = create_view(start_position, action) def read(path, render="experimental", begin = 0, lines = 15): global view,start,read_lines,breaking_mode,parsed_lines,parsed_fonts,article_length,f,eof,first_run,file start = begin read_lines = lines breaking_mode = render parsed_lines = [] parsed_fonts = [] article_length = 0 eof = False first_run = True file = path easydraw.messageCentered("Loading "+path+"\nFrom "+str(start)+" to "+str(start+lines), True, "/media/busy.png") try: f = open(path,mode = 'r',encoding = 'utf-8') easydraw.messageCentered("Rendering", True, "/media/ok.png") read_data() view = create_view(0, "next") except BaseException as e: import sys,system sys.print_exception(e) system.home() def read_data(): global start,start_position,read_lines,breaking_mode,parsed_lines,parsed_fonts,article_length,f,first_run,file badge.nvs_set_u16('md_reader', file.replace('/', '_')[-15:], start) data_read = False print("data: "+str(start)+" "+str(read_lines)) for i, raw_line in enumerate(f): if first_run and i < start: pass else: data_read = True temp_parsed_lines, temp_parsed_fonts = parse_input_line(raw_line, breaking_mode) parsed_lines += temp_parsed_lines parsed_fonts += temp_parsed_fonts if i > read_lines: article_length = len(parsed_lines) start += i break first_run = False return data_read