| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | from flask import request, Blueprintfrom flask_restful import Resource, Apiimport loggingfrom bs4 import BeautifulSoupfrom models.config import HOMEPAGE_DIR, ROOM_PLANNER_DIRfrom models.utils.parsers import get_section_parser, SectionParserfrom models.utils.validators import is_valid_sectionfrom models.utils import read_line_md, write_mdmanages_app = Blueprint('manages', __name__)api = Api(manages_app)logger = logging.getLogger(__name__)DIR = {'home': HOMEPAGE_DIR, 'room_planner': ROOM_PLANNER_DIR}class RequiredData():    def __init__(self):        self.is_amp_img, self.is_amp_youtube = False, False    def load(self, section_data, text):        if '<b' in text:            soup = BeautifulSoup(text, "html.parser")            section_data.setdefault('b', []).append(soup.b.string)        elif '<a ' in text and '</a>' in text:            soup = BeautifulSoup(text, "html.parser")            section_data.setdefault('a', []).append(soup.a.string)        elif '<p' in text:            soup = BeautifulSoup(text, "html.parser")            section_data.setdefault('p', []).append(soup.p.string)        elif '<amp-img' in text:            self.is_amp_img = True        elif '<amp-youtube' in text:            self.is_amp_youtube = True        elif 'card-text' in text:            soup = BeautifulSoup(text, "html.parser")            section_data.setdefault('card_text', []).append(soup.div.string)        elif 'title mb' in text:            soup = BeautifulSoup(text, "html.parser")            section_data.setdefault('title_mb_text', []).append(soup.div.string)        if self.is_amp_img:            if 'src' in text:                src = text.split('src=')[-1].replace('"', '').replace('\n', '')                section_data.setdefault('img', []).append({'src': src})            if '</amp-img' in text:                self.is_amp_img = False        elif self.is_amp_youtube:            if 'data-videoid' in text:                videoid = text.split('data-videoid')[-1].replace('"', '').replace('\n', '')                section_data.setdefault('yt_video', []).append({'videoid': videoid})            if '</amp-youtube' in text:                self.is_amp_youtube = Falseclass ManageData(Resource):    def get(self):        result = []        require_data = RequiredData()        for line in read_line_md(DIR.get(request.args.get('page', type=str), [])):            if '<section' in line:                soup = BeautifulSoup(line, "html.parser")                section_class = '_'.join(soup.find_all(class_=True)[0]['class'])                result.append({'sectionClass': section_class})            elif not result:                # for skip the line before fist section                continue            else:                require_data.load(result[-1], line)        return result    def post(self):        is_target_class_section = False        content = ''        section_parser = SectionParser(request.json)        for line in read_line_md(DIR.get(request.args.get('page', type=str), [])):            if is_target_class_section:                if '</section>' in line:                    is_target_class_section = False                content = section_parser.update(content, line)            else:                content += line            if is_valid_section(request.args.get('section', type=str), line):                is_target_class_section = True                section_parser = get_section_parser(                    request.args.get('section', type=str))(request.json)        write_md(DIR.get(request.args.get('page', type=str)), content)        return {'content': content}api.add_resource(ManageData, '/api/manages/data')
 |