Advertisement
nicuf

backup

Oct 3rd, 2023
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.38 KB | None | 0 0
  1. import os
  2. import re
  3. import docx
  4. import unidecode
  5. import unicodedata
  6. from docx import Document
  7. from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
  8.  
  9. # Funcția pentru adăugarea conținutului la tag-ul meta
  10. def add_content_to_meta(html_content, content_to_add):
  11. meta_pattern = r'<meta name="description" content="(.*?)">'
  12. match = re.search(meta_pattern, html_content)
  13. if match:
  14. old_meta_tag = match.group(0)
  15.  
  16. # Elimină ghilimelele din conținutul tag-ului meta
  17. new_content = re.sub(r'"', '', content_to_add)
  18.  
  19. new_meta_tag = f'<meta name="description" content="{new_content}">'
  20. updated_html_content = html_content.replace(old_meta_tag, new_meta_tag)
  21. return updated_html_content
  22. else:
  23. return html_content
  24.  
  25. # Funcția pentru conversia stilurilor paragrafelor din DOCX în HTML
  26. def extract_data_from_docx(file_path):
  27. doc = Document(file_path)
  28. content = ""
  29.  
  30. # Parcurge toate paragrafele din document și le adaugă la conținut
  31. for paragraph in doc.paragraphs:
  32. content += paragraph.text + "\n"
  33.  
  34. # Utilizăm regex pentru a găsi titlurile și corpul fiecărui articol
  35. # Am modificat regex-ul pentru a include ghilimele
  36. articles = re.split(r'^([A-Z][\w\s’\-\(\)""]+)$', content, flags=re.MULTILINE | re.DOTALL)
  37.  
  38. articles = [article.strip() for article in articles if article.strip()]
  39.  
  40. data = []
  41.  
  42. # Iterăm prin lista de articole pentru a extrage titlul și corpul corespunzător
  43. for i in range(0, len(articles), 2):
  44. title = articles[i]
  45. body = articles[i + 1].strip().split("\n")
  46. data.append((title, body))
  47.  
  48. return data
  49.  
  50. # Funcția pentru înlocuirea diacriticelor cu echivalente HTML
  51. def replace_diacritics_with_html_entities(text):
  52. # Creează un dicționar cu caracterele diacritice și echivalentele lor HTML
  53.  
  54. diacritics_mapping = {
  55. 'ă': '&abreve;',
  56. 'â': '&acirc;',
  57. 'ș': '&scedil;',
  58. 'ț': '&tcedil;',
  59. 'î': '&icirc;',
  60. 'â': '&acirc;',
  61. 'ș': '&scedil;',
  62. 'ț': '&tcedil;',
  63. 'ă': '&abreve;',
  64. 'î': '&icirc;',
  65. 'â': '&acirc;',
  66. 'ț': '&tcedil;',
  67. 'ș': '&scedil;',
  68. 'â': '&acirc;',
  69. 'ă': '&abreve;',
  70. 'ș': '&scedil;',
  71. 'ț': '&tcedil;',
  72. 'î': '&icirc;',
  73. 'î': '&icirc;',
  74. 'â': '&acirc;',
  75. 'ă': '&abreve;',
  76. 'ș': '&scedil;',
  77. 'ț': '&tcedil;',
  78. 'î': '&icirc;',
  79. 'â': '&acirc;',
  80. 'ă': '&abreve;',
  81. 'ș': '&scedil;',
  82. 'ț': '&tcedil;',
  83. 'î': '&icirc;',
  84. 'ș': '&scedil;',
  85. 'ț': '&tcedil;',
  86. 'â': '&acirc;',
  87. 'ă': '&abreve;',
  88. 'î': '&icirc;',
  89. 'â': '&acirc;',
  90. 'ș': '&scedil;',
  91. 'ț': '&tcedil;',
  92. 'Ă': '&Abreve;',
  93. 'Â': '&Acirc;',
  94. 'Ș': '&Scedil;',
  95. 'Ț': '&Tcedil;',
  96. 'Î': '&Icirc;',
  97. 'Î': '&Icirc;',
  98. 'Â': '&Acirc;',
  99. 'Ă': '&Abreve;',
  100. 'Ș': '&Scedil;',
  101. 'Ț': '&Tcedil;',
  102. }
  103.  
  104. # Înlocuiește caracterele diacritice cu echivalentele lor HTML
  105. for diacritic, html_entity in diacritics_mapping.items():
  106. text = text.replace(diacritic, html_entity)
  107.  
  108. return text
  109.  
  110. def run_get_style(run) -> str:
  111. if run.bold:
  112. return "bold"
  113. elif run.italic:
  114. return "italic"
  115. else:
  116. return "normal"
  117.  
  118. def convert_docx_to_html_with_styles(document: docx.Document, output_file: str) -> None:
  119. with open(output_file, "w") as f:
  120. f.write("<html>\n<body>\n")
  121. current_style = None
  122.  
  123. for paragraph in document.paragraphs:
  124. runs = paragraph.runs
  125. if not runs:
  126. continue
  127.  
  128. for run in runs:
  129. run_style = run_get_style(run)
  130. print(f"Run text: {run.text}, Style: {run_style}") # Adăugăm instrucțiunea de print pentru debug
  131.  
  132. if run_style == current_style:
  133. if run.bold:
  134. f.write("<b>")
  135. if run.italic:
  136. f.write("<em>")
  137. f.write(run.text)
  138. else:
  139. if current_style:
  140. if current_style == "bold":
  141. f.write("</b>")
  142. if current_style == "italic":
  143. f.write("</em>")
  144. if run.bold:
  145. f.write("<b>")
  146. if run.italic:
  147. f.write("<em>")
  148.  
  149. f.write(run.text)
  150. current_style = run_style
  151.  
  152. if current_style:
  153. if current_style == "bold":
  154. f.write("</b>")
  155. if current_style == "italic":
  156. f.write("</em>")
  157. current_style = None
  158.  
  159. f.write("<br>\n") # Adăugăm un salt de linie între paragrafe
  160.  
  161. f.write("</body>\n</html>")
  162.  
  163.  
  164.  
  165. # Funcția pentru generarea numelui de fișier bazat pe titlu
  166. def generate_filename(title):
  167. # Îndepărtează spațiile și caracterele speciale din titlu
  168. title = title.strip()
  169. title = re.sub(r'’s|’t', '', title)
  170. title = re.sub(r'[^\w\s-]', '', title) # Înlocuiește caracterele speciale cu "" (nimic) în loc de "-"
  171. title = re.sub(r'[-\s]+', '-', title) # Îndepărtează secvențele consecutive de "-" și spații
  172.  
  173. # Transformă titlul în litere mici
  174. title = title.lower()
  175.  
  176. # Transformă diacriticele în litere normale
  177. title = ''.join(c for c in unicodedata.normalize('NFD', title) if unicodedata.category(c) != 'Mn')
  178.  
  179. # Asigură că numele fișierului are o extensie .html
  180. filename = title + ".html"
  181. print("Filename:", filename) # Afișează numele fișierului
  182. return filename
  183.  
  184.  
  185. # Funcția pentru formatarea titlului cu litere mari în fiecare cuvânt
  186. def format_title(title):
  187. words = title.split()
  188. formatted_words = [word.capitalize() for word in words]
  189. formatted_title = " ".join(formatted_words)
  190. return formatted_title
  191.  
  192. # Funcția pentru actualizarea și salvarea fișierelor HTML
  193. def update_and_save_html(title, body, template_path, output_directory):
  194. with open(template_path, "r", encoding="utf-8") as f:
  195. html_content = f.read()
  196.  
  197. # Eliminarea sufixului " | Neculai Fantanaru (en)" din titlu
  198. title_without_suffix = title.replace(" | Neculai Fantanaru", "")
  199.  
  200. # Formatează titlul cu prima literă mare în fiecare cuvânt
  201. formatted_title = format_title(title_without_suffix)
  202.  
  203. # Înlocuirea titlului în tagul <h1> cu titlul fără sufix
  204. html_content = html_content.replace('<h1 class="den_articol" itemprop="name">XXX</h1>', f'<h1 class="den_articol" itemprop="name">{formatted_title}</h1>')
  205.  
  206. # Înlocuirea titlului în conținutul HTML
  207. new_title = title + " | Neculai Fantanaru"
  208. html_content = html_content.replace("XXX", new_title, 2)
  209. print("Titlul a fost înlocuit.")
  210.  
  211. # Formatează titlul pentru tag-ul <title> cu prima literă mare în fiecare cuvânt
  212. formatted_title_words = [word.capitalize() for word in new_title.split()]
  213. formatted_title_for_title_tag = ' '.join(formatted_title_words)
  214.  
  215. # Înlocuirea titlului în tag-ul <title>
  216. html_content = re.sub(r'<title>.*?</title>', f'<title>{formatted_title_for_title_tag}</title>', html_content)
  217.  
  218.  
  219. # Extrage conținutul paragrafelor cu clasa "text_obisnuit2"
  220. content_to_add = ""
  221. paragraphs = re.findall(r'<p class="text_obisnuit2">(.*?)</p>', html_content)
  222. for paragraph in paragraphs:
  223. content_to_add += paragraph.strip() + ' '
  224.  
  225. # Elimină tag-urile <em> din conținutul adăugat
  226. content_to_add_cleaned = re.sub(r'<em>(.*?)</em>', r'\1', content_to_add)
  227.  
  228. # Înlocuiește caracterele diacritice cu echivalentele lor HTML în conținutul paragrafelor
  229. for i in range(len(body)):
  230. body[i] = replace_diacritics_with_html_entities(body[i])
  231.  
  232. # Adaugă conținutul curățat la tag-ul meta
  233. updated_html_content = add_content_to_meta(html_content, content_to_add_cleaned)
  234.  
  235. # Elimină linia care conține <!-- SASA-1 --> din conținutul HTML
  236. updated_html_content = updated_html_content.replace("<!-- SASA-1 -->", "")
  237.  
  238. # Elimină linia care conține <!-- SASA-2 --> din conținutul HTML
  239. updated_html_content = updated_html_content.replace("<!-- SASA-2 -->", "")
  240.  
  241. # Actualizează fișierul HTML cu conținutul adăugat
  242. html_file_path = os.path.join(output_directory, generate_filename(title))
  243. with open(html_file_path, "w", encoding="utf-8") as updated_html_file:
  244. updated_html_file.write(updated_html_content)
  245.  
  246. print("Conținutul a fost adăugat la tag-ul meta în fiecare fișier HTML, eliminând tag-urile <em>.")
  247.  
  248. # Găsirea poziției de început și sfârșit a blocului YYY
  249. start_marker = "<!-- SASA-1 -->"
  250. end_marker = "<!-- SASA-2 -->"
  251. start = html_content.find(start_marker)
  252. end = html_content.find(end_marker)
  253.  
  254. if start != -1 and end != -1:
  255. # Înlocuirea blocului YYY cu conținutul articolului, respectând formatarea cerințelor
  256. article_content = ""
  257. first_sentence = True
  258. for line in body:
  259. line = line.strip()
  260. # Începe prima propoziție cu <p class="text_obisnuit2">
  261. if first_sentence:
  262. article_content += f'\n\t<p class="text_obisnuit2"><em>{line}</em></p>'
  263. first_sentence = False
  264. elif line.startswith("Leadership:"):
  265. article_content += f'\n\t<p class="text_obisnuit2">{line}</p>'
  266. else:
  267. article_content += f'\n\t<p class="text_obisnuit">{line}</p>'
  268. html_content = html_content[:start + len(start_marker)] + article_content + html_content[end:]
  269. print("Corpul articolului a fost înlocuit conform cerințelor.")
  270.  
  271. # Integrarea stilurilor de paragrafe din DOCX în HTML
  272. doc = Document("bebe.docx")
  273. convert_docx_to_html_with_styles(doc, html_file_path)
  274. # html_content = html_content.replace("<p class=\"text_obisnuit\">{}</p>".format(para.text), html_style)
  275.  
  276. # Eliminarea caracterelor speciale folosind unidecode
  277. html_content = unidecode.unidecode(html_content)
  278.  
  279. # Crearea numelui de fișier bazat pe titlu
  280. filename = generate_filename(title)
  281.  
  282. # Înlocuirea "zzz.html" cu numele fișierului generat în fiecare fișier HTML
  283. html_content = html_content.replace("zzz.html", filename)
  284.  
  285. # Salvarea modificărilor în UTF-8
  286. with open(os.path.join(output_directory, filename), "w", encoding="utf-8") as f:
  287. f.write(html_content)
  288. print(f"Fișierul a fost salvat ca {filename}")
  289.  
  290.  
  291.  
  292.  
  293. # Extragem datele din bebe.docx
  294. articles_data = extract_data_from_docx("bebe.docx")
  295.  
  296. # Specifică directorul în care dorești să salvezi fișierele HTML
  297. output_directory = "output"
  298.  
  299. # Funcția pentru eliminarea marcatorilor SASA
  300. def remove_sasa_markers(html_content):
  301. # Găsește poziția de început a <!-- SASA-1 -->
  302. start_marker = "<!-- SASA-1 -->"
  303. start = html_content.find(start_marker)
  304. print(f"Poziția de început a <!-- SASA-1 -->: {start}")
  305.  
  306. # Găsește poziția de sfârșit a <!-- SASA-2 -->
  307. end_marker = "<!-- SASA-2 -->"
  308. end = html_content.find(end_marker)
  309. print(f"Poziția de sfârșit a <!-- SASA-2 -->: {end}")
  310.  
  311. # Verifică dacă ambele marcatori au fost găsiți
  312. if start != -1 and end != -1:
  313. # Elimină întreaga secțiune care conține marcatorii
  314. removed_content = html_content[:start] + html_content[end + len(end_marker):]
  315. return removed_content
  316. else:
  317. # Dacă unul dintre marcatori lipsește, returnează conținutul original
  318. return html_content
  319.  
  320. # Actualizăm și salvăm fiecare articol într-un fișier HTML separat
  321. for title, body in articles_data:
  322. update_and_save_html(title, body, "index-ro.html", output_directory)
  323. # Deschide fișierul HTML pentru actualizare
  324. html_file_path = os.path.join(output_directory, generate_filename(title))
  325. with open(html_file_path, "r", encoding="utf-8") as html_file:
  326. html_content = html_file.read()
  327.  
  328. # Colectează conținutul paragrafelor cu clasa "text_obisnuit2"
  329. content_to_add = ""
  330. paragraphs = re.findall(r'<p class="text_obisnuit2">(.*?)</p>', html_content)
  331. for paragraph in paragraphs:
  332. content_to_add += paragraph.strip() + ' '
  333.  
  334. # Elimină tag-urile <em> din conținutul adăugat
  335. content_to_add_cleaned = re.sub(r'<em>(.*?)</em>', r'\1', content_to_add)
  336.  
  337. # Adaugă conținutul curățat la tag-ul meta
  338. updated_html_content = add_content_to_meta(html_content, content_to_add_cleaned)
  339.  
  340. # Elimină linia care conține <!-- SASA-1 --> din conținutul HTML
  341. updated_html_content = updated_html_content.replace("<!-- SASA-1 -->", "")
  342.  
  343. # Elimină linia care conține <!-- SASA-2 --> din conținutul HTML
  344. updated_html_content = updated_html_content.replace("<!-- SASA-2 -->", "")
  345.  
  346. # Actualizează fișierul HTML cu conținutul adăugat
  347. with open(html_file_path, "w", encoding="utf-8") as updated_html_file:
  348. updated_html_file.write(updated_html_content)
  349.  
  350. print("Conținutul a fost adăugat la tag-ul meta în fiecare fișier HTML, eliminând tag-urile <em>.")
  351.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement