Skip to content

Commit

Permalink
Merge pull request #12 from vub-hpc/multiline-rules
Browse files Browse the repository at this point in the history
Support multiline rules and improve wrapping
  • Loading branch information
lexming authored Apr 24, 2024
2 parents f313b4e + 4112bbc commit bcf0443
Show file tree
Hide file tree
Showing 8 changed files with 100 additions and 103 deletions.
2 changes: 1 addition & 1 deletion src/term_rst_post/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@
@author: Alex Domingo (Vrije Universiteit Brussel)
"""

__version__ = "1.2.3"
__version__ = "1.3.0"
26 changes: 13 additions & 13 deletions src/term_rst_post/ansimotd.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ def accomodate_motd(body_file, head_file=None, foot_file=None, foot_link=None, w

# Inject extra link between body and footer
if foot_link:
foot_link_text = f"\nMore information at\n{foot_link}\n"
foot_link_text = f"\nMore information in\n{foot_link}\n"

if motd["foot"]["text"] is None:
motd["foot"]["text"] = ""
Expand Down Expand Up @@ -113,12 +113,11 @@ def accomodate_motd(body_file, head_file=None, foot_file=None, foot_link=None, w
return motd_file


def wrap_ansicode(ansistr, column_width, match_width=5):
def wrap_ansicode(ansistr, column_width):
"""
Cuts long text in a single string to a fixed column width accounting for ANSI escape code characters
- ansistr: (str) text with ANSI escape codes
- column_width: (int) length of text column in legible characters
- match_width: (int) number of characters used to match between the text with/without ANSI escape codes
"""
# Clear text without the ANSI escape codes
clearstr = re.sub('\033\[[0-9;]*m', '', ansistr)
Expand All @@ -137,23 +136,24 @@ def wrap_ansicode(ansistr, column_width, match_width=5):
ansistr_wrapped = list()
for line in clearstr_wrapped:
# Define search zone in ANSI text around column width boundary of non-ANSI text to find a match between them
# search zone = 3x `match_width` to the left and `ansicodes` to the right
cutleft = column_width - (match_width * 3)
cutright = column_width + ansicodes
match_zone = ansistr[cutleft:cutright]
match_zone = ansistr[:cutright]
# Find first matching substring between end of non-ANSI line and ANSI text
match_start = match_zone.find(line[(match_width * -1) :])
line_last_word = line.rstrip().split(' ')[-1]
match_start = match_zone.rfind(line_last_word)
if match_start < 0:
# Hard wrap without a match (probably just an empty line)
cutpoint = column_width
log_msg = f"Hard wrap at {cutpoint} characters. No match found: '{line}' in '{match_zone}'"
# Hard wrap without a match (probably just an empty line, or escape codes in match zone)
# Find closest white space to text width
cutpoint = ansistr[:column_width+ansicodes].rfind(' ')
log_msg = f"Hard wrap at {cutpoint} characters. "
log_msg += f"No match found: '{line_last_word}' in '{repr(match_zone)}'"
logger.warning(log_msg) if match_zone else logger.debug(log_msg)
else:
cutpoint = cutleft + match_start + match_width
cutpoint = match_start + len(line_last_word)
# Split ANSI text in the same text position as non-ANSI text
leftstr = ansistr[:cutpoint].lstrip()
leftstr = ansistr[:cutpoint].rstrip()
ansistr_wrapped.append(leftstr) # save left part
ansistr = ansistr[cutpoint:] # update ANSI text with right part
ansistr = ansistr[cutpoint:].lstrip() # update ANSI text with right part
ansicodes -= len(ansistr_wrapped[-1]) - len(line) # update number of ANSI escape code charcaters

logger.debug(
Expand Down
3 changes: 2 additions & 1 deletion src/term_rst_post/newspost.py
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,8 @@ def plain_ref_role(name, rawtext, text, lineno, inliner, options={}, content=[])
Targets of :ref: are internal labels without meaning that should be hidden
"""
text = utils.unescape(text)
regex = re.compile(r"(.*?)\s*\<(.*?)\>")
text = " ".join(text.splitlines())
regex = re.compile(r"([^<>]*)\s*(\<.*\>)?")
try:
match = regex.match(text)
label = match.group(1)
Expand Down
36 changes: 18 additions & 18 deletions tests/references/ablog_motd_wrapped.ansi
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@

# Test news post with a simple paragraph

 Warning  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Some text with emphasis. Nulla sed orci nec orci elementum facilisis
vitae at mauris. Nulla eu ultrices lectus. Some text in bold. Integer
vitae purus vel quam laoreet fringilla vitae nec diam. Donec non
aliquet nisi. Vivamus quis aliquam purus. Ut non ipsum sit amet eros
 Warning  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Some text with emphasis. Nulla sed orci nec orci elementum facilisis
