Browse Source

add ManageData for api/manages/data endpoint

weichen 3 years ago
parent
commit
91d2c8e0bb
1 changed files with 89 additions and 0 deletions
  1. 89 0
      models/manages/routes.py

+ 89 - 0
models/manages/routes.py

@@ -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')