openscad-cpp-evaluator 1.28.2__tar.gz → 1.28.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/PKG-INFO +1 -1
  2. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/text_metrics.hpp +5 -1
  3. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/pyproject.toml +1 -1
  4. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/function_builtins.cpp +4 -3
  5. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/text.cpp +2 -1
  6. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/text/text_metrics.cpp +19 -4
  7. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_text.cpp +27 -0
  8. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/uv.lock +1 -1
  9. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/.github/workflows/ci.yml +0 -0
  10. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/.github/workflows/wheels.yml +0 -0
  11. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/.gitignore +0 -0
  12. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/.gitmodules +0 -0
  13. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/CLAUDE.md +0 -0
  14. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/CMakeLists.txt +0 -0
  15. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/LICENSE +0 -0
  16. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/README.md +0 -0
  17. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/bindings/CMakeLists.txt +0 -0
  18. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/bindings/ast_to_py.cpp +0 -0
  19. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/bindings/module.cpp +0 -0
  20. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/cmake/embed_font.cmake +0 -0
  21. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/examples/CMakeLists.txt +0 -0
  22. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/examples/eval_perf_benchmark.cpp +0 -0
  23. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/examples/manifold_cache_reuse.cpp +0 -0
  24. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/examples/minimal_debugger.cpp +0 -0
  25. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  26. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/.gitignore +0 -0
  27. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  28. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  29. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/README.md +0 -0
  30. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  31. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  32. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  33. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  34. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  35. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  36. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  37. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  38. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  39. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  40. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  41. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  42. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  43. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope_table.hpp +0 -0
  44. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  45. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  46. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  47. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/api.cpp +0 -0
  48. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  49. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  50. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  51. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  52. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  53. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  54. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  55. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  56. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  57. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  58. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  59. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  60. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  61. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  62. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  63. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  64. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/position.cpp +0 -0
  65. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  66. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  67. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  68. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  69. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  70. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  71. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  72. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  73. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  74. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  75. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  76. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  77. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  78. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  79. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  80. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  81. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  82. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  83. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  84. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_render_expression.cpp +0 -0
  85. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  86. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  87. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  88. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  89. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_strict_commas.cpp +0 -0
  90. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  91. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  92. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  93. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  94. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  95. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  96. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  97. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  98. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  99. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  100. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/coverage.hpp +0 -0
  101. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  102. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  103. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  104. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  105. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  106. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  107. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  108. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  109. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  110. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  111. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/export.hpp +0 -0
  112. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
  113. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  114. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/format_closure.hpp +0 -0
  115. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
  116. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  117. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  118. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  119. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  120. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  121. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  122. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  123. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  124. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  125. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  126. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/utf8.hpp +0 -0
  127. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/value.hpp +0 -0
  128. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  129. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/python/openscad_cpp_evaluator/__init__.py +0 -0
  130. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/resources/fonts/LICENSE +0 -0
  131. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/resources/fonts/LiberationSans-Bold.ttf +0 -0
  132. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/resources/fonts/LiberationSans-BoldItalic.ttf +0 -0
  133. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/resources/fonts/LiberationSans-Italic.ttf +0 -0
  134. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  135. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/CMakeLists.txt +0 -0
  136. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/booleans.cpp +0 -0
  137. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/builtins.hpp +0 -0
  138. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/call_args.cpp +0 -0
  139. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/color.cpp +0 -0
  140. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/control.cpp +0 -0
  141. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/dxf_dim.cpp +0 -0
  142. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/extrude.cpp +0 -0
  143. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/import.cpp +0 -0
  144. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/modifiers.cpp +0 -0
  145. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/primitives_2d.cpp +0 -0
  146. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/primitives_3d.cpp +0 -0
  147. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/registry.cpp +0 -0
  148. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/roof.cpp +0 -0
  149. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/segments.cpp +0 -0
  150. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/surface.cpp +0 -0
  151. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/topology.cpp +0 -0
  152. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/builtins/transforms.cpp +0 -0
  153. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/bytecode_compiler.cpp +0 -0
  154. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/bytecode_vm.cpp +0 -0
  155. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/colored_body.cpp +0 -0
  156. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/coverage.cpp +0 -0
  157. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/csg_generate.cpp +0 -0
  158. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/csg_resolve.cpp +0 -0
  159. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/css_colors.cpp +0 -0
  160. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/debug/debug_repl.cpp +0 -0
  161. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/debug_profile.cpp +0 -0
  162. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/eval_context.cpp +0 -0
  163. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/eval_error.cpp +0 -0
  164. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/eval_use.cpp +0 -0
  165. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/export.cpp +0 -0
  166. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/expr_eval.cpp +0 -0
  167. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/format_closure.cpp +0 -0
  168. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/import/dxf_import.cpp +0 -0
  169. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/import/mesh_import.cpp +0 -0
  170. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/import/surface_load.cpp +0 -0
  171. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/import/svg_import.cpp +0 -0
  172. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/manifold_cache.cpp +0 -0
  173. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/measure_geometry.cpp +0 -0
  174. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/mesh_check.cpp +0 -0
  175. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/stmt_eval.cpp +0 -0
  176. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/text/font_match.cpp +0 -0
  177. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/text/freetype_font_provider.cpp +0 -0
  178. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/user_calls.cpp +0 -0
  179. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/utf8.cpp +0 -0
  180. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/value.cpp +0 -0
  181. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/src/zip_stored.cpp +0 -0
  182. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/CMakeLists.txt +0 -0
  183. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_booleans.cpp +0 -0
  184. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_bytecode_compiler.cpp +0 -0
  185. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_children_separate.cpp +0 -0
  186. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_cli.cpp +0 -0
  187. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_control_flow.cpp +0 -0
  188. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_coverage.cpp +0 -0
  189. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_csg_tree.cpp +0 -0
  190. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_debug_hooks.cpp +0 -0
  191. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_dxf_svg_import.cpp +0 -0
  192. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_eval_context.cpp +0 -0
  193. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_export.cpp +0 -0
  194. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_expr_eval.cpp +0 -0
  195. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_extrude_roof.cpp +0 -0
  196. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_feature_detection.cpp +0 -0
  197. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_function_builtins.cpp +0 -0
  198. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_helpers.hpp +0 -0
  199. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_import_export.cpp +0 -0
  200. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_include_cache.cpp +0 -0
  201. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_manifold_cache.cpp +0 -0
  202. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_mesh_check.cpp +0 -0
  203. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_multi_color_merge.cpp +0 -0
  204. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_primitives.cpp +0 -0
  205. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_profiling.cpp +0 -0
  206. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_python_bindings.py +0 -0
  207. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_render_expr.cpp +0 -0
  208. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_scope_trail.cpp +0 -0
  209. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_scoping.cpp +0 -0
  210. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_surface.cpp +0 -0
  211. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_tail_calls.cpp +0 -0
  212. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_transforms.cpp +0 -0
  213. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_unexpected_args.cpp +0 -0
  214. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_use.cpp +0 -0
  215. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_value.cpp +0 -0
  216. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_viewport_params.cpp +0 -0
  217. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tests/test_zip_stored.cpp +0 -0
  218. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tools/cli/CMakeLists.txt +0 -0
  219. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tools/cli/cli_lib.cpp +0 -0
  220. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tools/cli/cli_lib.hpp +0 -0
  221. {openscad_cpp_evaluator-1.28.2 → openscad_cpp_evaluator-1.28.3}/tools/cli/main.cpp +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 1.28.2