vitae at mauris. Nulla eu ultrices lectus. Some text in bold. Integer
vitae purus vel quam laoreet fringilla vitae nec diam. Donec non
aliquet nisi. Vivamus quis aliquam purus. Ut non ipsum sit amet eros
imperdiet gravida at a tellus. `Some literal text.` Curabitur at ipsum
bibendum nunc tincidunt bibendum nec sed sapien. Donec ultrices nunc
ligula, aliquet elementum diam tempus at. Morbi condimentum, ligula
vitae venenatis aliquam, tellus lectus pulvinar est, vitae efficitur
bibendum nunc tincidunt bibendum nec sed sapien. Donec ultrices nunc
ligula, aliquet elementum diam tempus at. Morbi condimentum, ligula
vitae venenatis aliquam, tellus lectus pulvinar est, vitae efficitur
odio magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu,
facilisis vitae justo. Curabitur a ipsum placerat libero aliquam
facilisis vitae justo. Curabitur a ipsum placerat libero aliquam
volutpat. Proin interdum porta consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sed
orci nec orci elementum facilisis vitae at mauris. Nulla eu ultrices
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sed
orci nec orci elementum facilisis vitae at mauris. Nulla eu ultrices
lectus. Integer vitae purus vel quam laoreet fringilla vitae nec diam.
Donec non aliquet nisi. Vivamus quis aliquam purus. Ut non ipsum sit
amet eros imperdiet gravida at a tellus. Curabitur at ipsum bibendum
nunc tincidunt bibendum nec sed sapien. Donec ultrices nunc ligula,
aliquet elementum diam tempus at. Morbi condimentum, ligula vitae
venenatis aliquam, tellus lectus pulvinar est, vitae efficitur odio
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu,
facilisis vitae justo. Curabitur a ipsum placerat libero aliquam
Donec non aliquet nisi. Vivamus quis aliquam purus. Ut non ipsum sit
amet eros imperdiet gravida at a tellus. Curabitur at ipsum bibendum
nunc tincidunt bibendum nec sed sapien. Donec ultrices nunc ligula,
aliquet elementum diam tempus at. Morbi condimentum, ligula vitae
venenatis aliquam, tellus lectus pulvinar est, vitae efficitur odio
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu,
facilisis vitae justo. Curabitur a ipsum placerat libero aliquam
volutpat. Proin interdum porta consequat.
33 changes: 16 additions & 17 deletions tests/references/ablog_motd_wrapped_headfoot.ansi
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,27 @@ HEADER

# Test news post with a simple paragraph

 Warning  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Some text
with emphasis. Nulla sed orci nec orci elementum facilisis vitae at mauris.
Nulla eu ultrices lectus. Some text in bold. Integer vitae purus vel quam
laoreet fringilla vitae nec diam. Donec non aliquet nisi. Vivamus quis aliquam
purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus. `Some literal
 Warning  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Some text
with emphasis. Nulla sed orci nec orci elementum facilisis vitae at mauris.
Nulla eu ultrices lectus. Some text in bold. Integer vitae purus vel quam
laoreet fringilla vitae nec diam. Donec non aliquet nisi. Vivamus quis aliquam
purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus. `Some literal
text.` Curabitur at ipsum bibendum nunc tincidunt bibendum nec sed sapien. Donec
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
ligula vitae venenatis aliquam, tellus lectus pulvinar est, vitae efficitur odio
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
porta consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sed orci
nec orci elementum facilisis vitae at mauris. Nulla eu ultrices lectus. Integer
vitae
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sed orci nec orci
elementum facilisis vitae at mauris. Nulla eu ultrices lectus. Integer vitae
purus vel quam laoreet fringilla vitae nec diam. Donec non aliquet nisi. Vivamus
quis aliquam purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus.
Curabitur at ipsum bibendum nunc tincidunt bibendum nec sed sapien. Donec
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
quis aliquam purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus.
Curabitur at ipsum bibendum nunc tincidunt bibendum nec sed sapien. Donec
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
ligula vitae venenatis aliquam, tellus lectus pulvinar est, vitae efficitur odio
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
porta consequat.
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
porta consequat.
------
FOOTER
35 changes: 17 additions & 18 deletions tests/references/ablog_motd_wrapped_headfoot_url.ansi
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,30 @@ HEADER

# Test news post with a simple paragraph

 Warning  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Some text
with emphasis. Nulla sed orci nec orci elementum facilisis vitae at mauris.
Nulla eu ultrices lectus. Some text in bold. Integer vitae purus vel quam
laoreet fringilla vitae nec diam. Donec non aliquet nisi. Vivamus quis aliquam
purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus. `Some literal
 Warning  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Some text
