From 26e0d59cf1045fb36315e4fb12b0e4a78f8bfd43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn?= Date: Thu, 5 Mar 2026 13:09:40 +0100 Subject: [PATCH 1/2] Support configurable default font and size Add default_font and default_size options to Document.create, rendered as w:docDefaults in styles.xml. Defaults to Arial 12pt. Adjust heading sizes for better visual hierarchy. Styling based on uutilsynet guidance for accessible documents: https://www.uutilsynet.no/veiledning/rettleiar-universelt-utforma-word-og-pdf-dokument/1636 --- lib/notare/document.rb | 21 +++++++++++++-------- lib/notare/package.rb | 7 ++++++- lib/notare/version.rb | 2 +- lib/notare/xml/styles_xml.rb | 28 +++++++++++++++++++++++++++- 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/lib/notare/document.rb b/lib/notare/document.rb index e1ed5b9..ec8b73f 100644 --- a/lib/notare/document.rb +++ b/lib/notare/document.rb @@ -4,16 +4,21 @@ module Notare class Document include Builder - attr_reader :nodes, :styles, :table_styles, :hyperlinks + DEFAULT_FONT = "Arial" + DEFAULT_SIZE = 12 - def self.create(path, &block) - doc = new + attr_reader :nodes, :styles, :table_styles, :hyperlinks, :default_font, :default_size + + def self.create(path, default_font: DEFAULT_FONT, default_size: DEFAULT_SIZE, &block) + doc = new(default_font: default_font, default_size: default_size) block.call(doc) doc.save(path) doc end - def initialize + def initialize(default_font: DEFAULT_FONT, default_size: DEFAULT_SIZE) + @default_font = default_font + @default_size = default_size @nodes = [] @format_stack = [] @current_target = nil @@ -101,12 +106,12 @@ module Notare def register_built_in_styles # Headings (spacing_before ensures they're rendered as paragraph styles) - define_style :heading1, size: 24, bold: true, spacing_before: 240, spacing_after: 120 - define_style :heading2, size: 18, bold: true, spacing_before: 200, spacing_after: 100 + define_style :heading1, size: 20, bold: true, spacing_before: 240, spacing_after: 120 + define_style :heading2, size: 16, bold: true, spacing_before: 200, spacing_after: 100 define_style :heading3, size: 14, bold: true, spacing_before: 160, spacing_after: 80 define_style :heading4, size: 12, bold: true, spacing_before: 120, spacing_after: 60 - define_style :heading5, size: 11, bold: true, italic: true, spacing_before: 100, spacing_after: 40 - define_style :heading6, size: 10, bold: true, italic: true, spacing_before: 80, spacing_after: 40 + define_style :heading5, size: 12, bold: true, italic: true, spacing_before: 100, spacing_after: 40 + define_style :heading6, size: 12, italic: true, spacing_before: 80, spacing_after: 40 # Other built-in styles define_style :title, size: 26, bold: true, align: :center diff --git a/lib/notare/package.rb b/lib/notare/package.rb index 8b7ba1b..e127e51 100644 --- a/lib/notare/package.rb +++ b/lib/notare/package.rb @@ -59,7 +59,12 @@ module Notare end def styles_xml - Xml::StylesXml.new(@document.styles, @document.table_styles).to_xml + Xml::StylesXml.new( + @document.styles, + @document.table_styles, + default_font: @document.default_font, + default_size: @document.default_size + ).to_xml end def numbering_xml diff --git a/lib/notare/version.rb b/lib/notare/version.rb index d5c8336..041d5f4 100644 --- a/lib/notare/version.rb +++ b/lib/notare/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Notare - VERSION = "0.0.6" + VERSION = "0.0.7" end diff --git a/lib/notare/xml/styles_xml.rb b/lib/notare/xml/styles_xml.rb index 5cb57dc..f408526 100644 --- a/lib/notare/xml/styles_xml.rb +++ b/lib/notare/xml/styles_xml.rb @@ -18,9 +18,11 @@ module Notare right: "right" }.freeze - def initialize(styles, table_styles = {}) + def initialize(styles, table_styles = {}, default_font: nil, default_size: nil) @styles = styles @table_styles = table_styles + @default_font = default_font + @default_size = default_size end def to_xml @@ -28,6 +30,8 @@ module Notare xml.styles("xmlns:w" => NAMESPACE) do xml.parent.namespace = xml.parent.namespace_definitions.find { |ns| ns.prefix == "w" } + render_doc_defaults(xml) if @default_font || @default_size + @styles.each_value do |style| render_style(xml, style) end @@ -44,6 +48,28 @@ module Notare private + def render_doc_defaults(xml) + xml["w"].docDefaults do + xml["w"].rPrDefault do + xml["w"].rPr do + if @default_font + xml["w"].rFonts( + "w:ascii" => @default_font, + "w:hAnsi" => @default_font, + "w:eastAsia" => @default_font, + "w:cs" => @default_font + ) + end + if @default_size + half_points = (@default_size * 2).to_i + xml["w"].sz("w:val" => half_points.to_s) + xml["w"].szCs("w:val" => half_points.to_s) + end + end + end + end + end + def render_style(xml, style) style_type = style.paragraph_properties? ? "paragraph" : "character" -- 2.40.1 From e9375529132a038e6be60fb16fab56566817b64e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn?= Date: Thu, 5 Mar 2026 13:43:15 +0100 Subject: [PATCH 2/2] Fix RuboCop Style/SelectByKind and Style/PredicateWithKind offenses --- lib/notare/document.rb | 2 +- test/document_test.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/notare/document.rb b/lib/notare/document.rb index ec8b73f..c26d84f 100644 --- a/lib/notare/document.rb +++ b/lib/notare/document.rb @@ -56,7 +56,7 @@ module Notare end def lists - @nodes.select { |n| n.is_a?(Nodes::List) } + @nodes.grep(Nodes::List) end def uses_lists? diff --git a/test/document_test.rb b/test/document_test.rb index 6661f63..267d7f1 100644 --- a/test/document_test.rb +++ b/test/document_test.rb @@ -69,6 +69,6 @@ class DocumentTest < Minitest::Test doc.table { doc.tr { doc.td "Cell" } } assert_equal 2, doc.lists.count - assert(doc.lists.all? { |l| l.is_a?(Notare::Nodes::List) }) + assert(doc.lists.all?(Notare::Nodes::List)) end end -- 2.40.1