// Fluff



void fluff_searchandreplace(int bm,string & s,string & r,int flags)
{
 int bm1;
 int bm2;
 int bm3;

 bm1=bmcreate("fluff_bm1");
 bm2=bmcreate("fluff_bm2");
 bm3=bmcreate("fluff_bm3");

 setbmtobm(bm1,bm);
 setbmtobm(bm2,bm);

 bmmove(bm1,0,4);
 bmmove(bm2,1,4);
 setbmtobm(bm3,bm2);
    
 while(1)
 {
  if(bmsearch(bm1,bm2,s,flags)==0)
  {
   setcarettobm(bm1);
   setzonetobm(bm2);
   replace(r,flags);
   setbmtobm(bm1,bm2);
   setbmtobm(bm2,bm3);
  }
  else break;
 }

 bmdelete(bm1);
 bmdelete(bm2);
 bmdelete(bm3);
}



void fluff_it(string & s,string & r)
{
 int bm1;

 bm1=bmcreate("fluff_point");

 setbmtocaret(bm1);

 fluff_searchandreplace(bm1,s,r,1<<4);

 setcarettobm(bm1);

 bmdelete(bm1);
}




void fluff_rules(void)
{
 fluff_it("  "," ");          // --double => single space
 fluff_it("....","...");      // --quadruple => triple period
 fluff_it("...","");         // --triple period => ellipsis
 fluff_it(" ","");          // --delete space before ellipsis
 fluff_it("..",".");          // --double => single period
 fluff_it(" .",".");          // --delete space before period
 fluff_it(",,",",");          // --double => single comma
 fluff_it(" ,",",");          // --delete space before comma
 fluff_it(",\\n",", ");       // --comma + paragraph mark => comma + space
 fluff_it(" ;",";");          // --delete space before semicolon
 fluff_it(";;",";");          // --double => single semicolon
 fluff_it(" :",":");          // --delete space before colon
 fluff_it("::",":");          // --double => single colon
 fluff_it(",.",".");          // --comma + period => period
 fluff_it(",;",";");          // --comma + semicolon => semicolon
 fluff_it(",:",":");          // --comma + colon => colon
 fluff_it(".;",";");          // --period + semicolon => semicolon
 fluff_it(".:",":");          // --period + colon => colon
 fluff_it(";:",":");          // --semicolon + colon => colon
 fluff_it("\\n\\n","\\n");    // --double => single paragraph mark
 fluff_it("\\l\\l","\\l");    // --double => single forced linebreak
 fluff_it(" - ","");         // --space + hyphen + space => en-dash
 fluff_it("--","");          // --double hyphen => en-dash
 fluff_it("","");          // --double en-dash => em-dash
 fluff_it("-","");          // --en-dash + hyphen => en-dash
 fluff_it("-","");          // --em-dash + hyphen => em-dash
 fluff_it("","");          // --em-dash + en-dash => em-dash
 fluff_it("","");          // --double => single em-dash
 fluff_it(" \\t","\\t");      // --delete space before tab
 fluff_it("\\t ","\\t");      // --delete space after tab
 fluff_it(" \\l","\\l");      // --delete space before forced linebreak
 fluff_it("\\l ","\\l");      // --delete space after forced linebreak
 fluff_it(" \\n","\\n");      // --delete space before paragraph mark
 fluff_it("\\n ","\\n");      // --delete space after paragraph mark
 fluff_it("\\t\\l","\\l");    // --delete tab before forced linebreak
 fluff_it("\\t\\n","\\n");    // --delete tab before paragraph mark
 fluff_it("\\l\\n","\\n");    // --forced linebreak+paragraph mark=>paragraph mark
 fluff_it("\\n\\l","\\n");    // --paragraph mark+forced linebreak=>paragraph mark
 fluff_it("\\n\\n","\\n");    // --double => single paragraph mark (again)
 fluff_it("\\l\\l","\\l");    // --double => single forced linebreak (again)
}



int fluff_entry(int entry, int subcode)
{
 fluff_rules();
 return(0);
}



int fluff_flags(int entry, string &text)
{
 return((activetype(TEXTFRAME) > 1) ? 0 : SHADED);
}



void main(void)
{
 script_menu_initialise();
 addentry_menu(script_handle,"fluff_entry","fluff_flags","","","{FLUFF_00}");
}


