[comment encoding = UTF-8 /]
[module latexQueries('http://www.eclipse.org/intent/markup/0.7','http://www.eclipse.org/intent/markup/generator/0.7')]

[query public fileName(d : GenLatexDocument) : String = 
  filename
/]

[query public autoRotateImage(e : OclAny) : Boolean = false /]


[query public decode(s : Entity) : String =
  invoke('org.eclipse.mylyn.docs.intent.markup.gen.services.DecodingService', 'decode(org.eclipse.mylyn.docs.intent.markup.markup.Entity)', Sequence{s}) /]

[query public escapeTex(t : String) : String =
  invoke('org.eclipse.mylyn.docs.intent.markup.gen.services.DecodingService', 'escape(java.lang.String)', Sequence{t}) /]

[query public listEnv(l : List) : String =
  if (l.listType = ListType::BULLETED) then
  'itemize'
  else
    if (l.listType = ListType::NUMERIC) then
      'enumerate'
    else
      'unknown'
    endif
  endif
/]
 
[query public fileName(d : Document) : String = 
  d.eResource().toString().tokenize('/')->last().replace('.textile.*$', '.tex')
/]

[query public drop(s : Sequence(OclAny), n : Integer) : Sequence(OclAny) =
  s->subSequence(n+1, s->size())  /]
  
[query public butLast(s : Sequence(TableCell)) : Sequence(TableCell) =
  s->subSequence(1, s->size() - 1) /]


[query public getImageWidth(arg0 : Image) : String
	= invoke('org.eclipse.mylyn.docs.intent.markup.gen.files.ImageUtility', 'getImageWidth(org.eclipse.mylyn.docs.intent.markup.markup.Image)', Sequence{arg0}) /]
	

[query public getImageLocationPath(arg0 : Image) : String
	= invoke('org.eclipse.mylyn.docs.intent.markup.gen.files.ImageUtility', 'getImageLocationPath(org.eclipse.mylyn.docs.intent.markup.markup.Image)', Sequence{arg0}) /]
	

[query public hasLongLandscapeRatio(arg0 : Image) : Boolean
	= invoke('org.eclipse.mylyn.docs.intent.markup.gen.files.ImageUtility', 'hasLongLandscapeRatio(org.eclipse.mylyn.docs.intent.markup.markup.Image)', Sequence{arg0}) /]


[query public hasLandscapeRatio(arg0 : Image) : Boolean
	= invoke('org.eclipse.mylyn.docs.intent.markup.gen.files.ImageUtility', 'hasLandscapeRatio(org.eclipse.mylyn.docs.intent.markup.markup.Image)', Sequence{arg0}) /]

[query public getWidthRatio(arg0 : Image) : Real
	= invoke('org.eclipse.mylyn.docs.intent.markup.gen.files.ImageUtility', 'getWidthRatio(org.eclipse.mylyn.docs.intent.markup.markup.Image)', Sequence{arg0}) /]



[query public isSmall(arg0 : Image) : Boolean
	= invoke('org.eclipse.mylyn.docs.intent.markup.gen.files.ImageUtility', 'isSmall(org.eclipse.mylyn.docs.intent.markup.markup.Image)', Sequence{arg0}) /]


[query public exists(arg0 : Image) : Boolean
	= invoke('org.eclipse.mylyn.docs.intent.markup.gen.files.ImageUtility', 'exists(org.eclipse.mylyn.docs.intent.markup.markup.Image)', Sequence{arg0}) /]