3
+ Version: 1.28.3
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -2,6 +2,7 @@
2
2
 
3
3
  #include "openscad_cpp_evaluator/font_provider.hpp"
4
4
 
5
+ #include <functional>
5
6
  #include <string>
6
7
  #include <utility>
7
8
  #include <vector>
@@ -44,7 +45,10 @@ TextMeasurement measureText(FontProvider& fp, FontHandle handle, const std::stri
44
45
  // center/top for a vertical one, as in OpenSCAD; text with no ink is not
45
46
  // moved at all. Shared by textmetrics() (reports it) and text()
46
47
  // (applies it).
48
+ // `warn`, when given, receives OpenSCAD's own warning for an unknown
49
+ // halign/valign, and for valign="baseline" on a vertical run.
47
50
  std::pair<double, double> textAlignOffset(const std::string& halign, const std::string& valign,
48
- const TextMeasurement& m);
51
+ const TextMeasurement& m,
52
+ const std::function<void(const std::string&)>& warn = {});
49
53
 
50
54
  } // namespace oscadeval
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "1.28.2"
7
+ version = "1.28.3"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -782,7 +782,7 @@ Value objectOf(std::vector<std::pair<std::string, Value>> items) {
782
782
  // descent/offset/advance in real OpenSCAD's key order. Going through the
783
783
  // same measureText() the geometry goes through is the point: the numbers
784
784
  // a script positions against cannot disagree with what it draws.
785
- Value builtinTextmetrics(Evaluator& ev, const CallArgs& args) {
785
+ Value builtinTextmetrics(Evaluator& ev, const CallArgs& args, const oscad::Position* pos) {
786
786
  const std::string text = asStringOr(getArg(args, 0, "text", Value{std::string("")}), "");
787
787
  const double size = toDoubleLenient(getArg(args, 1, "size", Value{10.0}));
788
788
  // Positional indices, all of them: OpenSCAD's own signature is
@@ -804,7 +804,8 @@ Value builtinTextmetrics(Evaluator& ev, const CallArgs& args) {
804
804
  FontProvider& fp = ev.fontProvider();
805
805
  const FontHandle handle = fp.resolveFont(fontSpec);
806
806
  const TextMeasurement m = measureText(fp, handle, text, size, spacing, shape);
807
- const auto [offsetX, offsetY] = textAlignOffset(halign, valign, m);
807
+ const auto [offsetX, offsetY] = textAlignOffset(
808
+ halign, valign, m, [&](const std::string& w) { ev.warn(w, pos); });
808
809
 
809
810
  return objectOf({
810
811
  {"position", numList({offsetX + m.left, offsetY + m.bottom})},
@@ -1251,7 +1252,7 @@ Value evalBuiltinFunctionResolved(Evaluator& ev, BuiltinFnId id, const std::vect
1251
1252
 
1252
1253
  switch (id) {
1253
1254
  case BuiltinFnId::None: return Value{}; // unreachable: handled above
1254
- case BuiltinFnId::TextMetrics: return builtinTextmetrics(ev, args);
1255
+ case BuiltinFnId::TextMetrics: return builtinTextmetrics(ev, args, &node.position());
1255
1256
  case BuiltinFnId::FontMetrics: return builtinFontmetrics(ev, args);
1256
1257
  case BuiltinFnId::Abs: return Value{std::fabs(toDoubleLenient(getArg(args, 0, "x", Value{})))};
1257
1258
  case BuiltinFnId::Sign: {
@@ -60,7 +60,8 @@ CSGParams resolveText(Evaluator& ev, const oscad::ModularCall& node, EvalContext
60
60
  const double scale = size * (100.0 / 72.0) / fm.unitsPerEm;
61
61
  const int segs = std::max(2, fnSegmentsFromCtx(effCtx) / 2);
62
62
  const TextMeasurement m = measureText(fp, handle, text, size, spacing, shape);
63
- const auto [offsetX, offsetY] = textAlignOffset(halign, valign, m);
63
+ const auto [offsetX, offsetY] = textAlignOffset(
64
+ halign, valign, m, [&](const std::string& w) { ev.warn(w, &node.position()); });
64
65
 
65
66
  std::vector<Value> glyphs;
66
67
  glyphs.reserve(m.glyphs.size());
@@ -55,24 +55,39 @@ TextMeasurement measureText(FontProvider& fp, FontHandle handle, const std::stri
55
55
  return m;
56
56
  }
57
57
 
58
- // OpenSCAD's ShapeResults::calc_offsets_horiz/_vert. An unknown value (and,
59
- // for a vertical run, valign="baseline") does not move the text there
60
- // either; OpenSCAD also warns, which this does not.
58
+ // OpenSCAD's ShapeResults::calc_offsets_horiz/_vert, warnings included. An
59
+ // unknown value, or valign="baseline" on a vertical run, leaves that axis
60
+ // where it is. Text with no ink never gets this far there, so it never
61
+ // warns either.
61
62
  std::pair<double, double> textAlignOffset(const std::string& halign, const std::string& valign,
62
- const TextMeasurement& m) {
63
+ const TextMeasurement& m,
64
+ const std::function<void(const std::string&)>& warn) {
63
65
  if (!m.hasInk) return {0.0, 0.0};
66
+ auto unknown = [&](const char* param, const char* choices, const std::string& value) {
67
+ if (warn) {
68
+ warn(std::string("Unknown value for the ") + param + " parameter (use " + choices + "): '" + value + "'");
69
+ }
70
+ };
71
+ const char* hChoices = "\"left\", \"right\" or \"center\"";
72
+ const char* vChoices = "\"baseline\", \"bottom\", \"top\" or \"center\"";
64
73
  double offsetX = 0.0, offsetY = 0.0;
65
74
  if (m.vertical) {
66
75
  if (halign == "right") offsetX = -m.right;
67
76
  else if (halign == "left") offsetX = -m.left;
77
+ else if (halign != "center" && halign != "default") unknown("halign", hChoices, halign);
68
78
  if (valign == "center") offsetY = -m.advanceY / 2;
69
79
  else if (valign == "bottom") offsetY = -m.advanceY;
80
+ else if (valign == "baseline") {
81
+ if (warn) warn("Don't use valign=\"baseline\" with vertical layouts");
82
+ } else if (valign != "top" && valign != "default") unknown("valign", vChoices, valign);
70
83
  } else {
71
84
  if (halign == "center") offsetX = -0.5 * m.advanceX;
72
85
  else if (halign == "right") offsetX = -m.advanceX;
86
+ else if (halign != "left" && halign != "default") unknown("halign", hChoices, halign);
73
87
  if (valign == "top") offsetY = -m.ascent;
74
88
  else if (valign == "center") offsetY = -(m.ascent + m.descent) / 2;
75
89
  else if (valign == "bottom") offsetY = -m.descent;
90
+ else if (valign != "baseline" && valign != "default") unknown("valign", vChoices, valign);
76
91
  }
77
92
  return {offsetX, offsetY};
78
93
  }
@@ -126,6 +126,33 @@ TEST(Textmetrics, VerticalRunAlignsByItsOwnRules) {
126
126
  EXPECT_NEAR(vec(rb, "offset", 1), 39.1032, 1e-3);
127
127
  }
128
128
 
129
+ // OpenSCAD 2026.02.01's warnings, verbatim. Inkless text never reaches
130
+ // its alignment code there, so it does not warn.
131
+ TEST(Text, UnknownAlignmentWarnsAsOpenscadDoes) {
132
+ const std::pair<const char*, std::vector<std::string>> cases[] = {
133
+ {"m = textmetrics(\"ab\", halign=\"middle\");",
134
+ {"Unknown value for the halign parameter (use \"left\", \"right\" or \"center\"): 'middle'"}},
135
+ {"m = textmetrics(\"ab\", valign=\"mid\");",
136
+ {"Unknown value for the valign parameter (use \"baseline\", \"bottom\", \"top\" or \"center\"): 'mid'"}},
137
+ {"m = textmetrics(\"ab\", direction=\"ttb\", valign=\"baseline\");",
138
+ {"Don't use valign=\"baseline\" with vertical layouts"}},
139
+ {"text(\"ab\", direction=\"ttb\", halign=\"x\", valign=\"y\");",
140
+ {"Unknown value for the halign parameter (use \"left\", \"right\" or \"center\"): 'x'",
141
+ "Unknown value for the valign parameter (use \"baseline\", \"bottom\", \"top\" or \"center\"): 'y'"}},
142
+ {"m = textmetrics(\" \", halign=\"bogus\");", {}},
143
+ {"m = textmetrics(\"ab\", halign=\"default\", valign=\"default\");", {}},
144
+ {"m = textmetrics(\"ab\", direction=\"ttb\", valign=\"top\");", {}},
145
+ };
146
+ for (const auto& [src, want] : cases) {
147
+ std::vector<std::string> log;
148
+ evalSrc(src, [&](const std::string& m) { log.push_back(m); });
149
+ ASSERT_EQ(log.size(), want.size()) << src;
150
+ for (size_t i = 0; i < want.size(); ++i) {
151
+ EXPECT_EQ(log[i], "WARNING: " + want[i] + " in file <string>, line 1") << src;
152
+ }
153
+ }
154
+ }
155
+
129
156
  TEST(Textmetrics, InklessTextIsNotAligned) {
130
157
  Evaluator ev;
131
158
  Value v = asExpr("textmetrics(\" \", size=10, halign=\"right\")", ev);
@@ -55,7 +55,7 @@ wheels = [
55
55
 
56
56
  [[package]]
57
57
  name = "openscad-cpp-evaluator"
58
- version = "1.28.2"
58
+ version = "1.28.3"
59
59
  source = { editable = "." }
60
60
  dependencies = [
61
61
  { name = "numpy" },