Fatti: A. Dal 2007 A._ era dipendente della B._ come giornalista del settimanale xxx; dal 2010 curava la rubrica yyye interviste a personaggi di spicco. Era retribuita, da ultimo, con fr. 400.-- per articolo pubblicato. Con raccomandata del 6 marzo 2015 B._ ha disdetto il rapporto di lavoro per la scadenza del 30 giugno 2015. Con lettera del 18 marzo 2015 ha precisato che il licenziamento era motivato dal fatto che la dipendente non si era attenuta ai limiti della rubrica yyye, nonostante ripetuti richiami, non aveva seguito le istruzioni del responsabile della redazione. La dipendente si è opposta alla disdetta, che ha definito abusiva. B. Il 5 novembre 2015 A._ ha avviato una causa civile davanti alla Pretura di Lugano chiedendo che B._ fosse condannata a pagarle fr. 2'000.-- di salario quale retribuzione per quattro articoli non pubblicati e l'annullamento della rubrica yyy, fr. 13'000.-- d'indennità per disdetta abusiva e fr. 5'000.-- a titolo di risarcimento del danno e del torto morale; ha inoltre chiesto il rilascio di un certificato di lavoro completo. L'attrice sosteneva che la disdetta fosse abusiva, perché consecutiva alle divergenze sorte dopo la pubblicazione di due articoli: una critica nella rubrica yyy su C._, presentatore del gioco televisivo zzz, figlio dell'avvocato D._, presidente di E._ e del consiglio di fondazione del F._, nonché amico del direttore della convenuta G._; e un'intervista al direttore dell'informazione della RSI H._ contenente critiche al Consiglio del pubblico della Società cooperativa per la radiotelevisione svizzera di lingua italiana (CORSI). La convenuta si è opposta alla petizione sostenendo che l'attrice era stata licenziata poiché non si era attenuta, nonostante ripetuti richiami, alle istruzioni impartitele e ai limiti di contenuto della rubrica yyy, in particolare aveva espresso attacchi personali e commenti politici inadeguati. Ha proposto un testo dell'attestato di lavoro, che l'attrice ha rettificato in sede dibattimentale. Al termine dell'istruttoria l'attrice ha aumentato a fr. 10'000.-- la pretesa di risarcimento del danno e del torto morale. Il Pretore aggiunto di Lugano ha accolto parzialmente la petizione con sentenza del 21 novembre 2018. Ha condannato la convenuta a pagare fr. 400.-- per un articolo non pubblicato a torto e a rilasciare all'attrice l'attestato di lavoro, del quale ha definito il contenuto. C. Entrambe le parti si sono rivolte al Tribunale di appello del Cantone Ticino. L'attrice ha chiesto l'accoglimento integrale delle sue pretese e il rilascio del certificato di lavoro nella forma limitata, dichiarando subordinatamente di rinunciarvi. Con appello incidentale la convenuta ha chiesto di respingere la pretesa di risarcimento e la rettifica del testo dell'attestato di lavoro. La II Camera civile del Tribunale di appello si è pronunciata il 13 marzo 2020 con giudizio notificato il 5 maggio 2020. Ha modificato parzialmente il contenuto dell'attestato di lavoro limitato proposto dall'attrice e, per il resto, ha respinto il suo appello nella misura in cui lo ha ritenuto ricevibile. Anche l'appello incidentale della convenuta è stato respinto in quanto ricevibile. D. A._ insorge davanti al Tribunale federale con ricorso in materia civile del 5 giugno 2020. Chiede, oltre alla concessione dell'effetto sospensivo, la condanna della convenuta a pagarle fr. 2'000.-- di retribuzione del lavoro, fr. 13'000.-- di indennità per disdetta abusiva e fr. 10'000.-- di torto morale e a rilasciarle l'attestato di lavoro da lei proposto. B._ postula la reiezione della domanda cautelare e del ricorso. Le parti hanno presentato osservazioni di replica e duplica. L'autorità cantonale non ha preso posizione. La domanda di effetto sospensivo è stata respinta con decreto presidenziale del 4 settembre 2020, dando atto che la parte convenuta ha dichiarato di rinunciare all'incasso delle ripetibili fino all'evasione del ricorso.