diff --git a/cfgs/config/goldkeys.cfg b/cfgs/config/goldkeys.cfg index c3a5615..d7782dd 100644 --- a/cfgs/config/goldkeys.cfg +++ b/cfgs/config/goldkeys.cfg @@ -92,6 +92,7 @@ Up AREAgotoprev ^Right AREAjump Tab AREAjumpnextmatch ^Enter AREAjumpnextmatch +; AREAmark ^Q AREAquitnow @S AREAscan @P AREAscanpm @@ -102,6 +103,7 @@ Right AREAselect @T AREAtoggle Ins AREAtoggle ^Z AREAtouchnetscan +; AREAunmark @W AREAwritegoldlast @Z AREAzap @@ -237,15 +239,19 @@ Down LISTgotonext ^PgDn LISTgotonext Up LISTgotoprev ^PgUp LISTgotoprev +; LISTmark S LISTmarkingoptions @S LISTmarkingoptions @F9 LISTmarkingoptions +; LISTnarrowsubj ^Q LISTquitnow Enter LISTselect Tab LISTtogglebookmark ^D LISTtoggledate Space LISTtogglemark ^B LISTtogglewidesubj +; LISTunmark +; LISTwidesubj ; ------------------------------------------------------------------ @@ -292,6 +298,7 @@ M READcopymoveforward D READdeletemsg @D READdeletemsg Del READdeletemsg +; READdirquotemsg O READdosshell @O READdosshell ^F10 READdosshell @@ -335,12 +342,17 @@ Left READgotoprevmsg * READgotoreplynext - READgotoreplyprev ^Left READgotoreplyprev +; READhidekludge +; READhidehidden +; READhidehiddklud +; READhidequote ; READincreasemargin #F10 READlookupdest F10 READlookuporig ; READmainmenu ^L READmakeuserlist ^K READmakepathreport +; READmark S READmarkingoptions @S READmarkingoptions @F9 READmarkingoptions @@ -375,14 +387,26 @@ Ins READnewmsg Q READquotemsg @Q READquotemsg F4 READquotemsg -; READdirquotemsg +; READreadmarked +; READreadall +; READrealmsgno R READreplymsg @R READreplymsg F3 READreplymsg ; -- calls dummy menu. not implemented -- ; READsearch +; READsequentmsgno @F8 READshowdel +; READshowhidden +; READshowhiddklud +; READshowhtml +; READshowkludge +; READshowquote ; READsoundkill +; READstriphtml +; READstylesnone +; READstylesshow +; READstylesstrip ; -- could not be assigned manually -- ;#3 READthreadtree Tab READtogglebookmark @@ -395,6 +419,7 @@ H READtogglehidden V READtogglehiddklud @V READtogglehiddklud ^F5 READtogglehiddklud +; READtogglehtml K READtogglekludge @K READtogglekludge ^F6 READtogglekludge @@ -415,12 +440,17 @@ T READtoggletwits @T READtoggletwits ^Z READtouchnetscan ; READtouchsemaphore +; READtwitsblank +; READtwitsignore +; READtwitskill +; READtwitsshow +; READtwitsskip +; READunmark ^X READuudecode W READwritemsg @W READwritemsg F7 READwritemsg - ; ------------------------------------------------------------------ ; ADDRESSBOOK BROWSER COMMANDS ; ------------------------------------------------------------------ diff --git a/cfgs/config/goldlang.ru2 b/cfgs/config/goldlang.ru2 index c7af8bd..e02fb4c 100644 --- a/cfgs/config/goldlang.ru2 +++ b/cfgs/config/goldlang.ru2 @@ -215,7 +215,7 @@ MI_DROPMSGNO "S WT_ZONEGATE " Послать через межзональный гейт? " MI_ZONEGATEYES "A A как же иначе!? " MI_ZONEGATENO "e Нeт, мы пойдем другим путем " -ST_QUOTEPCT "Ваше сообщение содержит %i%% цитат%s" +ST_QUOTEPCT "Ваше сообщение содержит %i%% цитат%0.0s" WT_SAVEMSG " Сохранить эти %i строк? " MI_YESGREAT "a Дa, это круто! " MI_KICKIT "S Нeт, выбросьте это.. / ESC " diff --git a/cfgs/config/goldlang.rus b/cfgs/config/goldlang.rus index 89df29f..b4c57fe 100644 --- a/cfgs/config/goldlang.rus +++ b/cfgs/config/goldlang.rus @@ -211,7 +211,7 @@ MI_DROPMSGNO "N N WT_ZONEGATE " Послать через межзональный гейт? " MI_ZONEGATEYES "Y Y А как же иначе!? " MI_ZONEGATENO "N N Нет, мы пойдем другим путем " -ST_QUOTEPCT "Ваше сообщение содержит %i%% цитат%s" +ST_QUOTEPCT "Ваше сообщение содержит %i%% цитат%0.0s" WT_SAVEMSG " Сохранить эти %i строк? " MI_YESGREAT "Y Y Да, это круто! " MI_KICKIT "N N Нет, выбросьте это.. / ESC " diff --git a/docs/building.txt b/docs/building.txt index 60ae6a7..a65649c 100644 --- a/docs/building.txt +++ b/docs/building.txt @@ -1,14 +1,13 @@ GoldED+ compilation howto -by Alexander Aganichev, 2:5020/201.58 +by Alexander Aganichev, 2:5020/201.58 ------------------------------------------------------------------------------- To compile GoldED+ and utilities you'll need: - - GNU C++ newer than 2.8.x, gcc 2.95.3 or gcc 3.0.x are recommended, gcc 3.1 - not tested yet. - - GNU make and GNU sed + - GNU C/C++ newer than 2.8.x, gcc 2.95.3 or gcc 3.x.x are recommended + - GNU make, GNU sed and GNU grep - vi, emacs, or any other editor you like - beer or bear on your choice ;-) @@ -23,7 +22,7 @@ from www.mingw.org, copy .../lib/stdlibc++.a to /usr/local/lib/mingw, copy ---- DJGPP ONLY ---- When building in DJGPP environment you may wish to use liblocal which may be -found on http://aaganichev.narod.ru/djgpp/llocl01b.zip. This provides basic +found on http://aaganichev.narod.ru/djgpp/llocl02b.zip. This provides basic locale support via country.sys driver. Otherwise just comment -llocal in GNUmakef.def. ------ COMMON ------ diff --git a/docs/notework.txt b/docs/notework.txt index 164e31f..d7ad05c 100644 --- a/docs/notework.txt +++ b/docs/notework.txt @@ -12,6 +12,69 @@ ______________________________________________________________________ Notes for GoldED+ 1.1.5, /snapshot/ ______________________________________________________________________ +- Fixed bug in HPT config parser: areas which was not explicitly + given messagebase type was omited. + ++ Added new configuration keywords to main configuration file: + + WRITEHEADER - default setting for Write->Header + setting, defaults to yes. Can be used in Random System Group. + + STRIPHTML - activate quick-n-dirty HTML-tag stripper. It + known to fail in some cases but more likely will not be improoved. + The keyword may be used in Random System Group. Defaults - NO. + NOTE: Strip HTML mode forces quoted-printable decoding. + ++ Added new configuration keywords to keys configuration file: + + READSTRIPHTML - Strip HTML tags + READSHOWHTML - Show HTML tags + READTOGGLEHTML - Toggle HTML tags display mode + + The keywords listed below are just duplicates for corresponding + toggles. They are added mostly for use in macros (untested): + + AREAMARK + AREAUNMARK + LISTMARK + LISTUNMARK + LISTWIDESUBJ + LISTNARROWSUBJ + READSHOWKLUDGE + READHIDEKLUDGE + READSHOWHIDDEN + READHIDEHIDDEN + READSHOWHIDDKLUD + READHIDEHIDDKLUD + READMARK + READUNMARK + READREADMARKED + READREADALL + READREALMSGNO + READSEQUENTMSGNO + READSTYLESNONE + READSTYLESSHOW + READSTYLESSTRIP + READTWITSSHOW + READTWITSBLANK + READTWITSSKIP + READTWITSIGNORE + READTWITSKILL + READSHOWQUOTE + READHIDEQUOTE + +- X-Mailreader should not duplicate now on message changing (not + tested). + +- Better support for long tearlines are added. Now long tearlines with + QuoteCtrl set to not quote tearlines no longer get quoted. + ++ Added quote display mode to the statusbar (Q letter). + +- More fixes to uu/xxdecoder: now sections which follows with the + "end" properly decoded; if name contained tilde inside it also broke + multisection UUE decoding. + - Fixed FWD kludges encoding. - Hooks to the delete and move messages added for the read-only areas. diff --git a/docs/rusfaq.txt b/docs/rusfaq.txt index bd3ef33..efcf528 100644 --- a/docs/rusfaq.txt +++ b/docs/rusfaq.txt @@ -260,13 +260,12 @@ assistance! *Q:* Типа эта... А писать куда автору? ;-) *A:* Писать лучше всего в Ru.GoldED. Даже лучше сначала его почитать, дождаться местного FAQ, баглиста и только потом писать. Если уж сильно приспичит, то - можно писать на 2:5020/201.58, 2:5020/604.19 или aaganichev@netscape.net, - но я совсем не гарантирую, что я отвечу. Ставьте RRq, Cfm, если хотите - знать, что ваше письмо дошло и я просто не стал на него отвечать. Я не - отвечаю на вопросы, описанные в этом FAQ или если я не знаю как что-то - работает в GoldED'е (я не использую слишком много его возможностей - МНЕ - они не нужны) - читайте документацию, спрашивайте в Ru.GoldED... У меня - слишком мало свободного времени, чтобы раскапывать для вас как что-то - работает. + можно писать на 2:5020/201.58 или aaganichev@yandex.ru, но я совсем не + гарантирую, что я отвечу. Ставьте RRq, Cfm, если хотите знать, что ваше + письмо дошло и я просто не стал на него отвечать. Я не отвечаю на вопросы, + описанные в этом FAQ или если я не знаю как что-то работает в GoldED'е (я + не использую слишком много его возможностей - МНЕ они не нужны) - читайте + документацию, спрашивайте в Ru.GoldED... У меня слишком мало свободного + времени, чтобы раскапывать для вас как что-то работает. >============================================================================== diff --git a/golded3/gccfgg.cpp b/golded3/gccfgg.cpp index d470ca0..62983f7 100644 --- a/golded3/gccfgg.cpp +++ b/golded3/gccfgg.cpp @@ -766,6 +766,7 @@ CfgGed::CfgGed() { squishscan = 2; // SQS_QUICK squishuserno = 0; statuslinehelp = 0; + striphtml = false; taglineno = 0; taglinechar = '.'; taglinesupport = true; @@ -785,6 +786,7 @@ CfgGed::CfgGed() { viewhidden = false; viewkludge = false; viewquote = true; + writeheader = 1; wildcatuserno = 0; zonegating = ASK; diff --git a/golded3/gccfgg.h b/golded3/gccfgg.h index 87d2484..2d9b941 100644 --- a/golded3/gccfgg.h +++ b/golded3/gccfgg.h @@ -340,6 +340,7 @@ const word CRC_SQUISHUSERNO = 0x60AD; const word CRC_SQUISHUSERPATH = 0xFA97; const word CRC_STATUSLINECLOCK = 0x9C8A; const word CRC_STATUSLINEHELP = 0xA150; +const word CRC_STRIPHTML = 0x05EC; const word CRC_STYLECODES = 0x4CB0; const word CRC_STYLECODEPUNCT = 0x9D15; const word CRC_STYLECODESTOPS = 0xF452; @@ -381,6 +382,7 @@ const word CRC_VIEWKLUDGE = 0x4078; const word CRC_VIEWQUOTE = 0x0AB3; const word CRC_WHOTO = 0xB25F; const word CRC_WILDCATUSERNO = 0xC2FE; +const word CRC_WRITEHEADER = 0x2589; const word CRC_WRITETEMPLATE = 0xF4CB; const word CRC_XLATCHARSET = 0xA860; const word CRC_XLATESCSET = 0x4BA7; diff --git a/golded3/gccfgg0.cpp b/golded3/gccfgg0.cpp index 0098010..9e98207 100644 --- a/golded3/gccfgg0.cpp +++ b/golded3/gccfgg0.cpp @@ -530,6 +530,7 @@ SwitchS: case CRC_SQUISHUSERNO : CfgSquishuserno (); break; case CRC_SQUISHUSERPATH : CfgSquishuserpath (); break; case CRC_STATUSLINEHELP : CfgStatuslinehelp (); break; + case CRC_STRIPHTML : CfgStripHTML (); break; case CRC_STYLECODEPUNCT : CfgStylecodepunct (); break; case CRC_STYLECODES : CfgStylecodes (); break; case CRC_STYLECODESTOPS : CfgStylecodestops (); break; @@ -588,6 +589,7 @@ SwitchW: switch(crc) { case CRC_WHOTO : CfgWhoto (); break; case CRC_WILDCATUSERNO : CfgWildcatuserno (); break; + case CRC_WRITEHEADER : CfgWriteheader (); break; case CRC_WRITETEMPLATE : CfgWritetemplate (); break; default : found = false; } diff --git a/golded3/gccfgg8.cpp b/golded3/gccfgg8.cpp index 403a3c3..c50a404 100644 --- a/golded3/gccfgg8.cpp +++ b/golded3/gccfgg8.cpp @@ -66,6 +66,17 @@ void CfgStatuslinehelp() { // ------------------------------------------------------------------ +void CfgStripHTML() { + + bool flag = GetYesno(val); + if(cfgingroup) + CFG->grp.AddItm(GRP_STRIPHTML, flag); + else + CFG->striphtml = flag; +} + +// ------------------------------------------------------------------ + void CfgStylecodepunct() { char* key; @@ -492,6 +503,23 @@ void CfgWildcatuserno() { // ------------------------------------------------------------------ +void CfgWriteheader() { + + int flag; + + if(strieql(val, "ONLY")) + flag = 2; + else + flag = GetYesno(val) ? 1 : 0; + + if(cfgingroup) + CFG->grp.AddItm(GRP_WRITEHEADER, flag); + else + CFG->writeheader = flag; +} + +// ------------------------------------------------------------------ + void CfgWritetemplate() { if(cfgingroup) { diff --git a/golded3/gckeys.cpp b/golded3/gckeys.cpp index 7d95fd7..c2468ff 100644 --- a/golded3/gckeys.cpp +++ b/golded3/gckeys.cpp @@ -363,6 +363,9 @@ tglobalkey globalkeys[] = { { CRC_FILETOGGLEMARKALL , KK_FileToggleMarkAll , KT_F }, // 0x0032 { CRC_READADDRESSBOOKADD , KK_ReadAddressbookAdd , KT_R }, // 0x00FA { CRC_LISTDOSSHELL , KK_ListDosShell , KT_M }, // 0x0130 + { CRC_READREADALL , KK_ReadReadAll , KT_R }, // 0x0146 + { CRC_READREADMARKED , KK_ReadReadMarked , KT_R }, // 0x01AE + { CRC_READTWITSSHOW , KK_ReadTwitsShow , KT_R }, // 0x03C5 { CRC_EDITGOLEFT , KK_EditGoLeft , KT_E }, // 0x043B { CRC_HEADERTOGGLESCANNED , KK_HeaderToggleScanned , KT_H }, // 0x0459 { CRC_READTOGGLEHIDDEN , KK_ReadToggleHidden , KT_R }, // 0x04CE @@ -372,6 +375,7 @@ tglobalkey globalkeys[] = { #endif { CRC_READGOTOPREVMSG , KK_ReadGotoPrevMsg , KT_R }, // 0x06D9 { CRC_READPEEKURLS , KK_ReadPeekURLs , KT_R }, // 0x07BA + { CRC_READREALMSGNO , KK_ReadRealMsgno , KT_R }, // 0x07F8 { CRC_K_STAB , Key_S_Tab , 0 }, // 0x0886 { CRC_EDITLOADFILE , KK_EditLoadFile , KT_A }, // 0x0931 { CRC_READFILEREQUEST , KK_ReadFileRequest , KT_R }, // 0x0A07 @@ -402,11 +406,13 @@ tglobalkey globalkeys[] = { { CRC_READREPLYMSG , KK_ReadReplyMsg , KT_R }, // 0x172F { CRC_AREAGOTOLAST , KK_AreaGotoLast , KT_A }, // 0x177A { CRC_READINCREASEMARGIN , KK_ReadIncreaseMargin , KT_R }, // 0x1797 + { CRC_AREAUNMARK , KK_AreaUnmark , KT_A }, // 0x17B3 { CRC_EDITEXITMSG , KK_EditExitMsg , KT_E }, // 0x1813 { CRC_READTOGGLEPAGEBAR , KK_ReadTogglePageBar , KT_R }, // 0x18E4 { CRC_K_F12 , Key_F12 , 0 }, // 0x1930 { CRC_K_F10 , Key_F10 , 0 }, // 0x1932 { CRC_K_F11 , Key_F11 , 0 }, // 0x1933 + { CRC_READHIDEKLUDGE , KK_ReadHideKludge , KT_R }, // 0x19EC { CRC_READGOTOREPLIES , KK_ReadGotoReplies , KT_R }, // 0x1A6B { CRC_READMOVEQUOTEMSG , KK_ReadMoveQuoteMsg , KT_R }, // 0x1B41 { CRC_EDITGOEOL , KK_EditGoEOL , KT_E }, // 0x1CC6 @@ -418,6 +424,7 @@ tglobalkey globalkeys[] = { { CRC_K_SDEL , Key_S_Del , 0 }, // 0x1EB9 #endif { CRC_EDITCOPY , KK_EditCopy , KT_E }, // 0x1F77 + { CRC_READHIDEQUOTE , KK_ReadHideQuote , KT_R }, // 0x1FA8 { CRC_READEXTERNUTILMENU , KK_ReadExternUtilMenu , KT_R }, // 0x2000 { CRC_READCHANGEAKA , KK_ReadChangeAka , KT_R }, // 0x2015 { CRC_EDITGOWORDRIGHT , KK_EditGoWordRight , KT_E }, // 0x20D0 @@ -442,15 +449,18 @@ tglobalkey globalkeys[] = { { CRC_K_CF12 , Key_C_F12 , 0 }, // 0x3480 { CRC_K_CF10 , Key_C_F10 , 0 }, // 0x3482 { CRC_K_CF11 , Key_C_F11 , 0 }, // 0x3483 + { CRC_READTWITSSKIP , KK_ReadTwitsSkip , KT_R }, // 0x35A1 { CRC_K_CHOME , Key_C_Home , 0 }, // 0x35C4 { CRC_HEADERTOGGLERECEIVED , KK_HeaderToggleReceived , KT_H }, // 0x36B9 { CRC_K_CPGDN , Key_C_PgDn , 0 }, // 0x371D { CRC_EDITCOPYABOVECHAR , KK_EditCopyAboveChar , KT_E }, // 0x380C { CRC_LISTSELECT , KK_ListSelect , KT_M }, // 0x3829 { CRC_READGOTOFIRSTMSG , KK_ReadGotoFirstMsg , KT_R }, // 0x392F + { CRC_READSTYLESSTRIP , KK_ReadStylesStrip , KT_R }, // 0x39E8 { CRC_AREAGOTONEXT , KK_AreaGotoNext , KT_A }, // 0x3A9C { CRC_EDITDELLTWORD , KK_EditDelLtWord , KT_E }, // 0x3B67 { CRC_LISTGOTOLAST , KK_ListGotoLast , KT_M }, // 0x3BA7 + { CRC_READSHOWQUOTE , KK_ReadShowQuote , KT_R }, // 0x3C6C { CRC_LISTTOGGLEWIDESUBJ , KK_ListToggleWideSubj , KT_M }, // 0x3C76 { CRC_EDITGODOWN , KK_EditGoDown , KT_E }, // 0x3DC2 { CRC_K_A0 , Key_A_0 , 0 }, // 0x4030 @@ -513,6 +523,7 @@ tglobalkey globalkeys[] = { { CRC_READCHANGEATTRS , KK_ReadChangeAttrs , KT_R }, // 0x47F8 { CRC_READSEARCH , KK_ReadSearch , KT_R }, // 0x48EF { CRC_READMSGPGDN , KK_ReadMsgPgDn , KT_R }, // 0x4908 + { CRC_READSTRIPHTML , KK_ReadStripHTML , KT_R }, // 0x499A { CRC_LISTGOTOPREV , KK_ListGotoPrev , KT_M }, // 0x49E9 { CRC_READQUOTEBUF , KK_ReadQuoteBuf , KT_R }, // 0x49EE { CRC_EDITDELETE , KK_EditDelete , KT_E }, // 0x4A37 @@ -556,6 +567,7 @@ tglobalkey globalkeys[] = { #endif { CRC_READGOTONEXTAREA , KK_ReadGotoNextArea , KT_R }, // 0x5B23 { CRC_K_TAB , Key_Tab , 0 }, // 0x5B33 + { CRC_READHIDEHIDDEN , KK_ReadHideHidden , KT_R }, // 0x5B89 { CRC_K_AEND , Key_A_End , 0 }, // 0x5BE9 { CRC_FILEMACRO , KK_FileMacro , KT_F }, // 0x5D48 { CRC_READMSGLINEDOWN , KK_ReadMsgLineDown , KT_R }, // 0x5DB2 @@ -589,9 +601,11 @@ tglobalkey globalkeys[] = { { CRC_K_CZ , Key_C_Z , 0 }, // 0x5E5A { CRC_READCOMMENTMSG , KK_ReadCommentMsg , KT_R }, // 0x5E89 { CRC_READTOGGLETWITS , KK_ReadToggleTwits , KT_R }, // 0x5FD1 + { CRC_LISTWIDESUBJ , KK_ListWideSubj , KT_M }, // 0x6026 { CRC_EDITGOPGDN , KK_EditGoPgDn , KT_E }, // 0x607D { CRC_K_CDEL , Key_C_Del , 0 }, // 0x60BC { CRC_KK_AUTO , Key_Auto , 0 }, // 0x60E2 + { CRC_READMARK , KK_ReadMark , KT_R }, // 0x6190 { CRC_READFINDHEADER , KK_ReadFindHeader , KT_R }, // 0x6343 { CRC_EDITDELETESOL , KK_EditDeleteSOL , KT_E }, // 0x63B4 { CRC_K_PGUP , Key_PgUp , 0 }, // 0x63CC @@ -619,6 +633,7 @@ tglobalkey globalkeys[] = { { CRC_K_HOME , Key_Home , 0 }, // 0x700B { CRC_ADDRESSBOOKDELETE , KK_AddressbookDelete , KT_B }, // 0x70D1 { CRC_EDITGOPGUP , KK_EditGoPgUp , KT_E }, // 0x7163 + { CRC_READTWITSIGNORE , KK_ReadTwitsIgnore , KT_R }, // 0x71CA { CRC_READMSGLINEUP , KK_ReadMsgLineUp , KT_R }, // 0x7238 { CRC_EDITHEADER , KK_EditHeader , KT_E }, // 0x726F { CRC_K_PGDN , Key_PgDn , 0 }, // 0x72D2 @@ -628,15 +643,19 @@ tglobalkey globalkeys[] = { { CRC_HEADERADDRESSBOOK , KK_HeaderAddressbook , KT_H }, // 0x76FC { CRC_EDITUNDEFINE , KK_EditUndefine , KT_E }, // 0x7873 { CRC_LISTGOTOFIRST , KK_ListGotoFirst , KT_M }, // 0x7925 + { CRC_READSTYLESNONE , KK_ReadStylesNone , KT_R }, // 0x79D7 { CRC_K_CEND , Key_C_End , 0 }, // 0x7B95 + { CRC_READSTYLESSHOW , KK_ReadStylesShow , KT_R }, // 0x7D0D { CRC_K_APGUP , Key_A_PgUp , 0 }, // 0x7E61 { CRC_EDITQUITNOW , KK_EditQuitNow , KT_E }, // 0x80BA { CRC_LISTMARKINGOPTIONS , KK_ListMarkingOptions , KT_M }, // 0x8138 { CRC_EDITZAPQUOTEBELOW , KK_EditZapQuoteBelow , KT_E }, // 0x814F { CRC_EDITDUPLINE , KK_EditDupLine , KT_E }, // 0x816A + { CRC_READSHOWHIDDKLUD , KK_ReadShowHiddKlud , KT_R }, // 0x81EB { CRC_EDITDELRTWORD , KK_EditDelRtWord , KT_E }, // 0x829A { CRC_AREAUNDEFINE , KK_AreaUndefine , KT_A }, // 0x835B { CRC_READGOTOREPLYNEXT , KK_ReadGotoReplyNext , KT_R }, // 0x844F + { CRC_READHIDEHIDDKLUD , KK_ReadHideHiddKlud , KT_R }, // 0x84ED { CRC_EDITMACRO , KK_EditMacro , KT_E }, // 0x85CD { CRC_READSHOWDEL , KK_ReadShowDel , KT_R }, // 0x8615 { CRC_K_ENTER , Key_Ent , 0 }, // 0x87BD @@ -646,9 +665,12 @@ tglobalkey globalkeys[] = { { CRC_EDITASKEXIT , KK_EditAskExit , KT_E }, // 0x89AF { CRC_HEADERTOGGLEHOLD , KK_HeaderToggleHold , KT_H }, // 0x8A5F { CRC_EDITBLOCKHOME , KK_EditBlockHome , KT_E }, // 0x8B82 + { CRC_READSHOWHIDDEN , KK_ReadShowHidden , KT_R }, // 0x8B88 { CRC_READDELETEMSG , KK_ReadDeleteMsg , KT_R }, // 0x8BCE { CRC_EDITTAB , KK_EditTab , KT_E }, // 0x8C26 + { CRC_LISTUNMARK , KK_ListUnmark , KT_M }, // 0x8DEB { CRC_K_KEY5 , Key_5Num , 0 }, // 0x9062 + { CRC_READSEQUENTMSGNO , KK_ReadSequentMsgno , KT_R }, // 0x9085 { CRC_EDITPASTE , KK_EditPaste , KT_E }, // 0x90C4 { CRC_HEADERTOGGLEAUDIT , KK_HeaderToggleAudit , KT_H }, // 0x91B7 { CRC_EDITGOBOTLINE , KK_EditGoBotLine , KT_E }, // 0x92DD @@ -683,6 +705,7 @@ tglobalkey globalkeys[] = { { CRC_READTHREADTREE , KK_ReadThreadtree , KT_R }, // 0x9827 { CRC_EDITBLOCKPGUP , KK_EditBlockPgUp , KT_E }, // 0x9842 { CRC_K_ARIGHT , Key_A_Rgt , 0 }, // 0x9911 + { CRC_READTWITSKILL , KK_ReadTwitsKill , KT_R }, // 0x9A25 { CRC_K_AINS , Key_A_Ins , 0 }, // 0x9A72 { CRC_EDITGOBOTMSG , KK_EditGoBotMsg , KT_E }, // 0x9B29 { CRC_READDOSSHELL , KK_ReadDosShell , KT_R }, // 0x9C2B @@ -690,6 +713,7 @@ tglobalkey globalkeys[] = { { CRC_NODEABORT , KK_NodeAbort , KT_N }, // 0xA08C { CRC_READTOGGLEHIDDKLUD , KK_ReadToggleHiddKlud , KT_R }, // 0xA24F { CRC_AREASELECT , KK_AreaSelect , KT_A }, // 0xA271 + { CRC_READSHOWHTML , KK_ReadShowHTML , KT_R }, // 0xA27F { CRC_LISTMACRO , KK_ListMacro , KT_M }, // 0xA2B6 { CRC_EDITDELCHAR , KK_EditDelChar , KT_E }, // 0xA3C7 { CRC_AREAASKEXIT , KK_AreaAskExit , KT_A }, // 0xA3D1 @@ -716,6 +740,7 @@ tglobalkey globalkeys[] = { { CRC_EDITUNDO , KK_EditUndo , KT_E }, // 0xB295 { CRC_READDIRQUOTEMSG , KK_ReadDirQuoteMsg , KT_R }, // 0xB351 { CRC_FILETOGGLEMARK , KK_FileToggleMark , KT_F }, // 0xB431 + { CRC_READTWITSBLANK , KK_ReadTwitsBlank , KT_R }, // 0xB571 { CRC_FILEGOTOPREV , KK_FileGotoPrev , KT_F }, // 0xB644 { CRC_EDITLOOKUPCURSOR , KK_EditLookupCursor , KT_E }, // 0xB7CC { CRC_NODEGOTOPREV , KK_NodeGotoPrev , KT_N }, // 0xB85D @@ -723,6 +748,7 @@ tglobalkey globalkeys[] = { { CRC_K_CINS , Key_C_Ins , 0 }, // 0xBA0E { CRC_READGOTONEXTUNREAD , KK_ReadGotoNextUnread , KT_R }, // 0xBA34 { CRC_READADDRESSBOOK , KK_ReadAddressbook , KT_R }, // 0xBAC1 + { CRC_READTOGGLEHTML , KK_ReadToggleHTML , KT_R }, // 0xBC02 #if !defined(__UNIX__) || defined(__USE_NCURSES__) { CRC_K_SPGUP , Key_S_PgUp , 0 }, // 0xBC5A #endif @@ -741,6 +767,7 @@ tglobalkey globalkeys[] = { { CRC_K_SINS , Key_S_Ins , 0 }, // 0xC40B #endif { CRC_AREASCANPM , KK_AreaScanPM , KT_A }, // 0xC4FF + { CRC_LISTMARK , KK_ListMark , KT_M }, // 0xC530 { CRC_READMSGEND , KK_ReadMsgEnd , KT_R }, // 0xC5AD { CRC_AREATOGGLE , KK_AreaToggle , KT_A }, // 0xC734 #if !defined(__UNIX__) || defined(__USE_NCURSES__) @@ -748,6 +775,7 @@ tglobalkey globalkeys[] = { #endif { CRC_HEADERTOGGLEORPHAN , KK_HeaderToggleOrphan , KT_H }, // 0xC98A { CRC_HEADERTOGGLEFILE , KK_HeaderToggleFile , KT_H }, // 0xC997 + { CRC_READSHOWKLUDGE , KK_ReadShowKludge , KT_R }, // 0xC9ED { CRC_NODEGOTOLAST , KK_NodeGotoLast , KT_N }, // 0xCA13 { CRC_FILEGOTOFIRST , KK_FileGotoFirst , KT_F }, // 0xCAD5 { CRC_HEADERTOGGLEDELSENT , KK_HeaderToggleDelsent , KT_H }, // 0xCD4B @@ -783,12 +811,14 @@ tglobalkey globalkeys[] = { { CRC_READMOVECOMMENTMSG , KK_ReadMoveCommentMsg , KT_R }, // 0xE4E7 { CRC_READGOTOREPLY1ST , KK_ReadGotoReply1st , KT_R }, // 0xE54F { CRC_READTOGGLEHEXDUMP , KK_ReadToggleHexdump , KT_R }, // 0xE6D5 + { CRC_LISTNARROWSUBJ , KK_ListNarrowSubj , KT_M }, // 0xE756 { CRC_NODEQUITNOW , KK_NodeQuitNow , KT_N }, // 0xE780 { CRC_NODEGOTONEXT , KK_NodeGotoNext , KT_N }, // 0xE7F5 { CRC_READMAKEUSERLIST , KK_ReadMakeUserlist , KT_R }, // 0xE8C6 { CRC_EDITCLEARPASTEBUF , KK_EditClearPasteBuf , KT_E }, // 0xE8E4 { CRC_K_AENTER , Key_A_Ent , 0 }, // 0xE921 { CRC_READMARKINGOPTIONS , KK_ReadMarkingOptions , KT_R }, // 0xE97A + { CRC_READUNMARK , KK_ReadUnmark , KT_R }, // 0xE9BB { CRC_FILEGOTONEXT , KK_FileGotoNext , KT_F }, // 0xE9EC { CRC_EDITBLOCKLEFT , KK_EditBlockLeft , KT_E }, // 0xED1D { CRC_K_CUP , Key_C_Up , 0 }, // 0xEE6B @@ -806,6 +836,7 @@ tglobalkey globalkeys[] = { { CRC_EDITTABREVERSE , KK_EditTabReverse , KT_E }, // 0xF5B6 { CRC_HEADERTOGGLEPVT , KK_HeaderTogglePvt , KT_H }, // 0xF614 { CRC_HEADERTOGGLESENT , KK_HeaderToggleSent , KT_H }, // 0xF68C + { CRC_AREAMARK , KK_AreaMark , KT_A }, // 0xF77B { CRC_K_RIGHT , Key_Rgt , 0 }, // 0xF78D { CRC_EDITIMPORTQUOTEBUF , KK_EditImportQuotebuf , KT_E }, // 0xF797 { CRC_READMACRO , KK_ReadMacro , KT_R }, // 0xF7D8 diff --git a/golded3/gckeys.h b/golded3/gckeys.h index 3cf4243..f7967b0 100644 --- a/golded3/gckeys.h +++ b/golded3/gckeys.h @@ -53,6 +53,8 @@ const word CRC_AREATOUCHNETSCAN = 0x58C1; const word CRC_AREAUNDEFINE = 0x835B; const word CRC_AREAWRITEGOLDLAST = 0xD353; const word CRC_AREAZAP = 0x5125; +const word CRC_AREAMARK = 0xF77B; +const word CRC_AREAUNMARK = 0x17B3; const word CRC_EDITABORT = 0x6468; const word CRC_EDITANCHOR = 0xDC07; @@ -158,6 +160,10 @@ const word CRC_LISTTOGGLEDATE = 0x6F1F; const word CRC_LISTTOGGLEMARK = 0xD389; const word CRC_LISTTOGGLEWIDESUBJ = 0x3C76; const word CRC_LISTUNDEFINE = 0xAF86; +const word CRC_LISTMARK = 0xC530; +const word CRC_LISTUNMARK = 0x8DEB; +const word CRC_LISTWIDESUBJ = 0x6026; +const word CRC_LISTNARROWSUBJ = 0xE756; const word CRC_EXTERNUTIL01 = 0x95B9; const word CRC_EXTERNUTIL02 = 0x95BA; @@ -280,6 +286,31 @@ const word CRC_READTOUCHSEMAPHORE = 0x6B1D; const word CRC_READUNDEFINE = 0x329D; const word CRC_READUUDECODE = 0x4F0B; const word CRC_READWRITEMSG = 0x73AC; +const word CRC_READSHOWKLUDGE = 0xC9ED; +const word CRC_READHIDEKLUDGE = 0x19EC; +const word CRC_READSHOWHIDDEN = 0x8B88; +const word CRC_READHIDEHIDDEN = 0x5B89; +const word CRC_READSHOWHIDDKLUD = 0x81EB; +const word CRC_READHIDEHIDDKLUD = 0x84ED; +const word CRC_READMARK = 0x6190; +const word CRC_READUNMARK = 0xE9BB; +const word CRC_READREADMARKED = 0x01AE; +const word CRC_READREADALL = 0x0146; +const word CRC_READREALMSGNO = 0x07F8; +const word CRC_READSEQUENTMSGNO = 0x9085; +const word CRC_READSTYLESNONE = 0x79D7; +const word CRC_READSTYLESSHOW = 0x7D0D; +const word CRC_READSTYLESSTRIP = 0x39E8; +const word CRC_READTWITSSHOW = 0x03C5; +const word CRC_READTWITSBLANK = 0xB571; +const word CRC_READTWITSSKIP = 0x35A1; +const word CRC_READTWITSIGNORE = 0x71CA; +const word CRC_READTWITSKILL = 0x9A25; +const word CRC_READSTRIPHTML = 0x499A; +const word CRC_READSHOWHTML = 0xA27F; +const word CRC_READTOGGLEHTML = 0xBC02; +const word CRC_READSHOWQUOTE = 0x3C6C; +const word CRC_READHIDEQUOTE = 0x1FA8; const word CRC_ADDRESSBOOKQUIT = 0x47C7; const word CRC_ADDRESSBOOKADD = 0xFF55; diff --git a/golded3/gcprot.h b/golded3/gcprot.h index bf73dd5..631dc87 100644 --- a/golded3/gcprot.h +++ b/golded3/gcprot.h @@ -325,6 +325,7 @@ void CfgSquishuserno (); void CfgSquishuserpath (); void CfgStatuslineclock (); void CfgStatuslinehelp (); +void CfgStripHTML (); void CfgStylecodes (); void CfgStylecodepunct (); void CfgStylecodestops (); @@ -363,6 +364,7 @@ void CfgViewkludge (); void CfgViewquote (); void CfgWhoto (); void CfgWildcatuserno (); +void CfgWriteheader (); void CfgWritetemplate (); void CfgXlatcharset (); void CfgXlatescset (); @@ -378,4 +380,3 @@ void CfgZonegating (); #endif // ------------------------------------------------------------------ - diff --git a/golded3/gearea.cpp b/golded3/gearea.cpp index dbc1531..e105421 100644 --- a/golded3/gearea.cpp +++ b/golded3/gearea.cpp @@ -592,6 +592,20 @@ bool GPickArealist::handle_key() { cursor_down(); break; + case KK_AreaMark: + AL[index]->set_marked(true); + display_bar(); + precursor(); + cursor_down(); + break; + + case KK_AreaUnmark: + AL[index]->set_marked(false); + display_bar(); + precursor(); + cursor_down(); + break; + case KK_AreaBoardnos: CFG->switches.set(arealistnos, not CFG->switches.get(arealistnos)); update(); diff --git a/golded3/gecfgg.h b/golded3/gecfgg.h index d6516cb..ce545fd 100644 --- a/golded3/gecfgg.h +++ b/golded3/gecfgg.h @@ -322,6 +322,7 @@ public: int squishuserno; Path squishuserpath; int statuslinehelp; + bool striphtml; char stylecodepunct[41]; char stylecodestops[41]; gstrarray tagline; @@ -358,6 +359,7 @@ public: bool viewquote; Name whoto; int wildcatuserno; + int writeheader; std::string wtpl; std::vector xlatcharset; std::vector xlatescset; diff --git a/golded3/gehtml.cpp b/golded3/gehtml.cpp new file mode 100755 index 0000000..406f824 --- /dev/null +++ b/golded3/gehtml.cpp @@ -0,0 +1,139 @@ + +// ------------------------------------------------------------------ +// GoldED+ +// Copyright (C) 2003 Alexander S. Aganichev +// ------------------------------------------------------------------ +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, +// MA 02111-1307 USA +// ------------------------------------------------------------------ +// $Id$ +// ------------------------------------------------------------------ +// HTML tag remover. +// ------------------------------------------------------------------ + +#include + + +// ------------------------------------------------------------------ + +const static struct html_entities { + const char *tag; + char replacement; +} +entities[] = { + {"nbsp", ' '}, + {"brvbar", '|'}, + {"laquo", '<'}, + {"shy", '-'}, + {"raquo", '>'}, + {"divide", '/'}, + {"quot", '\"'}, + {"amp", '&'}, + {"lt", '<'}, + {"gt", '>'} +}; + +// ------------------------------------------------------------------ + +void RemoveHTML (char *&txt) { + + long i, j, len = strlen(txt) + 1; + char *new_txt = (char *)throw_malloc(len); + bool strip = false; + bool quoted = false; + bool inside_html = false; + bool last_char_was_space = true; + + for(i = j = 0; txt[i] != NUL; i++) { + if(not quoted and not strip and (txt[i] == '<')) { + if(strnieql(txt + i, "", 7)) { + inside_html = false; + strip = true; + } + else if(not inside_html and (txt[i + 1] == '/')) { + inside_html = true; // closing html tag, force html mode + strip = true; + } + else if(inside_html) { + strip = true; + if(strnieql(txt + i, "", 3) or strnieql(txt + i, "", 4)) + new_txt[j++] = '*'; + if(strnieql(txt + i, "", 3) or strnieql(txt + i, "", 4)) + new_txt[j++] = '/'; + if(strnieql(txt + i, "", 3) or strnieql(txt + i, "", 4)) + new_txt[j++] = '_'; + if((strnieql(txt + i, "", 4) or strnieql(txt + i, "", 5) + or strnieql(txt + i, "", 6) or strnieql(txt + i, "
", 4)) { + new_txt[j++] = CR; + } + } + else { + new_txt[j++] = txt[i]; + } + } + else if(not strip and not inside_html) { + new_txt[j++] = txt[i]; + } + else if(strip and not quoted and (txt[i] == '>')) { + strip = false; + } + else if(inside_html) { + if(strip and (txt[1] == '\"')) { + quoted = not quoted; + } + else if(not strip and (iscntrl(txt[i]) or (txt[i] == ' '))) { + if((i > 0) && (txt[i - 1] == '=')) // compensate for quoted-printable + new_txt[j++] = txt[i]; + else if(not last_char_was_space) + new_txt[j++] = ' '; + last_char_was_space = true; + } + else if(not strip and (txt[i] == '&')) { + bool found = false; + for (int k = 0; k < (sizeof(entities) / sizeof(html_entities)); k++) { + long taglen = strlen (entities[k].tag); + if(strnieql (txt + i + 1, entities[k].tag, taglen)) { + new_txt[j++] = entities[k].replacement; + i += taglen + ((txt[i + taglen + 1] == ';') ? 1 : 0); + found = true; + break; + } + } + if(not found) { + new_txt[j++] = txt[i]; + } + last_char_was_space = false; + } + else if(not strip) { + new_txt[j++] = txt[i]; + last_char_was_space = false; + } + } + } + new_txt[j] = NUL; + if (i != j) { + txt = (char *)throw_realloc(txt, j + 17); + memcpy(txt, new_txt, j + 1); + } + throw_free(new_txt); +} + +// ------------------------------------------------------------------ diff --git a/golded3/gekeys.h b/golded3/gekeys.h index bb69753..aab97d4 100644 --- a/golded3/gekeys.h +++ b/golded3/gekeys.h @@ -104,6 +104,8 @@ const gkey KK_AreaToggle = 0xFEB6; const gkey KK_AreaTouchNetscan = 0xFEB7; const gkey KK_AreaWriteGoldlast = 0xFEB8; const gkey KK_AreaZap = 0xFEB9; +const gkey KK_AreaMark = 0xFEBA; +const gkey KK_AreaUnmark = 0xFEBB; const gkey KK_EditAbort = 0xFEC0; const gkey KK_EditAnchor = 0xFEC1; @@ -205,6 +207,10 @@ const gkey KK_ListToggleBookMark = 0xFF2D; const gkey KK_ListToggleDate = 0xFF2E; const gkey KK_ListToggleMark = 0xFF2F; const gkey KK_ListToggleWideSubj = 0xFF30; +const gkey KK_ListMark = 0xFF31; +const gkey KK_ListUnmark = 0xFF32; +const gkey KK_ListWideSubj = 0xFF33; +const gkey KK_ListNarrowSubj = 0xFF34; const gkey KK_NodeAbort = 0xFF40; const gkey KK_NodeAskExit = 0xFF41; @@ -216,6 +222,12 @@ const gkey KK_NodeGotoPrev = 0xFF46; const gkey KK_NodeQuitNow = 0xFF49; const gkey KK_NodeSelect = 0xFF4A; +const gkey KK_AddressbookQuit = 0xFF4B; +const gkey KK_AddressbookAdd = 0xFF4C; +const gkey KK_AddressbookSelect = 0xFF4D; +const gkey KK_AddressbookDelete = 0xFF4E; +const gkey KK_AddressbookPack = 0xFF4F; + const gkey KK_ReadAddressbookAdd = 0xFF50; const gkey KK_ReadAskExit = 0xFF51; const gkey KK_ReadChangeAka = 0xFF52; @@ -298,12 +310,31 @@ const gkey KK_ReadDirQuoteMsg = 0xFFA2; const gkey KK_ReadMoveDirQuoteMsg = 0xFFA3; const gkey KK_ReadPeekURLs = 0xFFA4; const gkey KK_ReadShowDel = 0xFFA5; - -const gkey KK_AddressbookQuit = 0xFFB0; -const gkey KK_AddressbookAdd = 0xFFB1; -const gkey KK_AddressbookSelect = 0xFFB2; -const gkey KK_AddressbookDelete = 0xFFB3; -const gkey KK_AddressbookPack = 0xFFB4; +const gkey KK_ReadShowKludge = 0xFFA6; +const gkey KK_ReadHideKludge = 0xFFA7; +const gkey KK_ReadShowHidden = 0xFFA8; +const gkey KK_ReadHideHidden = 0xFFA9; +const gkey KK_ReadShowHiddKlud = 0xFFAA; +const gkey KK_ReadHideHiddKlud = 0xFFAB; +const gkey KK_ReadMark = 0xFFAC; +const gkey KK_ReadUnmark = 0xFFAD; +const gkey KK_ReadReadMarked = 0xFFAE; +const gkey KK_ReadReadAll = 0xFFAF; +const gkey KK_ReadRealMsgno = 0xFFB0; +const gkey KK_ReadSequentMsgno = 0xFFB1; +const gkey KK_ReadStylesNone = 0xFFB2; +const gkey KK_ReadStylesShow = 0xFFB3; +const gkey KK_ReadStylesStrip = 0xFFB4; +const gkey KK_ReadTwitsShow = 0xFFB5; +const gkey KK_ReadTwitsBlank = 0xFFB6; +const gkey KK_ReadTwitsSkip = 0xFFB7; +const gkey KK_ReadTwitsIgnore = 0xFFB8; +const gkey KK_ReadTwitsKill = 0xFFB9; +const gkey KK_ReadStripHTML = 0xFFBA; +const gkey KK_ReadShowHTML = 0xFFBB; +const gkey KK_ReadToggleHTML = 0xFFBC; +const gkey KK_ReadShowQuote = 0xFFBD; +const gkey KK_ReadHideQuote = 0xFFBE; const gkey KK_HeaderAddressbook = 0xFFC0; const gkey KK_HeaderLookup = 0xFFC1; diff --git a/golded3/geline.cpp b/golded3/geline.cpp index f566e10..37686fb 100644 --- a/golded3/geline.cpp +++ b/golded3/geline.cpp @@ -363,6 +363,7 @@ static const Kludges rfc_list[] = { { "X-Char-Esc" , RFC_X_CHAR_ESC , KCRQ_COLON }, { "X-FTN-To" , RFC_X_FTN_TO , KCRQ_COLON }, { "X-Mailer" , RFC_X_MAILER , KCRQ_COLON }, + { "X-Mailreader" , RFC_X_MAILER , KCRQ_COLON }, { "X-Newsreader" , RFC_X_NEWSREADER , KCRQ_COLON }, { "X-To" , RFC_X_TO , KCRQ_COLON }, { "#!" , RFC_RNEWS , KCRQ_NONE }, @@ -1527,13 +1528,23 @@ void ScanKludges(GMsg* msg, int getvalue) { // Check if it's a tearline else if(not (gottear or gottag) and strneql("---", ptr, 3) and (ptr[3] == ' ' or ptr[3] == NUL)) { - Line* nnel = next_non_empty(line->next); - if(not lineno or ((lineno-1) == originlineno) or not nnel or nnel->type & GLINE_KLUDGE) { + Line* tearln = line; + int tearlnno = lineno; + while (tearln->type & GLINE_WRAP) { + tearln = tearln->next; + tearlnno--; + } + Line* nnel = next_non_empty(tearln->next); + if(not tearlnno or ((tearlnno-1) == originlineno) or not nnel or nnel->type & GLINE_KLUDGE) { // Found Tearline gottear = YES; tearlineno = lineno; - line->type |= GLINE_TEAR; - line->color = C_READT; + for (tearln = line; tearln->type & GLINE_WRAP; tearln = tearln->next) { + tearln->type |= GLINE_TEAR; + tearln->color = C_READT; + } + tearln->type |= GLINE_TEAR; + tearln->color = C_READT; strbtrim(strcpy(msg->tearline, ptr+3)); if(getvalue and CFG->gedhandshake) { @@ -1900,7 +1911,7 @@ void MakeLineIndex(GMsg* msg, int margin, bool getvalue, bool header_recode) { int wraps=0, para=0, chslev; bool reflow = false, quoteflag = false; bool quotewraphard = AA->Quotewraphard(); - bool qpencoded = getvalue and IsQuotedPrintable(AA->Xlatimport()); + bool qpencoded = getvalue and (IsQuotedPrintable(AA->Xlatimport()) or AA->StripHTML()); bool gotmime = false; bool gotmultipart = false; bool inheader = false; @@ -1953,6 +1964,8 @@ void MakeLineIndex(GMsg* msg, int margin, bool getvalue, bool header_recode) { char prev_ptr[3] = {"\xFF\xFF"}; + if(AA->StripHTML()) + RemoveHTML(msg->txt); ptr = spanfeeds(msg->txt); // Set default conversion table for area diff --git a/golded3/gemlst.cpp b/golded3/gemlst.cpp index 8b5dd8a..09bf7bf 100644 --- a/golded3/gemlst.cpp +++ b/golded3/gemlst.cpp @@ -412,6 +412,34 @@ bool GMsgList::handle_key() { case KK_ListSelect: return false; + case KK_ListMark: + { + ulong temp = AA->Mark.Find(mlst[index]->msgno); + if(not temp) { + AA->Mark.Add(mlst[index]->msgno); + update_marks(mlst[index]); + } + } + if(index < maximum_index) + cursor_down(); + else + display_bar(); + break; + + case KK_ListUnmark: + { + ulong temp = AA->Mark.Find(mlst[index]->msgno); + if(temp) { + AA->Mark.DelReln(temp); + update_marks(mlst[index]); + } + } + if(index < maximum_index) + cursor_down(); + else + display_bar(); + break; + case KK_ListToggleMark: { ulong temp = AA->Mark.Find(mlst[index]->msgno); @@ -498,6 +526,22 @@ bool GMsgList::handle_key() { DosShell(); break; + case KK_ListWideSubj: + if(not AA->Msglistwidesubj()) { + AA->ToggleMsglistwidesubj(); + update_title(); + update(); + } + break; + + case KK_ListNarrowSubj: + if(AA->Msglistwidesubj()) { + AA->ToggleMsglistwidesubj(); + update_title(); + update(); + } + break; + case KK_ListToggleWideSubj: AA->ToggleMsglistwidesubj(); update_title(); diff --git a/golded3/gemnus.cpp b/golded3/gemnus.cpp index c2508a4..3e91614 100644 --- a/golded3/gemnus.cpp +++ b/golded3/gemnus.cpp @@ -327,11 +327,9 @@ int GMenuDomarks::Run(char* dowhat) { // ------------------------------------------------------------------ -static int gmwm_usehdr = 1; - void do_togglehdr() { - ++gmwm_usehdr; gmwm_usehdr %= 3; - gwin.cmenu->citem->str = (gmwm_usehdr == 1 ? LNG->WriteToHdrYES : gmwm_usehdr == 2 ? LNG->WriteToHdrONLY : LNG->WriteToHdrNO)+1; + ++AA->adat->writeheader; AA->adat->writeheader %= 3; + gwin.cmenu->citem->str = (AA->Writeheader() == 1 ? LNG->WriteToHdrYES : AA->Writeheader() == 2 ? LNG->WriteToHdrONLY : LNG->WriteToHdrNO) + 1; gwin.cmenu->citem->redisp = true; } @@ -354,7 +352,7 @@ int GMenuWriteMsg::Run() { Item(TAG_DISKFILE, LNG->Diskfile); Item(TAG_PRINTER, LNG->Printer); Item(TAG_CLIPBRD, LNG->Clipboard); - Item(TAG_TOGGLEHDR, (gmwm_usehdr == 1 ? LNG->WriteToHdrYES : gmwm_usehdr == 2 ? LNG->WriteToHdrONLY : LNG->WriteToHdrNO), 0, do_togglehdr); + Item(TAG_TOGGLEHDR, (AA->Writeheader() == 1 ? LNG->WriteToHdrYES : AA->Writeheader() == 2 ? LNG->WriteToHdrONLY : LNG->WriteToHdrNO), 0, do_togglehdr); Item(TAG_QUIT, LNG->QuitWrite); SetTag(_prevtag); End(); @@ -362,7 +360,7 @@ int GMenuWriteMsg::Run() { Start(); _prevtag = finaltag; - int header = gmwm_usehdr == 1 ? 0 : gmwm_usehdr == 2 ? WRITE_ONLY_HEADER : WRITE_NO_HEADER; + int header = AA->Writeheader() == 1 ? 0 : AA->Writeheader() == 2 ? WRITE_ONLY_HEADER : WRITE_NO_HEADER; switch(finaltag) { case TAG_DISKFILE: return WRITE_FILE|header; case TAG_PRINTER: return WRITE_PRINTER|header; diff --git a/golded3/gepost.cpp b/golded3/gepost.cpp index f3fafe8..ff53efc 100644 --- a/golded3/gepost.cpp +++ b/golded3/gepost.cpp @@ -619,13 +619,16 @@ static void MakeMsg2(int& mode, int& status, int& forwstat, int& topline, GMsg* int adat_viewhidden = AA->Viewhidden(); int adat_viewkludge = AA->Viewkludge(); int adat_viewquote = AA->Viewquote(); + bool adat_striphtml = AA->StripHTML(); AA->adat->viewhidden = true; AA->adat->viewkludge = true; AA->adat->viewquote = true; + AA->adat->striphtml = false; msg->TextToLines(CFG->dispmargin-1, false); // Ignore any kludge address found AA->adat->viewhidden = adat_viewhidden; AA->adat->viewkludge = adat_viewkludge; AA->adat->viewquote = adat_viewquote; + AA->adat->striphtml = adat_striphtml; msg->attr.pos0(); InvalidateControlInfo(msg); diff --git a/golded3/geprot.h b/golded3/geprot.h index a9a1322..e6453a9 100644 --- a/golded3/geprot.h +++ b/golded3/geprot.h @@ -337,6 +337,7 @@ void ToggleBookMark(); void ToggleHidden(); void ToggleHiddKlud(); void ToggleKludge(); +void ToggleStripHTML(); void ToggleMark(); void ToggleMarkRead(); void TogglePageBar(); @@ -470,6 +471,11 @@ bool isuucp(const char *name); const char *url_begin(const char *ptr); +// ------------------------------------------------------------------ + +void RemoveHTML(char *&txt); + + // ------------------------------------------------------------------ #endif diff --git a/golded3/gerand.cpp b/golded3/gerand.cpp index e6ae626..b17395b 100644 --- a/golded3/gerand.cpp +++ b/golded3/gerand.cpp @@ -180,6 +180,8 @@ void Area::InitData() { adat->viewhidden = CFG->viewhidden; adat->viewkludge = CFG->viewkludge; adat->viewquote = CFG->viewquote; + adat->writeheader = CFG->writeheader; + adat->striphtml = CFG->striphtml; strcpy(adat->nickname, CFG->nickname); strcpy(adat->netname, CFG->netname); strcpy(adat->whoto, CFG->whoto); @@ -405,6 +407,8 @@ void Area::RandomizeData(int mode) { CFG->grp.GetItm(GRP_VIEWHIDDEN, adat->viewhidden); CFG->grp.GetItm(GRP_VIEWKLUDGE, adat->viewkludge); CFG->grp.GetItm(GRP_VIEWQUOTE, adat->viewquote); + CFG->grp.GetItm(GRP_STRIPHTML, adat->striphtml); + CFG->grp.GetItm(GRP_WRITEHEADER, adat->writeheader); } if(CFG->grp.GetItm(GRP_NICKNAME, buf, sizeof(buf))) diff --git a/golded3/geread.cpp b/golded3/geread.cpp index 33592fe..6bf8564 100644 --- a/golded3/geread.cpp +++ b/golded3/geread.cpp @@ -270,24 +270,28 @@ void Reader() { if(AA->isreadmark or AA->isreadpm) { GTag& tag = AA->isreadpm ? AA->PMrk : AA->Mark; uint mtemp = tag.Find(msg->msgno); - sprintf(buf2, "%s [%s%s%s%s]", + sprintf(buf2, "%s [%s%s%s%s%s%s]", LNG->ReadMarked, AA->Viewhidden() ? "H" : "", AA->Viewkludge() ? "K" : "", AA->Twitmode() == TWIT_IGNORE ? "Ti" : AA->Twitmode() == TWIT_SKIP ? "Ts" : AA->Twitmode() == TWIT_BLANK ? "Tb" : AA->Twitmode() == TWIT_KILL ? "Tk" : "", - CFG->showdeleted ? "D" : "" + CFG->showdeleted ? "D" : "", + AA->Viewquote() ? "Q" : "", + AA->StripHTML() ? "S" : "" ); sprintf(buf, buf2, mtemp, tag.Count(), tag.Count()-mtemp ); } else { - sprintf(buf2, "%s [%s%s%s%s]", + sprintf(buf2, "%s [%s%s%s%s%s%s]", LNG->ReadAll, AA->Viewhidden() ? "H" : "", AA->Viewkludge() ? "K" : "", AA->Twitmode() == TWIT_IGNORE ? "Ti" : AA->Twitmode() == TWIT_SKIP ? "Ts" : AA->Twitmode() == TWIT_BLANK ? "Tb" : AA->Twitmode() == TWIT_KILL ? "Tk" : "", - CFG->showdeleted ? "D" : "" + CFG->showdeleted ? "D" : "", + AA->Viewquote() ? "Q" : "", + AA->StripHTML() ? "S" : "" ); sprintf(buf, buf2, AA->lastread(), AA->Msgn.Count(), AA->Msgn.Count()-AA->lastread() @@ -480,6 +484,29 @@ void Reader() { IncMargin(); break; + case KK_ReadStylesNone: + if(CFG->usestylies or CFG->hidestylies) + CFG->usestylies = CFG->hidestylies = false; + else + reader_keyok = true; + break; + + case KK_ReadStylesShow: + if(not CFG->usestylies or CFG->hidestylies) { + CFG->usestylies = true; + CFG->hidestylies = false; + } + else + reader_keyok = true; + break; + + case KK_ReadStylesStrip: + if(not CFG->usestylies or not CFG->hidestylies) + CFG->usestylies = CFG->hidestylies = true; + else + reader_keyok = true; + break; + case KK_ReadToggleStyles: ToggleStyles(); break; @@ -488,14 +515,105 @@ void Reader() { AA->attr().hexX(); break; + case KK_ReadStripHTML: + if(not AA->StripHTML()) + ToggleStripHTML(); + else + reader_keyok = true; + break; + + case KK_ReadShowHTML: + if(AA->StripHTML()) + ToggleStripHTML(); + else + reader_keyok = true; + break; + + case KK_ReadToggleHTML: + ToggleStripHTML(); + break; + + case KK_ReadTwitsShow: + if(AA->Twitmode() != TWIT_SHOW) { + AA->SetTwitmode(TWIT_SHOW); + CFG->twitmode = TWIT_SHOW; + } + else + reader_keyok = true; + break; + + case KK_ReadTwitsBlank: + if(AA->Twitmode() != TWIT_BLANK) { + AA->SetTwitmode(TWIT_BLANK); + CFG->twitmode = TWIT_BLANK; + } + else + reader_keyok = true; + break; + + case KK_ReadTwitsSkip: + if(AA->Twitmode() != TWIT_SKIP) { + AA->SetTwitmode(TWIT_SKIP); + CFG->twitmode = TWIT_SKIP; + } + else + reader_keyok = true; + break; + + case KK_ReadTwitsIgnore: + if(AA->Twitmode() != TWIT_IGNORE) { + AA->SetTwitmode(TWIT_IGNORE); + CFG->twitmode = TWIT_IGNORE; + } + else + reader_keyok = true; + break; + + case KK_ReadTwitsKill: + if(AA->Twitmode() != TWIT_KILL) { + AA->SetTwitmode(TWIT_KILL); + CFG->twitmode = TWIT_KILL; + } + else + reader_keyok = true; + break; + case KK_ReadToggleTwits: ToggleTwits(); break; + case KK_ReadReadMarked: + if(not AA->isreadmark) + ToggleMarkRead(); + else + reader_keyok = true; + break; + + case KK_ReadReadAll: + if(AA->isreadmark) + ToggleMarkRead(); + else + reader_keyok = true; + break; + case KK_ReadToggleMarkRead: ToggleMarkRead(); break; + case KK_ReadMark: + if(not AA->Mark.Find(reader_msg->msgno)) + ToggleMark(); + else + reader_keyok = true; + break; + + case KK_ReadUnmark: + if(AA->Mark.Find(reader_msg->msgno)) + ToggleMark(); + else + reader_keyok = true; + break; + case KK_ReadToggleMark: ToggleMark(); break; @@ -549,18 +667,82 @@ void Reader() { GotoPrevUnread(); break; + case KK_ReadShowHiddKlud: + if(not AA->Viewhidden() and not AA->Viewkludge()) + ToggleHiddKlud(); + else if(not AA->Viewhidden()) + ToggleHidden(); + else if(not AA->Viewkludge()) + ToggleKludge(); + else + reader_keyok = true; + break; + + case KK_ReadHideHiddKlud: + if(AA->Viewhidden() and AA->Viewkludge()) + ToggleHiddKlud(); + else if(AA->Viewhidden()) + ToggleHidden(); + else if(AA->Viewkludge()) + ToggleKludge(); + else + reader_keyok = true; + break; + case KK_ReadToggleHiddKlud: ToggleHiddKlud(); break; + case KK_ReadShowKludge: + if(not AA->Viewkludge()) + ToggleKludge(); + else + reader_keyok = true; + break; + + case KK_ReadHideKludge: + if(AA->Viewkludge()) + ToggleKludge(); + else + reader_keyok = true; + break; + case KK_ReadToggleKludge: ToggleKludge(); break; + case KK_ReadShowHidden: + if(not AA->Viewhidden()) + ToggleHidden(); + else + reader_keyok = true; + break; + + case KK_ReadHideHidden: + if(AA->Viewhidden()) + ToggleHidden(); + else + reader_keyok = true; + break; + case KK_ReadToggleHidden: ToggleHidden(); break; + case KK_ReadShowQuote: + if(not AA->Viewquote()) + ToggleQuote(); + else + reader_keyok = true; + break; + + case KK_ReadHideQuote: + if(AA->Viewquote()) + ToggleQuote(); + else + reader_keyok = true; + break; + case KK_ReadToggleQuote: ToggleQuote(); break; @@ -573,6 +755,20 @@ void Reader() { TogglePageBar(); break; + case KK_ReadRealMsgno: + if(not CFG->switches.get(disprealmsgno)) + ToggleRealMsgno(); + else + reader_keyok = true; + break; + + case KK_ReadSequentMsgno: + if(CFG->switches.get(disprealmsgno)) + ToggleRealMsgno(); + else + reader_keyok = true; + break; + case KK_ReadToggleRealMsgno: ToggleRealMsgno(); break; diff --git a/golded3/geread2.cpp b/golded3/geread2.cpp index 5a74519..5d802f8 100644 --- a/golded3/geread2.cpp +++ b/golded3/geread2.cpp @@ -153,6 +153,16 @@ void ToggleHidden() { } +// ------------------------------------------------------------------ + +void ToggleStripHTML() { + + AA->ToggleStripHTML(); + MsgLineReIndex(reader_msg); + reader_topline = 0; +} + + // ------------------------------------------------------------------ void ToggleQuote() { diff --git a/golded3/gmarea.h b/golded3/gmarea.h index 74a77c9..0f5038a 100644 --- a/golded3/gmarea.h +++ b/golded3/gmarea.h @@ -323,6 +323,8 @@ struct AreaData { bool viewhidden; bool viewkludge; bool viewquote; + bool striphtml; + int writeheader; }; // ------------------------------------------------------------------ @@ -559,6 +561,7 @@ public: bool Quotewraphard() const { return adat->quotewraphard; } const GPlay& Play() const { return adat->play; } const int Replyre() const { return adat->replyre; } + bool StripHTML() const { return adat->striphtml; } const char* Searchfor() const { return adat->searchfor; } const char* Tagline() const { return adat->tagline; } char Taglinechar() const { return adat->taglinechar; } @@ -575,6 +578,7 @@ public: bool Viewkludge() const { return adat->viewkludge; } bool Viewquote() const { return adat->viewquote; } const char* Whoto() const { return adat->whoto; } + int Writeheader() const { return adat->writeheader; } const char* WTpl() const { return adat->wtpl; } const char* Xlatexport() const { return adat->xlatexport; } const char* Xlatimport() const { return adat->xlatimport; } @@ -596,7 +600,7 @@ public: int ToggleViewhidden() { adat->viewhidden = not adat->viewhidden; return adat->viewhidden; } int ToggleViewkludge() { adat->viewkludge = not adat->viewkludge; return adat->viewkludge; } int ToggleViewquote() { adat->viewquote = not adat->viewquote; return adat->viewquote; } - + bool ToggleStripHTML() { adat->striphtml = not adat->striphtml; return adat->striphtml; } }; diff --git a/golded3/golded3.all b/golded3/golded3.all index d14d422..c7119cb 100644 --- a/golded3/golded3.all +++ b/golded3/golded3.all @@ -81,6 +81,7 @@ geutil cpp all nov bcd bco bcx djg emx lnx rsx wcn wco wcx cyg be geutil2 cpp all ovl bcd bco bcx djg emx lnx rsx wcn wco wcx cyg be geview cpp all ovl bcd bco bcx djg emx lnx rsx wcn wco wcx cyg be gmarea cpp all ovl bcd bco bcx djg emx lnx rsx wcn wco wcx cyg be +gehtml cpp all nov bcd bco bcx djg emx lnx rsx wcn wco wcx cyg be golded3 cpp all nov bcd bco bcx djg emx lnx rsx wcn wco wcx cyg be gedcyg rc cyg gedemx rc emx diff --git a/goldlib/gall/gutlgrp.h b/goldlib/gall/gutlgrp.h index 8bb4ff7..dde0001 100644 --- a/goldlib/gall/gutlgrp.h +++ b/goldlib/gall/gutlgrp.h @@ -86,6 +86,7 @@ enum { GRP_QUOTESTOPS, GRP_QUOTEWRAPHARD, GRP_SEARCHFOR, + GRP_STRIPHTML, GRP_TAGLINE, GRP_TAGLINECHAR, GRP_TAGLINESUPPORT, @@ -101,6 +102,7 @@ enum { GRP_VIEWKLUDGE, GRP_VIEWQUOTE, GRP_WHOTO, + GRP_WRITEHEADER, GRP_WRITETEMPLATE, GRP_XLATEXPORT, GRP_XLATIMPORT, diff --git a/goldlib/gcfg/gxhpt.cpp b/goldlib/gcfg/gxhpt.cpp index ba01451..001a80c 100644 --- a/goldlib/gcfg/gxhpt.cpp +++ b/goldlib/gcfg/gxhpt.cpp @@ -336,14 +336,20 @@ void gareafile::ReadHPTFile(char* path, char* file, char* origin, int group) { switch(aa.type) { case GMB_NET: aa.attr = attribsnet; + if(aa.msgbase == 0) + aa.msgbase = fidomsgtype; AddNewArea(aa); break; case GMB_ECHO: aa.attr = attribsecho; + if(aa.msgbase == 0) + aa.msgbase = fidomsgtype; AddNewArea(aa); break; case GMB_LOCAL: aa.attr = attribslocal; + if(aa.msgbase == 0) + aa.msgbase = fidomsgtype; AddNewArea(aa); break; case GMB_DEFAULT: diff --git a/goldlib/uulib/uunconc.c b/goldlib/uulib/uunconc.c index 95f6353..dff494a 100644 --- a/goldlib/uulib/uunconc.c +++ b/goldlib/uulib/uunconc.c @@ -76,7 +76,8 @@ char * uunconc_id = "$Id$"; #define BEGIN (1) #define DATA (2) #define END (3) -#define DONE (4) +#define END2 (4) +#define DONE (5) /* * mallocable areas @@ -1072,7 +1073,15 @@ UUDecodePart (FILE *datain, FILE *dataout, int *state, tc = tf = vlc = 0; lc[0] = lc[1] = 0; } - else if ((*state == END) && + else if ((*state == END) && (method == UU_ENCODED)) { + if (strncmp (line, "`", 1) == 0) + *state = END2; + } + else if ((*state == END) && (method == XX_ENCODED)) { + if (strncmp (line, "+", 1) == 0) + *state = END2; + } + else if ((*state == END2) && (method == UU_ENCODED || method == XX_ENCODED)) { if (strncmp (line, "end", 3) == 0) { *state = DONE; @@ -1117,7 +1126,7 @@ UUDecodePart (FILE *datain, FILE *dataout, int *state, break; } - if (*state == DATA || *state == END) { + if (*state == DATA || *state == END || *state == END2) { if (method==B64ENCODED && line[0]=='-' && line[1]=='-' && tc) { break; } @@ -1173,9 +1182,9 @@ UUDecodePart (FILE *datain, FILE *dataout, int *state, } if (method == UU_ENCODED) - *state = (line[0] == 'M') ? DATA : END; + *state = (line[0] == 'M') ? DATA : (line[0] == '`') ? END2 : END; else if (method == XX_ENCODED) - *state = (line[0] == 'h') ? DATA : END; + *state = (line[0] == 'h') ? DATA : (line[0] == '+') ? END2 : END; else if (method == B64ENCODED) *state = (strchr (line, '=') == NULL) ? DATA : DONE; else if (method == BH_ENCODED) diff --git a/goldlib/uulib/uuscan.c b/goldlib/uulib/uuscan.c index ed1763d..695f14f 100644 --- a/goldlib/uulib/uuscan.c +++ b/goldlib/uulib/uuscan.c @@ -525,6 +525,7 @@ ScanData (FILE *datei, char *fname, int *errcode, long preheaders=0, oldposition; long yefilesize=0, yepartends=0; size_t dcc, bhopc; + char prevlinefirstchar; *errcode = UURET_OK; (void) UUDecodeLine (NULL, NULL, 0); /* init */ @@ -545,7 +546,9 @@ ScanData (FILE *datei, char *fname, int *errcode, if (boundary) blen = strlen (boundary); + line[0] = '\0'; while (!feof (datei)) { + prevlinefirstchar = line[0]; oldposition = ftell (datei); if (_FP_fgets (line, 299, datei) == NULL) break; @@ -675,7 +678,17 @@ ScanData (FILE *datei, char *fname, int *errcode, result->uudet = XX_ENCODED; if (result->uudet != B64ENCODED) { - result->end = 1; + if (result->uudet == XX_ENCODED) { + if (prevlinefirstchar == '+') + result->end = 1; + } + if (result->uudet == UU_ENCODED) { + if (prevlinefirstchar == '`') + result->end = 1; + } + else { + result->end = 1; + } if (dflag && encoding) result->uudet = encoding; continue; @@ -839,6 +852,7 @@ ScanData (FILE *datei, char *fname, int *errcode, (((ptr = _FP_strrstr (line+2, "--")) == NULL) || (*(ptr+2) != '\012' && *(ptr+2) != '\015')) && _FP_strstr (line+2, "_=_") != NULL) { + prevlinefirstchar = line[0]; if (_FP_fgets (line, 255, datei) == NULL) { break; } @@ -1096,6 +1110,7 @@ ScanData (FILE *datei, char *fname, int *errcode, break; } + prevlinefirstchar = line[0]; oldposition = ftell (datei); if (_FP_fgets (line, 255, datei) == NULL) break; @@ -1117,8 +1132,18 @@ ScanData (FILE *datei, char *fname, int *errcode, else if (line[0] == 'e' && (result->uudet == UU_ENCODED || result->uudet == XX_ENCODED)) { if (strncmp (line, "end", 3) == 0) { - result->end = 1; - break; + if (result->uudet == XX_ENCODED) { + if (prevlinefirstchar == '+') { + result->end = 1; + break; + } + } + else { + if (prevlinefirstchar == '`') { + result->end = 1; + break; + } + } } } else if (line[0] == 'b') {