with emphasis. Nulla sed orci nec orci elementum facilisis vitae at mauris.
Nulla eu ultrices lectus. Some text in bold. Integer vitae purus vel quam
laoreet fringilla vitae nec diam. Donec non aliquet nisi. Vivamus quis aliquam
purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus. `Some literal
text.` Curabitur at ipsum bibendum nunc tincidunt bibendum nec sed sapien. Donec
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
ligula vitae venenatis aliquam, tellus lectus pulvinar est, vitae efficitur odio
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
porta consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sed orci
nec orci elementum facilisis vitae at mauris. Nulla eu ultrices lectus. Integer
vitae
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sed orci nec orci
elementum facilisis vitae at mauris. Nulla eu ultrices lectus. Integer vitae
purus vel quam laoreet fringilla vitae nec diam. Donec non aliquet nisi. Vivamus
quis aliquam purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus.
Curabitur at ipsum bibendum nunc tincidunt bibendum nec sed sapien. Donec
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
quis aliquam purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus.
Curabitur at ipsum bibendum nunc tincidunt bibendum nec sed sapien. Donec
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
ligula vitae venenatis aliquam, tellus lectus pulvinar est, vitae efficitur odio
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
porta consequat.
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
porta consequat.

More information at
More information in
https://example.com/posts/year/test
------
FOOTER
33 changes: 16 additions & 17 deletions tests/references/ablog_motd_wrapped_indented.ansi
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@

# Test news post with a simple paragraph

 Warning  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Some text
with emphasis. Nulla sed orci nec orci elementum facilisis vitae at mauris.
Nulla eu ultrices lectus. Some text in bold. Integer vitae purus vel quam
laoreet fringilla vitae nec diam. Donec non aliquet nisi. Vivamus quis aliquam
purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus. `Some literal
 Warning  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Some text
with emphasis. Nulla sed orci nec orci elementum facilisis vitae at mauris.
Nulla eu ultrices lectus. Some text in bold. Integer vitae purus vel quam
laoreet fringilla vitae nec diam. Donec non aliquet nisi. Vivamus quis aliquam
purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus. `Some literal
text.` Curabitur at ipsum bibendum nunc tincidunt bibendum nec sed sapien. Donec
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
ligula vitae venenatis aliquam, tellus lectus pulvinar est, vitae efficitur odio
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
porta consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sed orci
nec orci elementum facilisis vitae at mauris. Nulla eu ultrices lectus. Integer
vitae
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sed orci nec orci
elementum facilisis vitae at mauris. Nulla eu ultrices lectus. Integer vitae
purus vel quam laoreet fringilla vitae nec diam. Donec non aliquet nisi. Vivamus
quis aliquam purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus.
Curabitur at ipsum bibendum nunc tincidunt bibendum nec sed sapien. Donec
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
quis aliquam purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus.
Curabitur at ipsum bibendum nunc tincidunt bibendum nec sed sapien. Donec
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
ligula vitae venenatis aliquam, tellus lectus pulvinar est, vitae efficitur odio
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
porta consequat.
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
porta consequat.
35 changes: 17 additions & 18 deletions tests/references/ablog_motd_wrapped_indented_url.ansi
Original file line number Diff line number Diff line change
@@ -1,29 +1,28 @@

# Test news post with a simple paragraph

 Warning  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Some text
with emphasis. Nulla sed orci nec orci elementum facilisis vitae at mauris.
Nulla eu ultrices lectus. Some text in bold. Integer vitae purus vel quam
laoreet fringilla vitae nec diam. Donec non aliquet nisi. Vivamus quis aliquam
purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus. `Some literal
 Warning  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Some text
with emphasis. Nulla sed orci nec orci elementum facilisis vitae at mauris.
Nulla eu ultrices lectus. Some text in bold. Integer vitae purus vel quam
laoreet fringilla vitae nec diam. Donec non aliquet nisi. Vivamus quis aliquam
purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus. `Some literal
text.` Curabitur at ipsum bibendum nunc tincidunt bibendum nec sed sapien. Donec
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
ligula vitae venenatis aliquam, tellus lectus pulvinar est, vitae efficitur odio
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
porta consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sed orci
nec orci elementum facilisis vitae at mauris. Nulla eu ultrices lectus. Integer
vitae
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sed orci nec orci
elementum facilisis vitae at mauris. Nulla eu ultrices lectus. Integer vitae
purus vel quam laoreet fringilla vitae nec diam. Donec non aliquet nisi. Vivamus
quis aliquam purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus.
Curabitur at ipsum bibendum nunc tincidunt bibendum nec sed sapien. Donec
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
quis aliquam purus. Ut non ipsum sit amet eros imperdiet gravida at a tellus.
Curabitur at ipsum bibendum nunc tincidunt bibendum nec sed sapien. Donec
ultrices nunc ligula, aliquet elementum diam tempus at. Morbi condimentum,
ligula vitae venenatis aliquam, tellus lectus pulvinar est, vitae efficitur odio
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
porta consequat.
magna vitae lorem. Nam quam risus, pellentesque nec facilisis eu, facilisis
vitae justo. Curabitur a ipsum placerat libero aliquam volutpat. Proin interdum
porta consequat.

More information at
More information in
https://example.com/posts/year/test

0 comments on commit bcf0443

Please sign in to comment.