[1mdiff --git a/50_bubble.py b/50_bubble.py[m
[1mindex d6a25a7..815cfef 100644[m
[1m--- a/50_bubble.py[m
[1m+++ b/50_bubble.py[m
[36m@@ -387,6 +387,14 @@[m [mIn the "New post" and "Comment" prompts, there are special commands available:[m
[32m+[m
[32m+[m[32mIn the "Edit text" prompts of the draft composer:[m
[32m+[m
[32m+[m[32m* Entering \e will open the text segment in a raw view so that it can be edited via Titan directly, if the client supports page editing.[m
[32m+[m
[32m+[m[32m### Undoing Mistakes[m
[32m+[m
[32m+[m[32mWhen editing segments in the draft composer, you may sometimes accidentally submit the input and overwrite the contents, losing some text that you meant to keep in there. While Bubble does not currently keep a history of past edited versions, your client may be able to help you. If you navigate backwards, the old contents of the segment may be found in a cached copy of the page.[m
"""[m
return page[m
[m
[36m@@ -407,7 +415,8 @@[m [mwhen the administrator assigns at least one moderator to it.[m
return admin_actions(session)[m
[m
elif req.path.startswith(self.path + 'edit-segment/') or \[m
[31m- req.path.startswith(self.path + 'move-segment/'):[m
[32m+[m[32m req.path.startswith(self.path + 'move-segment/') or \[m
[32m+[m[32m req.path.startswith(self.path + 'raw-segment/'):[m
return edit_segment(session)[m
[m
elif req.path.startswith(self.path + 'edit/'):[m
[1mdiff --git a/composer.py b/composer.py[m
[1mindex 6f7390c..90db7eb 100644[m
[1m--- a/composer.py[m
[1m+++ b/composer.py[m
[36m@@ -10,15 +10,15 @@[m [mdef edit_segment(session):[m
db = session.db[m
req = session.req[m
[m
[31m- found = re.match(r'^(edit|move)-segment/(\d+)$', req.path[len(session.path):])[m
[32m+[m[32m found = re.match(r'^(edit|move|raw)-segment/(\d+)$', req.path[len(session.path):])[m
seg_action = found.group(1)[m
seg_id = int(found.group(2))[m
segment = db.get_segment(seg_id)[m
if not segment:[m
return 51, 'Not found'[m
[m
[31m- if is_empty_query(req) and session.is_gemini:[m
[31m- if seg_action =='edit':[m
[32m+[m[32m if session.is_gemini and is_empty_query(req) and seg_action != 'raw':[m
[32m+[m[32m if seg_action == 'edit':[m
if segment.type == Segment.LINK:[m
return 10, 'Edit link: (URL followed by label, separated with space)'[m
if segment.type == Segment.POLL:[m
[36m@@ -27,15 +27,26 @@[m [mdef edit_segment(session):[m
if segment.type == Segment.POLL:[m
return 10, 'Move to which position in the poll: (X to remove)'[m
[m
[31m- return 10, 'Edited text:' if seg_action == 'edit' else \[m
[31m- 'Move to which position §? (X to remove)'[m
[32m+[m[32m return 10, 'Edited text: (see Help for special commands)' if seg_action == 'edit' else \[m
[32m+[m[32m 'Move to which position §? (X to remove)'[m
[m
post = db.get_post(segment.post)[m
[m
if not session.is_editable(post):[m
return 61, 'Cannot edit posts by other users'[m
[m
[31m- if seg_action == 'edit':[m
[32m+[m[32m if seg_action == 'raw':[m
[32m+[m[32m if segment.type != Segment.TEXT:[m
[32m+[m[32m return 50, 'Only text segments can be viewed in raw mode'[m
[32m+[m[32m if session.is_gemini:[m
[32m+[m[32m return segment.content[m
[32m+[m[32m else:[m
[32m+[m[32m if not req.content_mime.startswith('text/'):[m
[32m+[m[32m return 50, 'Bad content format (must be text)'[m
[32m+[m[32m seg_text = req.content.decode('utf-8')[m
[32m+[m[32m db.update_segment(segment, content=seg_text)[m
[32m+[m
[32m+[m[32m elif seg_action == 'edit':[m
if segment.type == Segment.LINK:[m
seg_url, seg_text = parse_link_segment_query(req)[m
db.update_segment(segment, url=seg_url, content=seg_text)[m
[36m@@ -43,6 +54,8 @@[m [mdef edit_segment(session):[m
elif segment.type == Segment.TEXT:[m
if session.is_gemini:[m
seg_text = clean_query(req)[m
[32m+[m[32m if seg_text == '\e':[m
[32m+[m[32m return 30, f'{session.server_root()}{session.path}raw-segment/{segment.id}'[m
else:[m
seg_text = clean_text(req.content.decode('utf-8'))[m
db.update_segment(segment, content=seg_text)[m
text/plain
This content has been proxied by September (3851b).