Skip to content

Commit 7553c09

Browse files
committed
@W-22137880 Fix skill title casing: API and MCP now render in uppercase
1 parent d345b72 commit 7553c09

7 files changed

Lines changed: 55 additions & 7 deletions

File tree

scripts/portal_generator/generator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from .discovery import discover_apis, calculate_stats
1313
from .builders.tree_builder import build_operation_tree
1414
from .assets import get_css, get_js, get_jsonpath_js
15-
from .template_env import create_env
15+
from .template_env import create_env, _skill_title
1616
from .mulesoft_chrome import fetch_mulesoft_chrome
1717

1818

@@ -313,7 +313,7 @@ def _generate_skill_pages(self):
313313
template = self.env.get_template('skill_page.html')
314314

315315
for skill in self.all_skills:
316-
skill_name = skill.get('name', skill['slug']).replace('-', ' ').title()
316+
skill_name = _skill_title(skill.get('name', skill['slug']))
317317
api_refs = skill.get('api_refs', [])
318318

319319
# Build op_lookup scoped to APIs this skill references

scripts/portal_generator/template_env.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,26 @@ def _resolve_skill_inputs(inputs_dict, step_details):
197197
return result
198198

199199

200+
_UPPERCASE_WORDS = {'api', 'apis', 'mcp', 'ip', 'id', 'url', 'http', 'https', 'sdk', 'cli', 'jtbd'}
201+
202+
203+
def _skill_title(value):
204+
"""Convert a slug like 'apply-policy-to-api-instance' to 'Apply Policy to API Instance'.
205+
206+
Preserves known acronyms in uppercase and keeps short words lowercase."""
207+
if not value:
208+
return ''
209+
words = str(value).replace('-', ' ').split()
210+
result = []
211+
for word in words:
212+
lower = word.lower()
213+
if lower in _UPPERCASE_WORDS:
214+
result.append(lower.upper())
215+
else:
216+
result.append(word.capitalize())
217+
return ' '.join(result)
218+
219+
200220
def _truncate_text(text, max_length=25):
201221
"""Truncate text to max_length characters, adding ellipsis if truncated."""
202222
if not text or len(text) <= max_length:
@@ -239,6 +259,7 @@ def create_env() -> Environment:
239259
env.filters['titleize_operation'] = _titleize_operation
240260
env.filters['slugify'] = _slugify
241261
env.filters['resolve_skill_inputs'] = _resolve_skill_inputs
262+
env.filters['skill_title'] = _skill_title
242263
env.filters['truncate_text'] = _truncate_text
243264
env.filters['should_collapse_description'] = _should_collapse_description
244265

scripts/portal_generator/templates/homepage/skill_card.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% set skill_name = skill.name|replace('-', ' ')|title %}
1+
{% set skill_name = skill.name|skill_title %}
22
<a href="skills/{{ skill.slug }}.html" class="catalog-card-link" data-name="{{ skill_name|lower }}" data-type="skill">
33
<article class="catalog-card">
44
<div class="catalog-card-header">

scripts/portal_generator/templates/partials/sidebar.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
{% if api.skills %}
8787
<div id="skills-panel" class="sidebar-panel" role="tabpanel" aria-labelledby="skills-tab" style="display: none;">
8888
{% for skill in api.skills %}
89-
{% set skill_name = skill.name|replace('-', ' ')|title %}
89+
{% set skill_name = skill.name|skill_title %}
9090
{% set step_count = skill.step_details|length %}
9191
<li>
9292
<a href="../skills/{{ skill.slug }}.html" class="nav-link nav-operation-flat">

scripts/portal_generator/templates/partials/skill_sidebar.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% set skill_name = skill.name|replace('-', ' ')|title %}
1+
{% set skill_name = skill.name|skill_title %}
22
{% set slug = skill.slug %}
33
{% set step_details = skill.step_details|default([]) %}
44

scripts/portal_generator/templates/skills/skill_detail.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{% from "skills/step_unified.html" import render_step_unified %}
22

33
{% macro render_skill(skill, private_api_slugs=[], api_link_prefix='', op_lookup={}) %}
4-
{% set skill_name = skill.name|replace('-', ' ')|title %}
4+
{% set skill_name = skill.name|skill_title %}
55
{% set slug = skill.slug %}
66
{% set step_details = skill.step_details|default([]) %}
77

scripts/tests/test_units.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from portal_generator.utils import get_category, CATEGORY_MAPPING
1010
from portal_generator.builders.tree_builder import build_operation_tree, count_tree_operations
11-
from portal_generator.template_env import _nl2br, _nl2br_html, _render_markdown, _tojson_raw
11+
from portal_generator.template_env import _nl2br, _nl2br_html, _render_markdown, _tojson_raw, _skill_title
1212
from portal_generator.generator import _build_api_meta, _get_example_body, PortalGenerator
1313
from portal_generator.parsers.skill_parser import (
1414
_extract_yaml_blocks,
@@ -227,6 +227,33 @@ def test_custom_indent(self):
227227
assert ' "a"' in str(result)
228228

229229

230+
# ============================================================================
231+
# _skill_title
232+
# ============================================================================
233+
234+
class TestSkillTitle:
235+
def test_api_uppercase(self):
236+
assert _skill_title('apply-policy-to-api-instance') == 'Apply Policy To API Instance'
237+
238+
def test_mcp_uppercase(self):
239+
assert _skill_title('protect-mcp-server-with-policies') == 'Protect MCP Server With Policies'
240+
241+
def test_multiple_acronyms(self):
242+
assert _skill_title('setup-api-with-oauth') == 'Setup API With Oauth'
243+
244+
def test_no_acronyms(self):
245+
assert _skill_title('run-agent-scan-and-view-results') == 'Run Agent Scan And View Results'
246+
247+
def test_empty_string(self):
248+
assert _skill_title('') == ''
249+
250+
def test_single_word(self):
251+
assert _skill_title('api') == 'API'
252+
253+
def test_already_spaced(self):
254+
assert _skill_title('protect api with policies') == 'Protect API With Policies'
255+
256+
230257
# ============================================================================
231258
# generator helpers
232259
# ============================================================================

0 commit comments

Comments
 (0)