Improve oral hardcore pose variation
This commit is contained in:
+59
-20
@@ -55,7 +55,7 @@ HARDCORE_ENVIRONMENT_ANCHOR_REPLACEMENTS = (
|
||||
(r"\bsitting on the edge of the bed\b", "sitting on a raised edge"),
|
||||
(r"\blying at the bed edge with thighs open\b", "lying near a raised edge with thighs open"),
|
||||
(r"\bedge[- ]of[- ]bed\b", "edge-supported"),
|
||||
(r"\bbed[- ]edge\b", "edge-supported"),
|
||||
(r"\bbed[- ]edge\b", "raised edge"),
|
||||
(r"\bedge of (?:the )?bed\b", "raised edge"),
|
||||
(r"\bbed edge\b", "raised edge"),
|
||||
(r"\bhands? braced on the bed\b", "hands braced beside the body"),
|
||||
@@ -544,6 +544,9 @@ def _mentions_rear_entry(text: str) -> bool:
|
||||
def _hardcore_pose_anchor(role_graph: str, hard_item: str, composition: str = "", axis_values: Any = None) -> str:
|
||||
text = _position_context_text(role_graph, hard_item, composition, axis_values)
|
||||
item_text = " ".join(part for part in (_clean(hard_item).lower(), _axis_values_text(axis_values).lower()) if part)
|
||||
position_text = ""
|
||||
if isinstance(axis_values, dict):
|
||||
position_text = _clean(axis_values.get("position", "")).lower()
|
||||
if not text:
|
||||
return ""
|
||||
if _is_toy_assisted_double_text(role_graph, hard_item, composition, _axis_values_text(axis_values)):
|
||||
@@ -582,10 +585,30 @@ def _hardcore_pose_anchor(role_graph: str, hard_item: str, composition: str = ""
|
||||
if "kneeling" in text:
|
||||
return "kneeling front-and-back double-penetration pose"
|
||||
return "front-and-back double-penetration pose"
|
||||
if "sixty-nine" in text:
|
||||
if "sixty-nine" in position_text or ("sixty-nine" in text and not position_text):
|
||||
return "sixty-nine oral pose"
|
||||
if "face-sitting" in text:
|
||||
if "face-sitting" in position_text or ("face-sitting" in text and not position_text):
|
||||
return "face-sitting oral pose"
|
||||
if "side-lying oral" in position_text or (("side-lying oral position" in item_text or "side-lying oral" in text) and not position_text):
|
||||
return "side-lying oral pose"
|
||||
if (
|
||||
"edge-of-bed oral" in position_text
|
||||
or "edge-supported oral" in position_text
|
||||
or (("edge-of-bed oral position" in item_text or "edge-of-bed oral" in text or "edge-supported oral" in text) and not position_text)
|
||||
):
|
||||
return "edge-supported oral pose"
|
||||
if "standing oral" in position_text or (("standing oral position" in item_text or "standing oral" in text) and not position_text):
|
||||
return "standing oral pose"
|
||||
if "chair oral" in position_text or (("chair oral position" in item_text or "chair oral" in text) and not position_text):
|
||||
return "chair oral pose"
|
||||
if "kneeling oral" in position_text or (("kneeling oral position" in item_text or "kneeling oral" in text) and not position_text):
|
||||
return "kneeling oral pose"
|
||||
if "straddled oral" in position_text or (("straddled oral position" in item_text or "straddled oral" in text) and not position_text):
|
||||
return "straddled cunnilingus pose"
|
||||
if "reclining cunnilingus" in position_text or (("reclining cunnilingus position" in item_text or "reclining cunnilingus" in text) and not position_text):
|
||||
return "reclining cunnilingus pose"
|
||||
if "spread-leg oral" in position_text or (("spread-leg oral position" in item_text or "spread-leg oral" in text) and not position_text):
|
||||
return "spread-leg oral pose"
|
||||
if "cunnilingus" in text or "pussy licking" in text or "mouth on her pussy" in text:
|
||||
if "reclining" in text:
|
||||
return "reclining cunnilingus pose"
|
||||
@@ -598,7 +621,7 @@ def _hardcore_pose_anchor(role_graph: str, hard_item: str, composition: str = ""
|
||||
if "spread-leg oral position" in item_text:
|
||||
return "spread-leg oral pose"
|
||||
if "edge-of-bed oral position" in item_text:
|
||||
return "edge-of-bed oral pose"
|
||||
return "edge-supported oral pose"
|
||||
if "standing oral position" in item_text:
|
||||
return "standing oral pose"
|
||||
if "chair oral position" in item_text:
|
||||
@@ -610,7 +633,7 @@ def _hardcore_pose_anchor(role_graph: str, hard_item: str, composition: str = ""
|
||||
if "side-lying" in text:
|
||||
return "side-lying oral pose"
|
||||
if "edge-of-bed" in text or "bed-edge" in text:
|
||||
return "edge-of-bed oral pose"
|
||||
return "edge-supported oral pose"
|
||||
if "spread-leg" in text:
|
||||
return "spread-leg oral pose"
|
||||
if "chair oral" in text:
|
||||
@@ -660,6 +683,9 @@ def _hardcore_pose_anchor(role_graph: str, hard_item: str, composition: str = ""
|
||||
|
||||
def _hardcore_pose_arrangement(anchor: str, role_graph: str, hard_item: str, composition: str = "", axis_values: Any = None) -> str:
|
||||
text = _position_context_text(anchor, f"{role_graph} {hard_item}", composition, axis_values)
|
||||
position_text = ""
|
||||
if isinstance(axis_values, dict):
|
||||
position_text = _clean(axis_values.get("position", "")).lower()
|
||||
if not text:
|
||||
return ""
|
||||
mixed_woman_man = "the woman" in text and "the man" in text
|
||||
@@ -671,17 +697,21 @@ def _hardcore_pose_arrangement(anchor: str, role_graph: str, hard_item: str, com
|
||||
def double_tail() -> str:
|
||||
return "" if "toy" in text else ", with the second penetration point aligned"
|
||||
|
||||
if "sixty-nine" in text:
|
||||
if "sixty-nine" in position_text or ("sixty-nine" in text and not position_text):
|
||||
return cast_phrase(
|
||||
"with the woman and man inverted head-to-hips so both mouths align with genitals",
|
||||
"with both bodies inverted head-to-hips so both mouths align with genitals",
|
||||
)
|
||||
if "face-sitting" in text:
|
||||
if "face-sitting" in position_text or ("face-sitting" in text and not position_text):
|
||||
return cast_phrase(
|
||||
"with the man lying back while the woman straddles his face",
|
||||
"with one partner lying back while the other straddles the face",
|
||||
)
|
||||
if "reclining cunnilingus" in text or "spread-leg oral" in text:
|
||||
if (
|
||||
"reclining cunnilingus" in position_text
|
||||
or "spread-leg oral" in position_text
|
||||
or (("reclining cunnilingus" in text or "spread-leg oral" in text) and not position_text)
|
||||
):
|
||||
if "takes the man's penis" in text or "penis in her mouth" in text:
|
||||
return cast_phrase(
|
||||
"with the man seated with legs apart and the woman positioned at his hips",
|
||||
@@ -691,22 +721,30 @@ def _hardcore_pose_arrangement(anchor: str, role_graph: str, hard_item: str, com
|
||||
"with the woman lying back, thighs spread, and the man positioned between her legs",
|
||||
"with the receiving partner lying back, thighs spread, and the giver positioned between the legs",
|
||||
)
|
||||
if "straddled cunnilingus" in text or "straddled oral" in text:
|
||||
if (
|
||||
"straddled oral" in position_text
|
||||
or (("straddled cunnilingus" in text or "straddled oral" in text) and not position_text)
|
||||
):
|
||||
return cast_phrase(
|
||||
"with the woman straddling above the man's mouth and her thighs framing his face",
|
||||
"with the receiver straddling above the giver's mouth",
|
||||
)
|
||||
if "edge-of-bed oral" in text:
|
||||
if (
|
||||
"edge-of-bed oral" in position_text
|
||||
or "edge-supported oral" in position_text
|
||||
or ("edge-of-bed oral" in text and not position_text)
|
||||
or ("edge-supported oral" in text and not position_text)
|
||||
):
|
||||
if "takes the man's penis" in text or "penis in her mouth" in text:
|
||||
return cast_phrase(
|
||||
"with the man at the bed edge and the woman kneeling at his hips",
|
||||
"with the receiver at the bed edge and the giver positioned at hip height",
|
||||
"with the man at a raised edge and the woman kneeling at his hips",
|
||||
"with the receiver at a raised edge and the giver positioned at hip height",
|
||||
)
|
||||
return cast_phrase(
|
||||
"with the woman lying at the bed edge and the man positioned between her open thighs",
|
||||
"with the receiver lying at the bed edge and the giver positioned between open thighs",
|
||||
"with the woman lying at a raised edge and the man positioned between her open thighs",
|
||||
"with the receiver lying at a raised edge and the giver positioned between open thighs",
|
||||
)
|
||||
if "standing oral" in text:
|
||||
if "standing oral" in position_text or ("standing oral" in text and not position_text):
|
||||
if "takes the man's penis" in text or "penis in her mouth" in text:
|
||||
return cast_phrase(
|
||||
"with the man standing and the woman kneeling in front of his hips",
|
||||
@@ -716,7 +754,7 @@ def _hardcore_pose_arrangement(anchor: str, role_graph: str, hard_item: str, com
|
||||
"with the woman standing braced and the man kneeling between her thighs",
|
||||
"with the receiver standing braced and the giver kneeling between the thighs",
|
||||
)
|
||||
if "chair oral" in text:
|
||||
if "chair oral" in position_text or ("chair oral" in text and not position_text):
|
||||
if "takes the man's penis" in text or "penis in her mouth" in text:
|
||||
return cast_phrase(
|
||||
"with the man seated in the chair and the woman kneeling between his legs at hip level",
|
||||
@@ -726,9 +764,9 @@ def _hardcore_pose_arrangement(anchor: str, role_graph: str, hard_item: str, com
|
||||
"with one partner seated in a chair and the other kneeling between the open thighs",
|
||||
"with the receiver seated in a chair and the giver kneeling between the open thighs",
|
||||
)
|
||||
if "side-lying oral" in text:
|
||||
if "side-lying oral" in position_text or ("side-lying oral" in text and not position_text):
|
||||
return "with both bodies lying on their sides and mouth aligned to genitals"
|
||||
if "kneeling oral" in text:
|
||||
if "kneeling oral" in position_text or ("kneeling oral" in text and not position_text):
|
||||
if "takes the man's penis" in text or "penis in her mouth" in text:
|
||||
return cast_phrase(
|
||||
"with the woman kneeling in front of the man's hips, her mouth at penis level",
|
||||
@@ -917,7 +955,7 @@ def _hardcore_item_detail(hard_item: str) -> str:
|
||||
r"missionary position|cowgirl position|reverse cowgirl position|doggy style position|"
|
||||
r"standing sex position|spooning sex position|edge-of-bed position|kneeling straddle position|"
|
||||
r"lotus sex position|bent-over position|kneeling oral position|face-sitting position|"
|
||||
r"sixty-nine position|edge-of-bed oral position|standing oral position|reclining cunnilingus position|"
|
||||
r"sixty-nine position|edge-of-bed oral position|edge-supported oral position|standing oral position|reclining cunnilingus position|"
|
||||
r"straddled oral position|side-lying oral position|spread-leg oral position|chair oral position"
|
||||
)
|
||||
text = re.sub(
|
||||
@@ -962,7 +1000,8 @@ def _dedupe_hardcore_detail(detail: str, anchor: str) -> str:
|
||||
r"spread-leg oral position",
|
||||
r"chair oral position",
|
||||
),
|
||||
"edge-of-bed oral": (r"edge-of-bed oral position",),
|
||||
"edge-supported oral": (r"edge-of-bed oral position", r"edge-supported oral position"),
|
||||
"edge-of-bed oral": (r"edge-of-bed oral position", r"edge-supported oral position"),
|
||||
"standing oral": (r"standing oral position",),
|
||||
"spread-leg oral": (r"spread-leg oral position",),
|
||||
"chair oral": (r"chair oral position",),
|
||||
|
||||
Reference in New Issue
Block a user