mirror of
https://github.com/ONLYOFFICE/build_tools.git
synced 2026-04-07 14:06:31 +08:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 55f811af62 | |||
| 057f0bbbf6 | |||
| 67060cc66e | |||
| c5f6c2e02b | |||
| 71b912e7e6 | |||
| 6e7fd50583 | |||
| cf39498098 | |||
| 1f4e593943 | |||
| 3dfd22c735 | |||
| 0402a5a07a | |||
| dea91ca6f6 | |||
| 2fff3a7391 | |||
| 7c97a9b326 |
@ -68,8 +68,10 @@ def build_server_with_addons():
|
||||
for addon in addons:
|
||||
if (addon):
|
||||
addon_dir = base.get_script_dir() + "/../../" + addon
|
||||
if (base.is_exist(addon_dir)):
|
||||
if (base.is_exist(addon_dir + "/package.json")):
|
||||
base.print_info("npm ci: " + addon)
|
||||
base.cmd_in_dir(addon_dir, "npm", ["ci"])
|
||||
base.print_info("npm run build: " + addon)
|
||||
base.cmd_in_dir(addon_dir, "npm", ["run", "build"])
|
||||
|
||||
def build_server_develop():
|
||||
|
||||
@ -14,7 +14,7 @@ and Plugins (Methods/Events) API using the following Python scripts:
|
||||
|
||||
```bash
|
||||
Node.js v20 and above
|
||||
Python v3.10 and above
|
||||
Python v3.12 and above
|
||||
```
|
||||
|
||||
## Installation
|
||||
|
||||
@ -5,6 +5,7 @@ import shutil
|
||||
import argparse
|
||||
import generate_docs_json
|
||||
import json
|
||||
from pathlib import PurePosixPath
|
||||
|
||||
# Configuration files
|
||||
editors = {
|
||||
@ -22,11 +23,35 @@ root = os.path.abspath(os.path.join(os.path.dirname(script_path), '../../../../.
|
||||
missing_examples = []
|
||||
used_enumerations = set()
|
||||
translations = {}
|
||||
translations_lang = None
|
||||
missed_translations = {}
|
||||
used_translations_keys = {}
|
||||
|
||||
global_output_dir = ""
|
||||
cur_editor_name = None
|
||||
|
||||
def find_common_path_part(path_full: str, path_suffix: str, anchor: str) -> str:
|
||||
path_full = path_full.replace('\\', '/')
|
||||
path_suffix = path_suffix.replace('\\', '/')
|
||||
|
||||
parts1 = PurePosixPath(path_full).parts
|
||||
parts2 = PurePosixPath(path_suffix).parts
|
||||
|
||||
try:
|
||||
idx1 = [p.lower() for p in parts1].index(anchor.lower())
|
||||
idx2 = [p.lower() for p in parts2].index(anchor.lower())
|
||||
except ValueError:
|
||||
return ""
|
||||
|
||||
common_segments = []
|
||||
|
||||
for p1, p2 in zip(parts1[idx1:], parts2[idx2:]):
|
||||
if p1.lower() == p2.lower():
|
||||
common_segments.append(p1)
|
||||
else:
|
||||
break
|
||||
|
||||
return "/".join(common_segments)
|
||||
|
||||
def load_json(file_path):
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
@ -62,27 +87,22 @@ def process_link_tags(text, root=''):
|
||||
otherwise, a link to a class method is created.
|
||||
For a method, if an alias is not specified, the name is left in the format 'Class#Method'.
|
||||
"""
|
||||
reserved_links = {
|
||||
'/docbuilder/global#ShapeType': f"{'../../../../../../' if root == '' else '../../../../../' if root == '../' else root}docs/office-api/usage-api/text-document-api/Enumeration/ShapeType.md",
|
||||
'/plugin/config': 'https://api.onlyoffice.com/docs/plugin-and-macros/structure/configuration/',
|
||||
'/docbuilder/basic': 'https://api.onlyoffice.com/docs/office-api/usage-api/text-document-api/'
|
||||
}
|
||||
|
||||
|
||||
def replace_link(match):
|
||||
content = match.group(1).strip() # Example: "/docbuilder/global#ShapeType shape type" or "global#ErrorValue ErrorValue"
|
||||
content = match.group(1).strip() # Example: "global#ShapeType shape type" or "global#ErrorValue ErrorValue
|
||||
parts = content.split()
|
||||
ref = parts[0]
|
||||
label = parts[1] if len(parts) > 1 else None
|
||||
|
||||
if ref.startswith('/'):
|
||||
# Handle reserved links using mapping
|
||||
if ref in reserved_links:
|
||||
url = reserved_links[ref]
|
||||
display_text = label if label else ref
|
||||
return f"[{display_text}]({url})"
|
||||
else:
|
||||
# If the link is not in the mapping, return the original construction
|
||||
return match.group(0)
|
||||
if ref.startswith('/docs/'):
|
||||
url = root + '../../../..' + ref
|
||||
display_text = label if label else ref
|
||||
|
||||
if url.endswith('/'):
|
||||
last_dir = url.rstrip('/').split('/')[-1]
|
||||
url = f"{url}{last_dir}"
|
||||
|
||||
return f"[{display_text}]({url}.md)"
|
||||
elif ref.startswith("global#"):
|
||||
# Handle links to typedef (similar logic as before)
|
||||
typedef_name = ref.split("#")[1]
|
||||
@ -403,7 +423,7 @@ def generate_method_markdown(method, enumerations, classes, example_editor_name)
|
||||
# Separate comment and code, remove JS comments
|
||||
if '```js' in example:
|
||||
comment, code = example.split('```js', 1)
|
||||
comment = get_translation(remove_js_comments(comment))
|
||||
comment = get_translation(comment.strip())
|
||||
content += f"\n\n## {get_translation(f"Example")}\n\n{comment}\n\n```javascript {example_editor_name}\n{code.strip()}\n"
|
||||
else:
|
||||
# If there's no triple-backtick structure, just show it as code
|
||||
@ -481,7 +501,7 @@ def generate_enumeration_markdown(enumeration, enumerations, classes, example_ed
|
||||
if example:
|
||||
if '```js' in example:
|
||||
comment, code = example.split('```js', 1)
|
||||
comment = remove_js_comments(comment)
|
||||
comment = get_translation(comment.strip())
|
||||
content += f"\n\n## {get_translation(f"Example")}\n\n{comment}\n\n```javascript {example_editor_name}\n{code.strip()}\n"
|
||||
else:
|
||||
# If there's no triple-backtick structure
|
||||
@ -578,9 +598,13 @@ def process_doclets(data, output_dir, editor_name):
|
||||
|
||||
def generate(output_dir, translations_file):
|
||||
global translations
|
||||
global translations_lang
|
||||
global global_output_dir
|
||||
global_output_dir = output_dir
|
||||
|
||||
if translations_file is not None and os.path.exists(translations_file):
|
||||
translations = load_json(translations_file)
|
||||
translations_lang = os.path.splitext(os.path.basename(translations_file))[0]
|
||||
else:
|
||||
translations = {}
|
||||
|
||||
@ -639,9 +663,6 @@ if __name__ == "__main__":
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.translations is None:
|
||||
args.translations = args.destination + "/translations.json"
|
||||
|
||||
generate(args.destination, args.translations)
|
||||
print("START_MISSING_EXAMPLES")
|
||||
print(",".join(missing_examples))
|
||||
|
||||
@ -6,6 +6,7 @@ import shutil
|
||||
import argparse
|
||||
import generate_docs_events_json
|
||||
import json
|
||||
from pathlib import PurePosixPath
|
||||
|
||||
# Папки для каждого editor_name
|
||||
editors = {
|
||||
@ -22,8 +23,33 @@ root = os.path.abspath(os.path.join(os.path.dirname(script_path), '../../../../.
|
||||
missing_examples = []
|
||||
used_enumerations = set()
|
||||
translations = {}
|
||||
translations_lang = None
|
||||
missed_translations = {}
|
||||
used_translations_keys = {}
|
||||
global_output_dir = ""
|
||||
|
||||
def find_common_path_part(path_full: str, path_suffix: str, anchor: str) -> str:
|
||||
path_full = path_full.replace('\\', '/')
|
||||
path_suffix = path_suffix.replace('\\', '/')
|
||||
|
||||
parts1 = PurePosixPath(path_full).parts
|
||||
parts2 = PurePosixPath(path_suffix).parts
|
||||
|
||||
try:
|
||||
idx1 = [p.lower() for p in parts1].index(anchor.lower())
|
||||
idx2 = [p.lower() for p in parts2].index(anchor.lower())
|
||||
except ValueError:
|
||||
return ""
|
||||
|
||||
common_segments = []
|
||||
|
||||
for p1, p2 in zip(parts1[idx1:], parts2[idx2:]):
|
||||
if p1.lower() == p2.lower():
|
||||
common_segments.append(p1)
|
||||
else:
|
||||
break
|
||||
|
||||
return "/".join(common_segments)
|
||||
|
||||
def load_json(path):
|
||||
with open(path, 'r', encoding='utf-8') as f:
|
||||
@ -94,31 +120,22 @@ def process_link_tags(text, root=''):
|
||||
otherwise, a link to a class method is created.
|
||||
For a method, if an alias is not specified, the name is left in the format 'Class#Method'.
|
||||
"""
|
||||
reserved_links = {
|
||||
'/docbuilder/global#ShapeType': f"{'../../../../../../' if root == '' else '../../../../../' if root == '../' else root}docs/office-api/usage-api/text-document-api/Enumeration/ShapeType.md",
|
||||
'/plugin/config': 'https://api.onlyoffice.com/docs/plugin-and-macros/structure/configuration/',
|
||||
'/docbuilder/basic': 'https://api.onlyoffice.com/docs/office-api/usage-api/text-document-api/'
|
||||
}
|
||||
|
||||
|
||||
def replace_link(match):
|
||||
content = match.group(1).strip() # Example: "/docbuilder/global#ShapeType shape type" or "global#ErrorValue ErrorValue"
|
||||
content = match.group(1).strip() # Example: "global#ShapeType shape type" or "global#ErrorValue ErrorValue
|
||||
parts = content.split()
|
||||
ref = parts[0]
|
||||
label = parts[1] if len(parts) > 1 else None
|
||||
|
||||
if ref.startswith('/'):
|
||||
# Handle reserved links using mapping
|
||||
if ref in reserved_links:
|
||||
url = reserved_links[ref]
|
||||
display_text = label if label else ref
|
||||
return f"[{display_text}]({url})"
|
||||
elif ref.startswith('/docs/plugins/'):
|
||||
url = f"../../{ref.split('/docs/plugins/')[1]}.md"
|
||||
display_text = label if label else ref
|
||||
return f"[{display_text}]({url})"
|
||||
else:
|
||||
# If the link is not in the mapping, return the original construction
|
||||
return match.group(0)
|
||||
if ref.startswith('/docs/'):
|
||||
url = root + '../../../..' + ref
|
||||
display_text = label if label else ref
|
||||
|
||||
if url.endswith('/'):
|
||||
last_dir = url.rstrip('/').split('/')[-1]
|
||||
url = f"{url}{last_dir}"
|
||||
|
||||
return f"[{display_text}]({url}.md)"
|
||||
elif ref.startswith("global#"):
|
||||
# Handle links to typedef (similar logic as before)
|
||||
typedef_name = ref.split("#")[1]
|
||||
@ -179,7 +196,7 @@ def escape_text_outside_code_blocks(md):
|
||||
|
||||
def generate_event_markdown(event, enumerations):
|
||||
name = event['name']
|
||||
desc = correct_description(event.get('description', ''))
|
||||
desc = correct_description(event.get('description', ''), '../', True)
|
||||
params = event.get('params', [])
|
||||
|
||||
md = f"# {name}\n\n{desc}\n\n"
|
||||
@ -283,7 +300,7 @@ def generate_enumeration_markdown(enumeration, enumerations):
|
||||
# Attempt splitting if the user used ```js
|
||||
if '```js' in cleaned_example:
|
||||
comment, code = cleaned_example.split('```js', 1)
|
||||
comment = comment.strip()
|
||||
comment = get_translation(comment.strip())
|
||||
code = code.strip()
|
||||
if len(examples) > 1:
|
||||
content += f"**{get_translation("Example")} {i}:**\n\n{comment}\n\n"
|
||||
@ -308,7 +325,7 @@ def generate_events_summary(events):
|
||||
]
|
||||
lines = [
|
||||
f"| [{ev['name']}](./{ev['name']}.md) | "
|
||||
f"{correct_description(ev.get('description', ''), isInTable=True)} |\n"
|
||||
f"{correct_description(ev.get('description', ''), '../', isInTable=True)} |\n"
|
||||
for ev in sorted(events, key=lambda e: e['name'])
|
||||
]
|
||||
return "".join(header + lines)
|
||||
@ -395,9 +412,13 @@ def process_events(data, editor_dir):
|
||||
|
||||
def generate_events(output_dir, translations_file):
|
||||
global translations
|
||||
|
||||
global translations_lang
|
||||
global global_output_dir
|
||||
global_output_dir = output_dir
|
||||
|
||||
if translations_file is not None and os.path.exists(translations_file):
|
||||
translations = load_json(translations_file)
|
||||
translations_lang = os.path.splitext(os.path.basename(translations_file))[0]
|
||||
else:
|
||||
translations = {}
|
||||
|
||||
|
||||
@ -5,6 +5,7 @@ import shutil
|
||||
import argparse
|
||||
import generate_docs_methods_json
|
||||
import json
|
||||
from pathlib import PurePosixPath
|
||||
|
||||
# Configuration files
|
||||
editors = {
|
||||
@ -21,11 +22,35 @@ root = os.path.abspath(os.path.join(os.path.dirname(script_path), '../../../../.
|
||||
missing_examples = []
|
||||
used_enumerations = set()
|
||||
translations = {}
|
||||
translations_lang = None
|
||||
missed_translations = {}
|
||||
used_translations_keys = {}
|
||||
|
||||
global_output_dir = ""
|
||||
cur_editor_name = None
|
||||
|
||||
def find_common_path_part(path_full: str, path_suffix: str, anchor: str) -> str:
|
||||
path_full = path_full.replace('\\', '/')
|
||||
path_suffix = path_suffix.replace('\\', '/')
|
||||
|
||||
parts1 = PurePosixPath(path_full).parts
|
||||
parts2 = PurePosixPath(path_suffix).parts
|
||||
|
||||
try:
|
||||
idx1 = [p.lower() for p in parts1].index(anchor.lower())
|
||||
idx2 = [p.lower() for p in parts2].index(anchor.lower())
|
||||
except ValueError:
|
||||
return ""
|
||||
|
||||
common_segments = []
|
||||
|
||||
for p1, p2 in zip(parts1[idx1:], parts2[idx2:]):
|
||||
if p1.lower() == p2.lower():
|
||||
common_segments.append(p1)
|
||||
else:
|
||||
break
|
||||
|
||||
return "/".join(common_segments)
|
||||
|
||||
def load_json(file_path):
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
@ -61,36 +86,28 @@ def process_link_tags(text, root=''):
|
||||
otherwise, a link to a class method is created.
|
||||
For a method, if an alias is not specified, the name is left in the format 'Class#Method'.
|
||||
"""
|
||||
reserved_links = {
|
||||
'/docbuilder/global#ShapeType': f"{'../../../../../' if root == '' else '../../../../' if root == '../' else root}docs/office-api/usage-api/text-document-api/Enumeration/ShapeType.md",
|
||||
'/plugin/config': 'https://api.onlyoffice.com/docs/plugin-and-macros/structure/configuration/',
|
||||
'/docbuilder/basic': 'https://api.onlyoffice.com/docs/office-api/usage-api/text-document-api/'
|
||||
}
|
||||
|
||||
|
||||
def replace_link(match):
|
||||
content = match.group(1).strip() # Example: "/docbuilder/global#ShapeType shape type" or "global#ErrorValue ErrorValue"
|
||||
content = match.group(1).strip() # Example: "global#ShapeType shape type" or "global#ErrorValue ErrorValue
|
||||
parts = content.split()
|
||||
ref = parts[0]
|
||||
label = parts[1] if len(parts) > 1 else None
|
||||
|
||||
if ref.startswith('/'):
|
||||
# Handle reserved links using mapping
|
||||
if ref in reserved_links:
|
||||
url = reserved_links[ref]
|
||||
display_text = label if label else ref
|
||||
return f"[{display_text}]({url})"
|
||||
else:
|
||||
# If the link is not in the mapping, return the original construction
|
||||
return match.group(0)
|
||||
if ref.startswith('/docs/'):
|
||||
url = root + '../../../..' + ref
|
||||
display_text = label if label else ref
|
||||
|
||||
if url.endswith('/'):
|
||||
last_dir = url.rstrip('/').split('/')[-1]
|
||||
url = f"{url}{last_dir}"
|
||||
|
||||
return f"[{display_text}]({url}.md)"
|
||||
elif ref.startswith("global#"):
|
||||
# Handle links to typedef (similar logic as before)
|
||||
typedef_name = ref.split("#")[1]
|
||||
used_enumerations.add(typedef_name)
|
||||
display_text = label if label else typedef_name
|
||||
return f"[{display_text}]({root}Enumeration/{typedef_name}.md)"
|
||||
elif ref.startswith("https"):
|
||||
display_text = label if label else ref # Keep the full notation, e.g., "Api#CreateSlide"
|
||||
return f"[{display_text}]({ref})"
|
||||
else:
|
||||
# Handle links to class methods like ClassName#MethodName
|
||||
try:
|
||||
@ -422,7 +439,7 @@ def generate_method_markdown(method, enumerations, classes):
|
||||
# Attempt splitting if the user used ```js
|
||||
if '```js' in cleaned_example:
|
||||
comment, code = cleaned_example.split('```js', 1)
|
||||
comment = comment.strip()
|
||||
comment = get_translation(comment.strip())
|
||||
code = code.strip()
|
||||
if len(examples) > 1:
|
||||
content += f"**{get_translation("Example")} {i}:**\n\n{comment}\n\n"
|
||||
@ -447,7 +464,7 @@ def generate_properties_markdown(properties, enumerations, classes, root='../'):
|
||||
for prop in sorted(properties, key=lambda m: m['name']):
|
||||
prop_name = prop['name']
|
||||
prop_description = prop.get('description', 'No description provided.')
|
||||
prop_description = correct_description(prop_description, isInTable=True)
|
||||
prop_description = correct_description(prop_description, root, isInTable=True)
|
||||
prop_types = prop['type']['names'] if prop.get('type') else []
|
||||
param_types_md = generate_data_types_markdown(prop_types, enumerations, classes, root)
|
||||
content += f"| {prop_name} | {param_types_md} | {prop_description} |\n"
|
||||
@ -533,7 +550,7 @@ def generate_enumeration_markdown(enumeration, enumerations, classes):
|
||||
# Attempt splitting if the user used ```js
|
||||
if '```js' in cleaned_example:
|
||||
comment, code = cleaned_example.split('```js', 1)
|
||||
comment = comment.strip()
|
||||
comment = get_translation(comment.strip())
|
||||
code = code.strip()
|
||||
if len(examples) > 1:
|
||||
content += f"**{get_translation("Example")} {i}:**\n\n{comment}\n\n"
|
||||
@ -639,9 +656,13 @@ def process_doclets(data, output_dir, editor_name):
|
||||
|
||||
def generate(output_dir, translations_file):
|
||||
global translations
|
||||
global translations_lang
|
||||
global global_output_dir
|
||||
global_output_dir = output_dir
|
||||
|
||||
if translations_file is not None and os.path.exists(translations_file):
|
||||
translations = load_json(translations_file)
|
||||
translations_lang = os.path.splitext(os.path.basename(translations_file))[0]
|
||||
else:
|
||||
translations = {}
|
||||
|
||||
|
||||
54
tools/common/thumbnails_auto.py
Normal file
54
tools/common/thumbnails_auto.py
Normal file
@ -0,0 +1,54 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
sys.path.append('../../scripts')
|
||||
import base
|
||||
import os
|
||||
import glob
|
||||
from pathlib import Path
|
||||
|
||||
params = sys.argv[1:]
|
||||
|
||||
if (3 != len(params)):
|
||||
print("use: thumbnails_auto.py path_to_builder_directory path_to_input_files_directory path_to_output_files_directory")
|
||||
exit(0)
|
||||
|
||||
base.configure_common_apps()
|
||||
|
||||
directory_x2t = params[0].replace("\\", "/")
|
||||
directory_input = params[1].replace("\\", "/")
|
||||
directory_output = params[2].replace("\\", "/")
|
||||
|
||||
|
||||
if not os.path.exists(directory_output):
|
||||
os.mkdir(directory_output)
|
||||
|
||||
def rename_dir(input, output):
|
||||
if base.is_dir(u"" + directory_output + u"/" + output):
|
||||
base.delete_dir(u"" + directory_output + u"/" + output)
|
||||
os.rename(u"" + directory_output + u"/" + input, u"" + directory_output + u"/" + output)
|
||||
return
|
||||
|
||||
base.cmd("python", ["thumbnails_old.py", directory_x2t, directory_input, directory_output, "512", "724"])
|
||||
base.cmd("python", ["thumbnails_old.py", directory_x2t, directory_input, directory_output, "1024", "1448"])
|
||||
base.cmd("python", ["thumbnails_old.py", directory_x2t, directory_input, directory_output, "324", "458"])
|
||||
base.cmd("python", ["thumbnails_old.py", directory_x2t, directory_input, directory_output, "648", "916"])
|
||||
base.cmd("python", ["thumbnails_old.py", directory_x2t, directory_input, directory_output, "256", "368"])
|
||||
|
||||
base.cmd("python", ["thumbnails_old.py", directory_x2t, directory_input, directory_output, "400", "566"])
|
||||
base.cmd("python", ["thumbnails_old.py", directory_x2t, directory_input, directory_output, "184", "260"])
|
||||
#base.cmd("python", ["thumbnails.py", directory_x2t, directory_input, directory_output, "792", "1098"])
|
||||
|
||||
#rename_dir("[512x724]", "inside_1x_[512x724]")
|
||||
#rename_dir("[1024x1448]", "inside_2x_[1024x1448]")
|
||||
#rename_dir("[228x316]", "main_1x_[228x316]")
|
||||
#rename_dir("[456x632]", "main_2x_[456x632]")
|
||||
#rename_dir("[256x368]", "mobile_[256x368]")
|
||||
#rename_dir("[792x1098]", "source_[792x1098]")
|
||||
|
||||
dirnames = list(Path(directory_output).iterdir())
|
||||
for dir_name in dirnames:
|
||||
if len(list(Path(dir_name).iterdir())) == 0:
|
||||
print("Delete dir ", dir_name)
|
||||
Path(dir_name).rmdir()
|
||||
#base.delete_dir(dir_name)
|
||||
274
tools/common/thumbnails_old.py
Normal file
274
tools/common/thumbnails_old.py
Normal file
@ -0,0 +1,274 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
sys.path.append('../../scripts')
|
||||
import base
|
||||
import os
|
||||
import glob
|
||||
import imagesize
|
||||
import importlib.util
|
||||
from pathlib import Path
|
||||
from os.path import dirname, abspath, join
|
||||
|
||||
# Python 3 compatibility hack
|
||||
try:
|
||||
unicode('')
|
||||
except NameError:
|
||||
unicode = str
|
||||
|
||||
|
||||
params = sys.argv[1:]
|
||||
|
||||
if (5 != len(params)):
|
||||
print("use: thumbnails.py path_to_builder_directory path_to_input_files_directory path_to_output_files_directory width height")
|
||||
exit(0)
|
||||
|
||||
mapping = {"[512x724]": "inside_1x_[512x724]",
|
||||
"[1024x1448]": "inside_2x_[1024x1448]",
|
||||
"[228x316]": "main_1x_[228x316]",
|
||||
"[456x632]": "main_2x_[456x632]",
|
||||
"[256x368]": "mobile_[256x368]",
|
||||
"[792x1098]": "source_[792x1098]",
|
||||
"[324x458]": "main_1x_[324x458]",
|
||||
"[648x916]": "main_2x_[648x916]",
|
||||
"[400x566]": "pop_up_[400x566]",
|
||||
"[184x260]": "desktop[184x260]",
|
||||
}
|
||||
|
||||
cur_path = os.getcwd()
|
||||
base.configure_common_apps()
|
||||
|
||||
directory_x2t = params[0].replace("\\", "/")
|
||||
directory_input = params[1].replace("\\", "/")
|
||||
directory_output = params[2].replace("\\", "/")
|
||||
th_width = params[3]
|
||||
th_height = params[4]
|
||||
|
||||
docbuilder_path = os.path.join(directory_x2t, "docbuilder.py")
|
||||
if not os.path.isfile(docbuilder_path):
|
||||
print(f"ERROR: docbuilder.py not found in '{directory_x2t}'")
|
||||
exit(1)
|
||||
|
||||
spec = importlib.util.spec_from_file_location("docbuilder", docbuilder_path)
|
||||
docbuilder_mod = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(docbuilder_mod)
|
||||
|
||||
CDocBuilder = docbuilder_mod.CDocBuilder
|
||||
CDocBuilderValue = docbuilder_mod.CDocBuilderValue
|
||||
|
||||
#output_dir = directory_output + "/[" + str(th_width) + "x" + str(th_height) + "]"
|
||||
#if base.is_dir(output_dir):
|
||||
# base.delete_dir(output_dir)
|
||||
#base.create_dir(output_dir)
|
||||
|
||||
input_files = []
|
||||
for file in glob.glob(os.path.join(u"" + directory_input, u'*')):
|
||||
input_files.append(file.replace("\\", "/"))
|
||||
|
||||
#print(input_files)
|
||||
temp_dir = os.getcwd().replace("\\", "/") + "/temp"
|
||||
if base.is_dir(temp_dir):
|
||||
base.delete_dir(temp_dir)
|
||||
base.create_dir(temp_dir)
|
||||
|
||||
directory_fonts = directory_x2t + "/sdkjs/common"
|
||||
if not base.is_file(directory_fonts + "/AllFonts.js"):
|
||||
base.cmd_in_dir(directory_x2t, "docbuilder", [], True)
|
||||
|
||||
# # True for fit, False for 100%
|
||||
# isScaleSheetToPage = False
|
||||
#
|
||||
# json_fit_text = "0"
|
||||
# if isScaleSheetToPage:
|
||||
# json_fit_text = "1"
|
||||
#
|
||||
# #json_params += "'fitToWidth':" + json_fit_text + ",'fitToHeight':" + json_fit_text + ","
|
||||
# if isScaleSheetToPage:
|
||||
# json_params = "{'spreadsheetLayout':{'fitToWidth':1,'fitToHeight':1},"
|
||||
# else:
|
||||
# json_params = "{'spreadsheetLayout':{'fitToWidth':0,'fitToHeight':0},"
|
||||
# json_params += "'documentLayout':{'drawPlaceHolders':true,'drawFormHighlight':true,'isPrint':true}}"
|
||||
# json_params = json_params.replace("'", """)
|
||||
|
||||
|
||||
json_params = "{"
|
||||
|
||||
json_params += "'spreadsheetLayout':{"
|
||||
|
||||
# True for fit, False for 100%
|
||||
isScaleSheetToPage = False
|
||||
|
||||
json_fit_text = "0"
|
||||
if isScaleSheetToPage:
|
||||
json_fit_text = "1"
|
||||
|
||||
json_params += "'fitToWidth':" + json_fit_text + ",'fitToHeight':" + json_fit_text + ","
|
||||
|
||||
if True:
|
||||
json_params += "'orientation':'landscape',"
|
||||
|
||||
page_margins = "'pageMargins':{'bottom':10,'footer':5,'header':5,'left':5,'right':5,'top':10}"
|
||||
page_setup = "'pageSetup':{'orientation':1,'width':210,'height':297,'paperUnits':0,'scale':190," \
|
||||
"'printArea':false,'horizontalDpi':600,'verticalDpi':600,'usePrinterDefaults':true,'fitToHeight':1,'fitToWidth':1}"
|
||||
|
||||
json_params += "'sheetsProps':{'0':{'headings':false,'printTitlesWidth':null,'printTitlesHeight':null," + page_margins + "," + page_setup + "}}},"
|
||||
|
||||
json_params += "'documentLayout':{'drawPlaceHolders':true,'drawFormHighlight':true,'isPrint':true},"
|
||||
json_params += "'ignorePrintArea':'false'"
|
||||
json_params += "}"
|
||||
json_params = json_params.replace("'", """)
|
||||
|
||||
if not os.path.exists(directory_output):
|
||||
os.mkdir(directory_output)
|
||||
|
||||
output_len = len(input_files)
|
||||
output_cur = 1
|
||||
for input_file in input_files:
|
||||
if os.path.isdir(input_file):
|
||||
next_dir_name = os.path.basename(input_file)
|
||||
base.cmd("python", ["thumbnails_old.py", directory_x2t, input_file, os.path.join(directory_output, next_dir_name), th_width, th_height])
|
||||
if base.is_dir(temp_dir):
|
||||
base.delete_dir(temp_dir)
|
||||
base.create_dir(temp_dir)
|
||||
continue
|
||||
print("process [" + str(output_cur) + " of " + str(output_len) + "]: " + str(input_file.encode("utf-8")))
|
||||
|
||||
width_page = th_width
|
||||
height_page = th_height
|
||||
|
||||
json_params_file = json_params
|
||||
|
||||
if input_file.lower().endswith('.xlsx'):
|
||||
temp_dir_builder = directory_output + "/temp_builder"
|
||||
if base.is_dir(temp_dir_builder):
|
||||
base.delete_dir(temp_dir_builder)
|
||||
base.create_dir(temp_dir_builder)
|
||||
builder = CDocBuilder()
|
||||
builder.SetTmpFolder(temp_dir_builder)
|
||||
|
||||
builder.OpenFile(input_file)
|
||||
context = builder.GetContext()
|
||||
globalObj = context.GetGlobal()
|
||||
|
||||
cmd = """
|
||||
(function(){
|
||||
Api.getPrintAreaSize = function() {
|
||||
return { Width:0, Height:0 };
|
||||
};
|
||||
var sheet = Api.GetSheets()[0];
|
||||
var usedRange = sheet.GetUsedRange();
|
||||
|
||||
var maxCol = -1;
|
||||
var maxRow = -1;
|
||||
usedRange.ForEach(function (cell) {
|
||||
if (cell.GetRowHeight() === 0 || cell.GetColumnWidth() === 0) {
|
||||
return;
|
||||
}
|
||||
var row0 = cell.GetRow() - 1;
|
||||
var col0 = cell.GetCol() - 1;
|
||||
var hasContent = false;
|
||||
var val = cell.GetValue();
|
||||
if (val !== "" && val !== null && val !== undefined) {
|
||||
hasContent = true;
|
||||
}
|
||||
if (!hasContent) {
|
||||
var formula = cell.GetFormula();
|
||||
if (typeof formula === 'string' && formula.indexOf("=") === 0) {
|
||||
hasContent = true;
|
||||
}
|
||||
}
|
||||
if (hasContent) {
|
||||
if (col0 > maxCol) maxCol = col0;
|
||||
if (row0 > maxRow) maxRow = row0;
|
||||
}
|
||||
});
|
||||
if (maxRow < 0 || maxCol < 0) {
|
||||
return;
|
||||
}
|
||||
var printRange = sheet.GetRange(
|
||||
sheet.GetRangeByNumber(0, 0),
|
||||
sheet.GetRangeByNumber(maxRow, maxCol)
|
||||
);
|
||||
Api.getPrintAreaSize = function() {
|
||||
return { Width:printRange.Width, Height:printRange.Height };
|
||||
};})();
|
||||
"""
|
||||
|
||||
builder.ExecuteCommand(cmd)
|
||||
api = globalObj['Api']
|
||||
|
||||
sizeWH = api.getPrintAreaSize()
|
||||
wPrint = sizeWH.Get("Width").ToDouble()
|
||||
hPrint = sizeWH.Get("Height").ToDouble()
|
||||
|
||||
print("CELL (printSize): " + str(wPrint) + "x" + str(hPrint))
|
||||
|
||||
if (wPrint > 1 and hPrint > wPrint):
|
||||
tmp = width_page
|
||||
width_page = height_page
|
||||
height_page = tmp
|
||||
json_params_file = json_params_file.replace(""width":210,"height":297", ""width":297,"height":210")
|
||||
|
||||
builder.CloseFile()
|
||||
base.delete_dir(temp_dir_builder)
|
||||
|
||||
output_dir = os.path.join(directory_output,
|
||||
os.path.splitext(os.path.basename(input_file))[0])
|
||||
#output_dir = str(output_dir.encode("utf8"))
|
||||
output_dir = abspath(unicode(output_dir))
|
||||
if not os.path.exists(output_dir):
|
||||
os.mkdir(output_dir)
|
||||
output_dir = os.path.join(output_dir,
|
||||
mapping["[" + str(th_width) + "x" + str(th_height) + "]"])
|
||||
#output_dir = str(output_dir.encode("utf8"))
|
||||
#output_dir = dirname(abspath(unicode(output_dir)))
|
||||
output_dir = abspath(unicode(output_dir))
|
||||
if not os.path.exists(output_dir):
|
||||
os.mkdir(output_dir)
|
||||
output_file = output_dir # os.path.join(output_dir, os.path.splitext(os.path.basename(input_file))[0])
|
||||
xml_convert = u"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
||||
xml_convert += u"<TaskQueueDataConvert>"
|
||||
xml_convert += (u"<m_sFileFrom>" + input_file + u"</m_sFileFrom>")
|
||||
xml_convert += (u"<m_sFileTo>" + output_file + u".zip</m_sFileTo>")
|
||||
xml_convert += u"<m_nFormatTo>1029</m_nFormatTo>"
|
||||
xml_convert += (u"<m_sAllFontsPath>" + directory_fonts + u"/AllFonts.js</m_sAllFontsPath>")
|
||||
xml_convert += (u"<m_sFontDir>" + directory_fonts + u"</m_sFontDir>")
|
||||
xml_convert += (u"<m_sJsonParams>" + json_params_file + u"</m_sJsonParams>")
|
||||
xml_convert += u"<m_nDoctParams>1</m_nDoctParams>"
|
||||
xml_convert += u"<m_oThumbnail>"
|
||||
xml_convert += u"<first>false</first>"
|
||||
|
||||
if ((0 != width_page) and (0 != height_page)):
|
||||
xml_convert += u"<aspect>16</aspect>"
|
||||
xml_convert += (u"<width>" + str(width_page) + u"</width>")
|
||||
xml_convert += (u"<height>" + str(height_page) + u"</height>")
|
||||
xml_convert += u"</m_oThumbnail>"
|
||||
xml_convert += u"<m_nDoctParams>1</m_nDoctParams>"
|
||||
xml_convert += (u"<m_sTempDir>" + temp_dir + u"</m_sTempDir>")
|
||||
xml_convert += u"</TaskQueueDataConvert>"
|
||||
base.save_as_script(temp_dir + "/to.xml", [xml_convert])
|
||||
base.cmd_in_dir(directory_x2t, "x2t", [temp_dir + "/to.xml"], True)
|
||||
base.delete_dir(temp_dir)
|
||||
base.create_dir(temp_dir)
|
||||
base.extract_unicode(output_file + u".zip", output_file)
|
||||
if os.path.exists(output_file + ".zip"):
|
||||
try:
|
||||
base.delete_file(output_file + ".zip")
|
||||
except:
|
||||
print("Error in deletin file: ", output_file + ".zip")
|
||||
output_cur += 1
|
||||
#output_file = output_file.replace("\\", "/")
|
||||
#imnames = Path(output_file).glob("*.png")#glob.glob("/" + output_file.replace(":", "") + "/*.png")
|
||||
imnames = [str(pp) for pp in Path(output_file).glob("*.png")]
|
||||
#print(output_file + "/*.png", imnames)
|
||||
#continue
|
||||
if len(imnames) == 0:
|
||||
base.delete_dir(output_file)
|
||||
else:
|
||||
width, height = imagesize.get(imnames[0])
|
||||
print("WxH: ", width, height)
|
||||
if width < height and False: #удалить вертикальные превью
|
||||
base.delete_dir(output_file)
|
||||
|
||||
base.delete_dir(temp_dir)
|
||||
os.chdir(cur_path)
|
||||
Reference in New Issue
Block a user