Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
break
if overlap == False:
condensed_rects.append(rect)
if len(condensed_rects) == 0:
return []
sorted_rects = list(sorted(condensed_rects, key=itemgetter("x0")))
# Find the far-right boundary of the rightmost rectangle
last_rect = sorted_rects[-1]
while True:
words_inside = utils.intersects_bbox(
[ w for w in words if w["x0"] >= last_rect["x0"] ],
(last_rect["x0"], last_rect["top"], last_rect["x1"], last_rect["bottom"]),
)
rect = utils.objects_to_rect(words_inside)
if rect == last_rect:
break
else:
last_rect = rect
# Describe all the left-hand edges of each text cluster
edges = [ {
"x0": b["x0"],
"x1": b["x0"],
"top": b["top"],
"bottom": b["bottom"],
"height": b["bottom"] - b["top"],
"orientation": "v"
} for b in sorted_rects ] + [ {
"x0": last_rect["x1"],
"x1": last_rect["x1"],
word_threshold=DEFAULT_MIN_WORDS_VERTICAL):
"""
Find (imaginary) vertical lines that connect the left, right, or center of at least `word_threshold` words.
"""
# Find words that share the same left, right, or centerpoints
by_x0 = utils.cluster_objects(words, "x0", 1)
by_x1 = utils.cluster_objects(words, "x1", 1)
by_center = utils.cluster_objects(words, lambda x: (x["x0"] + x["x1"])/2, 1)
clusters = by_x0 + by_x1 + by_center
# Find the points that align with the most words
sorted_clusters = sorted(clusters, key=lambda x: -len(x))
large_clusters = filter(lambda x: len(x) >= word_threshold, sorted_clusters)
# For each of those points, find the rectangles fitting all matching words
rects = list(map(utils.objects_to_rect, large_clusters))
# Iterate through those rectangles, condensing overlapping rectangles
condensed_rects = []
for rect in rects:
overlap = False
for c in condensed_rects:
if utils.objects_overlap(rect, c):
overlap = True
break
if overlap == False:
condensed_rects.append(rect)
if len(condensed_rects) == 0:
return []
sorted_rects = list(sorted(condensed_rects, key=itemgetter("x0")))