SaaS Africa ยท Mining Software
{page_title}
{intro}
Tools compared: {tool_names}
Note: Pricing and features can change. Always confirm the latest details on the official vendor sites.
Mining operations
African context
Data-driven selection
“””
)
# ========= SECTION 1 โ OVERVIEW TABLE =========
parts.append(
“””
Tools are listed across the top. Key categories such as ease of use, mining fit and
pricing are listed in the first column, so you can compare your options at a glance.
| Category |
“””
)
for row in overview[“rows”]:
parts.append(f” {esc(row.get(ov_keys[0], ”))} | \n”)
parts.append(
“””
“””
)
for cat_index, cat_name in enumerate(overview[“headers”][1:], start=1):
parts.append(” \n”)
parts.append(
f’ | ‘
f’{esc(cat_name)} | \n’
)
for row in overview[“rows”]:
parts.append(f” {gi(row, ov_keys, cat_index)} | \n”)
parts.append(”
\n”)
parts.append(
“””
“””
)
# ========= SECTION 2 โ IN-DEPTH CARDS + RECOMMENDATION =========
parts.append(
“””
This section is built from your detailed mining SaaS notes: positioning, strengths,
limitations, technical capabilities, African market considerations and pricing. Each card
comes directly from the spreadsheet, so you can keep everything consistent by updating
only one source.
“””
)
for idx, r in enumerate(deep[“rows”], start=1):
name = gi(r, deep_keys, 0)
best_use = gi(r, deep_keys, 7)
website_raw = r.get(deep_keys[8], “”)
parts.append(
f”””
Positioning: {gi(r, deep_keys, 1)}
Strengths: {gi(r, deep_keys, 2)}
Limitations: {gi(r, deep_keys, 3)}
Technical capability: {gi(r, deep_keys, 4)}
African market consideration: {gi(r, deep_keys, 5)}
Detailed pricing: {gi(r, deep_keys, 6)}
Pricing information is indicative only. Check the vendor site for current plans,
currencies and implementation costs.
Best use cases: {best_use}
{make_link(website_raw)}
“””
)
parts.append(”
\n”)
if recommendation.strip():
parts.append(
f”””
Where should a mine start? {esc(recommendation)}
“””
)
parts.append(
“””
“””
)
# ========= SECTION 3 โ FAQ TABLE =========
parts.append(
“””
These FAQs are taken from your spreadsheet and can be updated any time. They also work
as a light conclusion for the post, addressing the most common concerns for mining
stakeholders in Africa.
| Question |
Answer |
“””
)
for r in faq[“rows”]:
parts.append(
f”””
| {gi(r, faq_keys, 0)} |
{gi(r, faq_keys, 1)} |
“””
)
parts.append(
“””
“””
)
return “”.join(parts)
def main():
script_dir = Path(os.path.dirname(os.path.abspath(__file__)))
os.chdir(script_dir)
csv_path = script_dir / CSV_NAME
print(“Script directory:”, script_dir)
print(“Expected CSV file:”, csv_path)
try:
meta, sec1, sec2, recommendation, sec4 = load_sections(csv_path)
html_code = build_html_fragment(meta, sec1, sec2, recommendation, sec4)
out_path = script_dir / OUTPUT_NAME
out_path.write_text(html_code, encoding=”utf-8″)
print(f”โ HTML written to {out_path}”)
except Exception as e:
print(“ERROR:”, e)
input(“\nPress ENTER to close…”)
if __name__ == “__main__”:
main()