note description: "[ API to handle taxonomy vocabularies and terms. ]" date: "$Date$" revision: "$Revision$" class CMS_TAXONOMY_API inherit CMS_MODULE_API redefine initialize end REFACTORING_HELPER create make feature {NONE} -- Initialization initialize -- do Precursor -- Create the node storage for type blog if attached storage.as_sql_storage as l_storage_sql then create {CMS_TAXONOMY_STORAGE_SQL} taxonomy_storage.make (l_storage_sql) else create {CMS_TAXONOMY_STORAGE_NULL} taxonomy_storage.make end end feature {CMS_MODULE} -- Access nodes storage. taxonomy_storage: CMS_TAXONOMY_STORAGE_I feature -- Access node vocabulary_count: INTEGER_64 -- Number of vocabulary. do Result := taxonomy_storage.vocabulary_count end vocabularies (a_limit: NATURAL_32; a_offset: NATURAL_32): CMS_VOCABULARY_COLLECTION -- List of vocabularies ordered by weight and limited by limit and offset. do Result := taxonomy_storage.vocabularies (a_limit, a_offset) end vocabulary (a_id: INTEGER): detachable CMS_VOCABULARY -- Vocabulary associated with id `a_id'. require valid_id: a_id > 0 do Result := taxonomy_storage.vocabulary (a_id) end vocabularies_for_type (a_type_name: READABLE_STRING_GENERAL): detachable CMS_VOCABULARY_COLLECTION -- Vocabularies associated with content type `a_type_name'. do Result := taxonomy_storage.vocabularies_for_type (a_type_name) end fill_vocabularies_with_terms (a_vocab: CMS_VOCABULARY) -- Fill `a_vocab' with associated terms. do reset_error a_vocab.terms.wipe_out if attached terms (a_vocab, 0, 0) as lst then across lst as ic loop a_vocab.extend (ic.item) end end end term_count_from_vocabulary (a_vocab: CMS_VOCABULARY): INTEGER_64 -- Number of terms from vocabulary `a_vocab'. require has_id: a_vocab.has_id do Result := taxonomy_storage.term_count_from_vocabulary (a_vocab) end terms_of_entity (a_type_name: READABLE_STRING_GENERAL; a_entity: READABLE_STRING_GENERAL; a_vocabulary: detachable CMS_VOCABULARY): detachable CMS_TERM_COLLECTION -- Terms related to `(a_type_name,a_entity)', and if `a_vocabulary' is set -- constrain to be part of `a_vocabulary'. do Result := taxonomy_storage.terms_of_entity (a_type_name, a_entity, a_vocabulary) end terms (a_vocab: CMS_VOCABULARY; a_limit: NATURAL_32; a_offset: NATURAL_32): CMS_TERM_COLLECTION -- List of terms ordered by weight and limited by limit and offset. require has_id: a_vocab.has_id do Result := taxonomy_storage.terms (a_vocab, a_limit, a_offset) end term_by_id (a_tid: INTEGER): detachable CMS_TERM do Result := taxonomy_storage.term_by_id (a_tid) end term_by_text (a_term_text: READABLE_STRING_GENERAL; a_vocabulary: detachable CMS_VOCABULARY): detachable CMS_TERM -- Term with text `a_term_text', included in vocabulary `a_vocabulary' if provided. do Result := taxonomy_storage.term_by_text (a_term_text, a_vocabulary) end feature -- Write save_vocabulary (a_voc: CMS_VOCABULARY) do reset_error taxonomy_storage.save_vocabulary (a_voc) error_handler.append (taxonomy_storage.error_handler) end save_term (a_term: CMS_TERM; voc: CMS_VOCABULARY) do reset_error taxonomy_storage.save_term (a_term, voc) error_handler.append (taxonomy_storage.error_handler) end associate_term_with_entity (a_term: CMS_TERM; a_type_name: READABLE_STRING_GENERAL; a_entity: READABLE_STRING_GENERAL) -- Associate term `a_term' with `(a_type_name, a_entity)'. do reset_error taxonomy_storage.associate_term_with_entity (a_term, a_type_name, a_entity) error_handler.append (taxonomy_storage.error_handler) end unassociate_term_from_entity (a_term: CMS_TERM; a_type_name: READABLE_STRING_GENERAL; a_entity: READABLE_STRING_GENERAL) -- Unassociate term `a_term' from `(a_type_name, a_entity)'. do reset_error taxonomy_storage.unassociate_term_from_entity (a_term, a_type_name, a_entity) error_handler.append (taxonomy_storage.error_handler) end associate_vocabulary_with_type (a_voc: CMS_VOCABULARY; a_type_name: READABLE_STRING_GENERAL) -- Associate vocabulary `a_voc' with type `a_type_name'. require existing_term: a_voc.has_id do reset_error taxonomy_storage.associate_vocabulary_with_type (a_voc, a_type_name) error_handler.append (taxonomy_storage.error_handler) end unassociate_vocabulary_with_type (a_voc: CMS_VOCABULARY; a_type_name: READABLE_STRING_GENERAL) -- Un-associate vocabulary `a_voc' from type `a_type_name'. require existing_term: a_voc.has_id do reset_error taxonomy_storage.unassociate_vocabulary_with_type (a_voc, a_type_name) error_handler.append (taxonomy_storage.error_handler) end feature -- Helpers splitted_string (s: READABLE_STRING_32; sep: CHARACTER): LIST [READABLE_STRING_32] -- Splitted string from `s' with separator `sep', and support '"..."' wrapping. local i,j,n,b: INTEGER t: STRING_32 do create {ARRAYED_LIST [READABLE_STRING_32]} Result.make (1) Result.compare_objects from i := 1 b := 1 n := s.count create t.make_empty until i > n loop if s[i].is_space then if not t.is_empty then t.append_character (s[i]) end elseif s[i] = sep then t.left_adjust t.right_adjust if t.count > 2 and t.starts_with_general ("%"") and t.ends_with_general ("%"") then t.remove_head (1) t.remove_tail (1) end Result.force (t) create t.make_empty elseif s[i] = '"' then j := s.index_of ('"', i + 1) if j > 0 then t.append (s.substring (i, j)) end i := j else t.append_character (s[i]) end i := i + 1 end if not t.is_empty then t.left_adjust t.right_adjust Result.force (t) end end end