Skip to main content
aboutsummaryrefslogblamecommitdiffstats
blob: cc5918b94fcce2cd43e2977f066f741f3582f07f (plain) (tree)




































































































































































































































































                                                                                                                                                            
module BibTeX2DocBook;
create OUT : DocBook from IN : BibTeX;


-------------------------------------------------------------------------------
-- HELPERS --------------------------------------------------------------------
-------------------------------------------------------------------------------

-- This helper builds the set of distinct authors referenced in the input BibTeX
-- model.
-- Built set is sorted by author name.
-- RETURN: Sequence(BibTeX!Author)
helper def: authorSet : Sequence(BibTeX!Author) = BibTeX!Author.allInstances()->iterate(e; ret : Sequence(BibTeX!Author) = Sequence {} |
				if ret->collect(e | e.author)->includes(e.author) then
					ret
				else
					ret->including(e)
				endif
			)->sortedBy(e | e.author);

-- This helper builds the set of distinct titles referenced in the input BibTeX
-- model.
-- Built set is sorted by title.
-- RETURN: Sequence(BibTeX!TitledEntry)
helper def: titledEntrySet : Sequence(BibTeX!TitledEntry) = BibTeX!TitledEntry.allInstances()->iterate(e; ret : Sequence(BibTeX!TitledEntry) = Sequence {} |
				if ret->collect(e | e.title)->includes(e.title) then
					ret
				else
					ret->including(e)
				endif
			)->sortedBy(e | e.title);

-- This helper builds the set of distinct journals referenced in the input BibTeX
-- model.
-- Built set is sorted by journal name.
-- RETURN: Sequence(BibTeX!Article)
helper def: articleSet : Sequence(BibTeX!Article) = BibTeX!Article.allInstances()->iterate(e; ret : Sequence(BibTeX!Article) = Sequence {} |
				if ret->collect(e | e.journal)->includes(e.journal) then
					ret
				else
					ret->including(e)
				endif
			)->sortedBy(e | e.journal);

-- This helper builds a string containing all information on a given BibTeXEntry.
-- Content of the generated string depends on the entry type.
-- IN: BibTeX!BibTeXEntry
-- RETURN: Sequence(BibTeX!Author)
helper context BibTeX!BibTeXEntry def: buildEntryPara() : String =
	'[' + self.id + ']'
	+ ' ' + self.oclType().name
	+ (if self.oclIsKindOf(BibTeX!TitledEntry) then ' ' + self.title else '' endif)
	+ (if self.oclIsKindOf(BibTeX!AuthoredEntry) 
	   then self.authors->iterate(e; str : String = '' | str + ' ' + e.author)
	   else ''
	   endif)
	+ (if self.oclIsKindOf(BibTeX!DatedEntry) then ' ' + self.year else '' endif)
	+ (if self.oclIsKindOf(BibTeX!BookTitledEntry) then ' ' + self.booktitle else '' endif)
	+ (if self.oclIsKindOf(BibTeX!ThesisEntry) then ' ' +  self.school else '' endif)
	+ (if self.oclIsKindOf(BibTeX!Article) then ' ' + self.journal else '' endif)
	+ (if self.oclIsKindOf(BibTeX!Unpublished) then ' ' + self.note else '' endif)
	+ (if self.oclIsKindOf(BibTeX!Book) then ' ' + self.publisher else '' endif)
	+ (if self.oclIsKindOf(BibTeX!InBook) then ' ' + self.chapter.toString() else '' endif)
	;


-------------------------------------------------------------------------------
-- RULES ----------------------------------------------------------------------
-------------------------------------------------------------------------------

-- Rule 'Main'
-- This rule generates the structure of the DocBook model from a BibTeXFile element
rule Main {
	from
        bib : BibTeX!BibTeXFile
	to 
		doc : DocBook!DocBook (
			books <- boo
		),
		boo : DocBook!Book (
			articles <- art
		),
		art : DocBook!Article (
			title <- 'BibTeXML to DocBook',
			sections_1 <- Sequence{se1, se2, se3, se4}
		),
		se1 : DocBook!Sect1 (
			title <- 'References List',
			paras <- BibTeX!BibTeXEntry.allInstances()->sortedBy(e | e.id)
		),
		se2 : DocBook!Sect1 (
			title <- 'Authors list',
			paras <- thisModule.authorSet
		),
		se3 : DocBook!Sect1 (
			title <- 'Titles List',
			paras <- thisModule.titledEntrySet->collect(e | thisModule.resolveTemp(e, 'title_para'))
		),
		se4 : DocBook!Sect1 (
			title <- 'Journals List',
			paras <- thisModule.articleSet->collect(e | thisModule.resolveTemp(e, 'journal_para'))
		)
}

