|  | @@ -0,0 +1,89 @@
 | 
	
		
			
				|  |  | +from flask import request, Blueprint
 | 
	
		
			
				|  |  | +from flask_restful import Resource, Api
 | 
	
		
			
				|  |  | +import logging
 | 
	
		
			
				|  |  | +from bs4 import BeautifulSoup
 | 
	
		
			
				|  |  | +from models.config import HOMEPAGE_DIR, ROOM_PLANNER_DIR
 | 
	
		
			
				|  |  | +from models.utils.parsers import get_section_parser, SectionParser
 | 
	
		
			
				|  |  | +from models.utils.validators import is_valid_section
 | 
	
		
			
				|  |  | +from models.utils import read_line_md, write_md
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +manages_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:
 | 
	
		
			
				|  |  | +            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 = False
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class 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')
 |