Class: Uniword::Wordprocessingml::StyleCleanup

Inherits:
Object
  • Object
show all
Defined in:
lib/uniword/wordprocessingml/style_cleanup.rb

Overview

Removes styles from a document's style definitions — Word's Styles-pane management as an API.

#remove_unused deletes styles that no content references, directly (pStyle/rStyle/tblStyle in body, headers, footers, notes, comments) or transitively (basedOn/link/next chains from a used style, numbering level pStyle). Default styles (w:default="1") are never removed.

Examples:

Declutter a document

cleanup = StyleCleanup.new(document)
removed = cleanup.remove_unused # => ["ObsoleteStyle", ...]

Instance Method Summary collapse

Constructor Details

#initialize(document) ⇒ StyleCleanup

Returns a new instance of StyleCleanup.

Parameters:



19
20
21
# File 'lib/uniword/wordprocessingml/style_cleanup.rb', line 19

def initialize(document)
  @document = document
end

Instance Method Details

#remove?(style_id) ⇒ Boolean

Remove one style by id (unless protected).

Parameters:

  • style_id (String)

    Style id (w:styleId)

Returns:

  • (Boolean)

    true when the style was removed



27
28
29
30
31
32
33
# File 'lib/uniword/wordprocessingml/style_cleanup.rb', line 27

def remove?(style_id)
  return false if protected_id?(style_id)

  before = styles.size
  styles.delete_if { |style| style.styleId == style_id }
  styles.size < before
end

#remove_unusedArray<String>

Remove every unreferenced style.

Returns:

  • (Array<String>)

    Ids of removed styles



46
47
48
49
50
# File 'lib/uniword/wordprocessingml/style_cleanup.rb', line 46

def remove_unused
  ids = unused_ids
  ids.each { |id| remove?(id) }
  ids
end

#unused_idsArray<String>

Ids of styles no content references.

Returns:

  • (Array<String>)

    Unreferenced, unprotected style ids



38
39
40
41
# File 'lib/uniword/wordprocessingml/style_cleanup.rb', line 38

def unused_ids
  used = used_ids
  styles.filter_map(&:styleId).uniq - used - protected_ids
end