-- Rule 'Author'
-- This rule generates a section_2 paragraph for each distinct author.
rule Author {
	from
		a : BibTeX!Author (
			  thisModule.authorSet->includes(a)
			)
	to
		p1 : DocBook!Para (
			content <- a.author
		)
}

-- Rule 'UntitledEntry'
-- This rule generates a section_1 paragraph for each untitled entry.
rule UntitledEntry {
	from
		e : BibTeX!BibTeXEntry (
			not e.oclIsKindOf(BibTeX!TitledEntry)
		)
	to
		p : DocBook!Para (
			content <- e.buildEntryPara()
		)
}

-- Rule 'TitledEntry_Title_NoArticle'
-- [titledEntrySet contains a subset of TitledEntry, so that each title
-- appears only once in the set]
-- For each "no article" titled entry that belongs to titledEntrySet,
-- this rule generates:
--   * a section_1 paragraph;
--   * a section_3 paragraph.
rule TitledEntry_Title_NoArticle {
	from
		e : BibTeX!TitledEntry (
			thisModule.titledEntrySet->includes(e) and
			not e.oclIsKindOf(BibTeX!Article)
		)
	to
		entry_para : DocBook!Para (
			content <- e.buildEntryPara()
		),
		title_para : DocBook!Para (
			content <- e.title
		)
}

-- Rule 'TitledEntry_NoTitle_NoArticle'
-- [titledEntrySet contains a subset of TitledEntry, so that each title
-- appears only once in the set]
-- For each "no article" titled entry that does not belong to titledEntrySet,
-- this rule generates:
--   * a section_1 paragraph;
rule TitledEntry_NoTitle_NoArticle {
	from
		e : BibTeX!TitledEntry (
			not thisModule.titledEntrySet->includes(e) and
			not e.oclIsKindOf(BibTeX!Article)
		)
	to
		entry_para : DocBook!Para (
			content <- e.buildEntryPara()
		)
}

-- Rule 'Article_Title_Journal'
-- [titledEntrySet contains a subset of TitledEntry, so that each title
-- appears only once in the set]
-- [articleSet contains a subset of Article, so that each journal
-- appears only once in the set]
-- For each article entry that belongs to articleSet, this rule generates:
--   * a section_1 paragraph;
--   * a section_3 paragraph;
--   * a section_4 paragraph.
rule Article_Title_Journal {
	from
		e : BibTeX!Article (
			thisModule.titledEntrySet->includes(e) and
			thisModule.articleSet->includes(e)
		)
	to
		entry_para : DocBook!Para (
			content <- e.buildEntryPara()
		),
		title_para : DocBook!Para (
			content <- e.title
		),
		journal_para : DocBook!Para (
			content <- e.journal
		)
}

-- Rule 'Article_NoTitle_Journal'
-- [titledEntrySet contains a subset of TitledEntry, so that each title
-- appears only once in the set]
-- [articleSet contains a subset of Article, so that each journal
-- appears only once in the set]
-- For each article entry that belongs to articleSet, this rule generates:
--   * a section_1 paragraph;
--   * a section_4 paragraph.
rule Article_NoTitle_Journal {
	from
		e : BibTeX!Article (
			not thisModule.titledEntrySet->includes(e) and
			thisModule.articleSet->includes(e)
		)
	to
		entry_para : DocBook!Para (
			content <- e.buildEntryPara()
		),
		journal_para : DocBook!Para (
			content <- e.journal
		)
}

-- Rule 'Article_Title_NoJournal'
-- [titledEntrySet contains a subset of TitledEntry, so that each title
-- appears only once in the set]
-- [articleSet contains a subset of Article, so that each journal
-- appears only once in the set]
-- For each article entry that belongs to articleSet, this rule generates:
--   * a section_1 paragraph;
--   * a section_3 paragraph.
rule Article_Title_NoJournal {
	from
		e : BibTeX!Article (
			thisModule.titledEntrySet->includes(e) and
			not thisModule.articleSet->includes(e)
		)
	to
		entry_para : DocBook!Para (
			content <- e.buildEntryPara()
		),
		title_para : DocBook!Para (
			content <- e.title
		)
}

-- Rule 'Article_NoTitle_NoJournal'
-- [titledEntrySet contains a subset of TitledEntry, so that each title
-- appears only once in the set]
-- [articleSet contains a subset of Article, so that each journal
-- appears only once in the set]
-- For each article entry that belongs to articleSet, this rule generates:
--   * a section_1 paragraph;
rule Article_NoTitle_NoJournal {
	from
		e : BibTeX!Article (
			not thisModule.titledEntrySet->includes(e) and
			not thisModule.articleSet->includes(e)
		)
	to
		entry_para : DocBook!Para (
			content <- e.buildEntryPara()
		)
}

Back to the top