forked from mindspore-Ecosystem/mindspore
103 lines
3.8 KiB
Python
Executable File
103 lines
3.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# encoding: utf-8
|
|
# Copyright 2020 Huawei Technologies Co., Ltd
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
# ============================================================================
|
|
import sys
|
|
import math
|
|
|
|
MIN_CHARS_PER_ROW = 20 # minimal number of chars on one line
|
|
COLS_TO_ROWS_RATIO = 4 # ratio of # columns to # rows (unit is char)
|
|
MAX_LABEL_LENGTH = 1000 # maximal number of chars of a label
|
|
|
|
|
|
# for specified number of chars, calculate a suitable number for how many chars per row
|
|
# Num Total Chars : n
|
|
# Num Chars Per Row : m
|
|
# Num Rows : k
|
|
# (k - 1) * m < n <= k * m
|
|
# suppose: m / k = u
|
|
# ==> sqrt(u * n) <= m < u / 2 + sqrt(u * n + u * u / 4)
|
|
# m = max(20, m)
|
|
# parameters:
|
|
# @total_chars number of total chars
|
|
# @ratio ratio of # columns to # rows (unit is char)
|
|
def calc_num_chars_per_row(total_chars, ratio):
|
|
chars_per_row = math.ceil(math.sqrt(total_chars * ratio))
|
|
return max(MIN_CHARS_PER_ROW, chars_per_row)
|
|
|
|
|
|
def process_label_text(text):
|
|
label_len = min(len(text), MAX_LABEL_LENGTH)
|
|
chars_per_row = calc_num_chars_per_row(label_len, COLS_TO_ROWS_RATIO)
|
|
if label_len <= MIN_CHARS_PER_ROW:
|
|
return text
|
|
beg_idx = 0
|
|
texts = []
|
|
while beg_idx < label_len:
|
|
end_idx = beg_idx + chars_per_row
|
|
if end_idx >= label_len:
|
|
texts.append(text[beg_idx:label_len])
|
|
else:
|
|
texts.append(text[beg_idx:end_idx])
|
|
beg_idx = end_idx
|
|
return "\\n".join(texts)
|
|
|
|
|
|
# insert '\n' to labels which are too long
|
|
def process_file(f):
|
|
line_text = f.readline()
|
|
beg_idx = -1 # label begin index, index of 'label="'
|
|
end_idx = -1 # label end index, index of '"'
|
|
label_text = ""
|
|
label_prefix = ""
|
|
label_postfix = ""
|
|
while line_text:
|
|
line_text = line_text.rstrip()
|
|
|
|
if beg_idx < 0:
|
|
beg_idx = line_text.find('label="')
|
|
if beg_idx >= 0:
|
|
end_idx = line_text.find('"', beg_idx + len('label="'))
|
|
if end_idx >= 0: # the full label text is on one line
|
|
label = line_text[beg_idx + len('label="'):end_idx]
|
|
print('%slabel="%s"%s' % (line_text[0:beg_idx], process_label_text(label), line_text[end_idx + 1:]))
|
|
beg_idx = -1 # reset to initial conditions
|
|
else: # the label text is distributed on multiple lines
|
|
label_prefix = line_text[0:beg_idx]
|
|
label_text = line_text[beg_idx + len('label="'):]
|
|
else:
|
|
print(line_text)
|
|
else:
|
|
end_idx = line_text.find('"')
|
|
if end_idx >= 0:
|
|
label_text = label_text + line_text[0:end_idx]
|
|
label_postfix = line_text[end_idx + 1:]
|
|
print('%slabel="%s"%s' % (label_prefix, process_label_text(label_text), label_postfix))
|
|
beg_idx = -1 # reset to initial conditions
|
|
else:
|
|
label_text += line_text
|
|
|
|
# print(f'{len(line_text)} - {line_text}')
|
|
line_text = f.readline()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) > 1 and sys.argv[1] == "--help":
|
|
print("Usage: %s < dotfile | dot -Tpng -o filename.png" % sys.argv[0])
|
|
sys.exit()
|
|
|
|
# read text from stdin
|
|
process_file(sys.stdin)
|