
// make selection into a fraction using Superscript and Subscript

int fraction_entry(int entry, int subcode)
{
 int b1, b2, c, f, i;
 string s1 = "", s2 = "";
 int s = 5; // percentage shift

 b1 = bmcreate("fraction_b1");
 b2 = bmcreate("fraction_b2");

 if(zoneorder())
  setbmtozone(b1, b2);
 else
 {
  setbmtocaret(b1);
  bmmove(b1, 0, 1);
  setcarettobm(b1);
  setbmtocaret(b2);
  bmmove(b2, 1, 1);
  setzonetobm(b2);
 }

 // read 'num'
 while((c = bmchar(b1)) != '/' && bmchar(b1) != 164 && bmcmp(b1, b2))
 {
  bmmove(b1, 1, 0);
  s1 += chars(c);
 }
 // if there is a / read 'den'
 if(c == '/' || c == 164)
 {
  bmmove(b1, 1, 0);
  while(bmcmp(b1, b2))
  {
   s2 += chars(bmchar(b1));
   bmmove(b1, 1, 0);
  }
 }

 // do both 'num' and 'den' both exist?
 if(!slen(s1) || !slen(s2))
   bbc_vdu(7);
 else
 {
  // delete the fraction
  type("{Delete}");

  // type 'num' in Superscript
  if(!(geteffect() & SUPERSCRIPT))
   seteffect(SUPERSCRIPT);
  setbaseshift(-s * 0x10000/100);
  type(s1);
  seteffect(SUPERSCRIPT);
  setbaseshift(0);

  // type fraction character from Sidney or normal /
  caretcontext();
  f = getfont();
  i = 0;
  while(getfontname(i++, s1))
   if(s1 == "Sidney")
    break;
  if(s1 == "Sidney")
  {
   setfont(i - 1);
   type(chars(164));
   setfont(f);
  }
  else
   type("/");

  // type 'den' in Subscript
  seteffect(SUBSCRIPT);
  setbaseshift(s * 0x10000/100);
  type(s2);
  seteffect(SUBSCRIPT);
  setbaseshift(0);
 }
 bmdelete(b1);
 bmdelete(b2);
 return(0);
}


// shade or un-shade 'Fraction' menu entry

int fraction_flags(int entry, string &text)
{
 return((activetype(TEXTFRAME) <= 1) ? SHADED : 0);
}


// add 'Make fraction' option to Applet menu

void main(void)
{
 string s = "{FRACTION_01}";

 script_menu_initialise();
 addentry_menu(script_handle,"fraction_entry","fraction_flags","","","{FRACTION_00}");

 if(isdefmacro("fraction") == -1)
 {
  translate(s);
 defmacro2(0, "fraction", "{if(zoneorder()) fraction_entry(0, 0);else bbc_vdu(7)}", "fraction", s);
 }
}
