import codecs import json def text_process(arr): new_arr = [] new_arr.append(f"## **{arr.pop(0)}**") for _ in range(4): del arr[0] stek = [] p = False li_c = False li = False li_c2 = False for s in arr: if "Пример" in s: if p: new_arr.append(f"|||{'<br>'.join(stek).rstrip('<br>')}") else: new_arr.append("<br>".join(stek).rstrip("<br>")) p = True stek = [] new_arr.append(f"### **{s}**") elif p: if s == "Ввод\tВывод": if stek: new_arr.append(f"|||{'<br>'.join(stek).rstrip('<br>')}") new_arr.append("<br>".join(stek).rstrip("<br>")) stek = [] new_arr.append("|Ввод |Вывод|") new_arr.append("|-----|-----|") else: stek.append(s) elif s == "Формат ввода" or s == "Формат вывода" or s == "Примечание": new_arr.append("<br>".join(stek).rstrip("<br>")) stek = [] new_arr.append(f"### **{s}**") else: if s and s[-1] == ":": li_c = True stek.append(s) elif li_c: li_c = False if s == "": li = True new_arr.append("<br>".join(stek) + "<br>") stek = [] elif li: if not li_c2: if s[-1] == ";": li_c2 = True else: li = False stek.append(s) if li_c2: new_arr.append(f"* {s}") if s[-1] == ".": li = False new_arr.append("") li_c2 = False else: stek.append(s) new_arr.append(f"|||{'<br>'.join(stek[:-1]).rstrip('<br>')}") input_count = stek[-1] if len(input_count.split()) > 1: input_count = [int(i) for i in input_count.split()] elif input_count != "_": input_count = int(input_count) c = 0 for i in range(len(new_arr)): if new_arr[i][:3] == "|||": data = new_arr[i][3:].split("<br>") if input_count == "_": data = f"|{'<br>'.join(data)}||" elif isinstance(input_count, list): in_c = input_count[c] if in_c > 0: if 2 * in_c > len(data): data = f"|{'<br>'.join(data[:in_c])}<br>|{'<br>'.join(data[in_c:])}<br>{'<br>'.join([' '] * (2 * in_c - len(data)))}<br>|" elif 2 * in_c == len(data): data = f"|{'<br>'.join(data[:in_c])}<br>|{'<br>'.join(data[in_c:])}<br>|" else: data = f"|{'<br>'.join(data[:in_c])}<br>{'<br>'.join([' '] * (len(data) - 2 * in_c))}<br>|{'<br>'.join(data[in_c:])}<br>|" else: if -2 * in_c > len(data): data = f"|{'<br>'.join(data[:len(data) + in_c])}<br>{'<br>'.join([' '] * (-2 * in_c - len(data)))}<br>|{'<br>'.join(data[:-1 * in_c])}<br>|" elif -2 * in_c == len(data): data = f"|{'<br>'.join(data[:-1 * in_c])}<br>|{'<br>'.join(data[-1 * in_c:])}<br>|" else: data = f"|{'<br>'.join(data[:len(data) + in_c])}<br>|{'<br>'.join(data[len(data) + in_c:])}<br>{'<br>'.join([' '] * (len(data) - -2 * in_c))}<br>|" c += 1 elif input_count > 0: if 2 * input_count > len(data): data = f"|{'<br>'.join(data[:input_count])}<br>|{'<br>'.join(data[input_count:])}<br>{'<br>'.join([' '] * (2 * input_count - len(data)))}<br>|" elif 2 * input_count == len(data): data = f"|{'<br>'.join(data[:input_count])}<br>|{'<br>'.join(data[input_count:])}<br>|" else: data = f"|{'<br>'.join(data[:input_count])}<br>{'<br>'.join([' '] * (len(data) - 2 * input_count))}<br>|{'<br>'.join(data[input_count:])}<br>|" else: if -2 * input_count > len(data): data = f"|{'<br>'.join(data[:len(data) + input_count])}<br>{'<br>'.join([' '] * (-2 * input_count - len(data)))}<br>|{'<br>'.join(data[:-1 * input_count])}<br>|" elif -2 * input_count == len(data): data = f"|{'<br>'.join(data[:-1 * input_count])}<br>|{'<br>'.join(data[-1 * input_count:])}<br>|" else: data = f"|{'<br>'.join(data[:len(data) + input_count])}<br>|{'<br>'.join(data[len(data) + input_count:])}<br>{'<br>'.join([' '] * (len(data) - -2 * input_count))}<br>|" new_arr[i] = data for i in range(len(new_arr)): if new_arr[i] and (new_arr[i][0] == "|" or new_arr[i][0] == "#"): continue elems = new_arr[i].split("<br>") # ВЫДЕЛАЕТ ОТДЕЛЬНЫЕ БУКВЫ del_ind = [] for j in range(len(elems) - 1): if len(elems[j]) == 1 and elems[j] == elems[j + 1][0]: del_ind.append(j) if del_ind: for j in del_ind[::-1]: if j: buff = elems.pop(j + 1) if elems[j - 1][-1] == ".": elems[j] = "$" + buff[0] + "$" + buff[1:] else: elems[j - 1] = elems[j - 1] + "$" + buff[0] + "$" + buff[1:] del elems[j] # ВЫДЕЛЯЕТ ВЫРАЖЕНИЯ del_ind = [] for j in range(len(elems)): if not elems[j]: continue string = elems[j].split() first_word = string[0] if len(first_word) <= j and ''.join(elems[j - len(first_word):j]) == first_word: f = False signs = ["+", "-", "*", "/", "%", "=", "<", ">", "≤", "≥"] for sign in signs: if sign in first_word: f = True if not f: continue del_ind.append([count for count in range(j - len(first_word), j)]) if del_ind: for j in del_ind[::-1]: ind = j[-1] + 1 buff = elems[ind].split() if elems[j[0] - 1][-1] == ".": elems[ind] = "$" + buff[0] + "$ " + " ".join(buff[1:]) for k in j[::-1]: if k: del elems[k] else: elems[j[0] - 1] = elems[j[0] - 1] + "$" + buff[0] + "$ " + ' '.join(buff[1:]) del elems[ind] for k in j[::-1]: if k: del elems[k] # ВЫДЕЛЯЕТ ДРУГИЕ ВЫРАЖЕНИЯ del_ind = [] for j in range(len(elems) - 1): if not elems[j]: continue eq = elems[j].split()[0] f = False signs = ["+", "-", "*", "/", "%", "=", "<", ">", "≤", "≥"] for num in range(10): signs.append(str(num)) for sign in signs: if sign in eq: f = True if not f or len(eq) == 1: continue if ")" in eq: eq = eq[:eq.index(")")] if " " in eq: eq = eq[:-1] if elems[j - 1] == elems[j + 1]: f = False for ind in range(j - 3, -1, -1): if eq == "".join(elems[ind:j - 1]): f = True break if not f: continue del_ind.append([count for count in range(ind, j - 1)] + [j - 1, False]) else: f = False for ind in range(j - 2, -1, -1): if eq == "".join(elems[ind:j]): f = True break if not f: continue del_ind.append([count for count in range(ind, j)] + [True]) if del_ind: for j in del_ind[::-1]: if j[-1]: buff = elems.pop(j[-2] + 1) if ")" in buff: ind = buff.index(")") elems[j[0] - 1] = elems[j[0] - 1] + "$" + buff[:ind] + "$" + buff[ind:] else: elems[j[0] - 1] = elems[j[0] - 1] + "$" + buff + "$" for k in j[::-1][1:]: del elems[k] else: buff = elems.pop(j[-2] + 1) elems[j[0] - 1] = elems[j[0] - 1] + "$" + buff[:-1] + "^" + elems[j[-2]] + "$" elems[j[0] - 1] = elems[j[0] - 1] + elems[j[-2] + 2][1:] del elems[j[-2] + 2] del elems[j[-2] + 1] del elems[j[-2]] for k in j[::-1][2:]: del elems[k] # ДЕЛАЕТ $x_i$ del_ind = [] for j in range(len(elems) - 4): if [elems[j] + " ", elems[j + 1]] == [elems[j + 2], elems[j + 3]] and elems[j + 4] == "\u200b": del_ind.append([j, j + 1]) if del_ind: for j in del_ind[::-1]: if j: buff = f"${elems[j[0]]}_{elems[j[1]]}$" if j[0] != 0: elems[j[0] - 1] = elems[j[0] - 1] + buff + elems[j[1] + 4][1:] else: elems[j[0]] = buff + elems[j[1] + 4][1:] for count in range(4, -1, -1): del elems[j[1] + count] if j[0] != 0: del elems[j[0]] new_arr[i] = "<br>".join(elems) return new_arr f = codecs.open("2.4/24.ipynb", 'r', encoding="utf-8") source = f.read() y = json.loads(source) f.close() inp_data = open("md.txt", encoding="utf-8") arr = [] tarr = [] for i in inp_data: if i == "/py\n": arr.append(tarr) tarr = [] elif i == "/md\n": arr.append(tarr) tarr = [] else: tarr.append(i.strip("\n")) arr.append(tarr) del arr[0] data = {'cells':[], 'metadata': {'kernelspec': {'display_name': 'Python 3', 'language': 'python', 'name': 'python3'}, 'language_info': {'name': 'python', 'version': '3.11.1'}}, 'nbformat': 4, 'nbformat_minor': 2} arr1, arr2 = arr[:len(arr) // 2], arr[len(arr) // 2:] task_ammount = int(input("Введите количество заданий: ")) for i in range(0, 2 * task_ammount - 1, 2): arr[i] = arr1[i // 2] arr[i + 1] = arr2[i // 2] # print(*arr, sep="\n") for i in range(len(arr)): if i % 2 == 0: py_data = {'cell_type': 'markdown', 'metadata': {}, 'source': [],} new_arr = text_process(arr[i]) for s in new_arr: py_data['source'] += [s] else: py_data = {'cell_type': 'code', 'execution_count': None, 'metadata': {}, 'outputs': [], 'source': [],} for s in arr[i]: py_data['source'] += [s] data['cells'] += [py_data] with open('output.ipynb', 'w') as file: # Write the JSON data to the file json.dump(data, file) file.close()