• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ASA01

[duvida] Criar uma barra para o firefox.

11 mensagens neste tópico

Boas

Eu preciso de criar uma barra para o firefox que faça o seguinte:

1º- faça a leitura do codigo fonte da pagina html activa;

2º- execute um pre-tratamento aos dados recolhidos na leitura;

3º- grave esses dados para um ficheiro txt;

Pelo que ja pesquisei vou ter que usar XUL para programar a extensão, e tb posso usar java e html.

A minha duvida é com que linguagem e como é que vou fazer a leitura da pagina html?

Só preciso de uma linha de orientação.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

segundo o que li agora há tempos o mozilla engine tem suporte para javascript, java, c/c++ e, em fase de testes, python.

Ora, como tu disseste e bem, precisas de uma orientação. Eu não sei agora de cor como se vai buscar o html mostrado o que eu fazia era isto: analisava o ficheiro browser.xul e tentava descobrir  que função é que era chamada na parte do conteudo da janela. Ou mesmo que endereço está na barra de endereço ( é capaz de ser mais facil ) . Depois ia ao ficheiro que tem o código ( não mel embro qual ) e via como eles faziam para sacar a pagina.

Lembrei-me agora, procura o menu file>save page as depois é só pegares na função de salvar e adapta-la a ti.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ora bem desde ja obrigado pelas dicas.

Apos pesquisar durante algum tempo e recorrendo as dicas aqui deixadas fiquei a perceber mais de como isto funciona, o problema mesmo é encontrar a tal função do save as, ja encontrei uma ou outra coisa, mas o problema é pegar nisso e levar para o meu codigo.

// Save URL of clicked-on frame.
    saveFrame : function () {
        saveDocument( this.target.ownerDocument );
    },
    // Save URL of clicked-on link.
    saveLink : function () {
        urlSecurityCheck(this.linkURL, this.docURL);
        saveURL( this.linkURL, this.linkText(), null, true, false,
                 makeURI(this.docURL, this.target.ownerDocument.characterSet) );

Como é que eu vou usar esta função?

Tb lembrei-me de usar os ficheiros cache do firefox mas aquilo vem "codificado" e nao permite modificar nem copiar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

function saveDocument(aDocument)
{
  if (!aDocument) {
    throw "Must have a document when calling saveDocument";
  }

  // We want to use cached data because the document is currently visible.
  var dispHeader = null;
  try {
    dispHeader =
      aDocument.defaultView
               .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
               .getInterface(Components.interfaces.nsIDOMWindowUtils)
               .getDocumentMetadata("content-disposition");
  } catch (ex) {
    // Failure to get a content-disposition is ok
  }
  internalSave(aDocument.location.href, aDocument, null, dispHeader,
               aDocument.contentType, false, null, null);
}

bem antes de pedires aqui vai a função internalSave

/**
* internalSave: Used when saving a document or URL. This method:
*  - Determines a local target filename to use (unless parameter
*    aChosenData is non-null)
*  - Determines content-type if possible
*  - Prompts the user to confirm the destination filename and save mode
*    (content-type affects this)
*  - Creates a 'Persist' object (which will perform the saving in the
*    background) and then starts it.
*
* @param aURL The String representation of the URL of the document being saved
* @param aDocument The document to be saved
* @param aDefaultFileName The caller-provided suggested filename if we don't
*        find a better one
* @param aContentDisposition The caller-provided content-disposition header
*         to use.
* @param aContentType The caller-provided content-type to use
* @param aShouldBypassCache If true, the document will always be refetched
*        from the server
* @param aFilePickerTitleKey Alternate title for the file picker
* @param aChosenData If non-null this contains an instance of object AutoChosen
*        (see below) which holds pre-determined data so that the user does not
*        need to be prompted for a target filename.
* @param aReferrer the referrer URI object (not URL string) to use, or null
          if no referrer should be sent.
*/
function internalSave(aURL, aDocument, aDefaultFileName, aContentDisposition,
                      aContentType, aShouldBypassCache, aFilePickerTitleKey,
                      aChosenData, aReferrer)
{
  // Note: aDocument == null when this code is used by save-link-as...
  var saveMode = GetSaveModeForContentType(aContentType);
  var isDocument = aDocument != null && saveMode != SAVEMODE_FILEONLY;
  var saveAsType = SAVETYPE_COMPLETE_PAGE;

  var file, fileURL;
  // Find the URI object for aURL and the FileName/Extension to use when saving.
  // FileName/Extension will be ignored if aChosenData supplied.
  var fileInfo = new FileInfo(aDefaultFileName);
  if (aChosenData)
    file = aChosenData.file;
  else {
    var charset = null;
    if (aDocument)
      charset = aDocument.characterSet;
    else if (aReferrer)
      charset = aReferrer.originCharset;
    initFileInfo(fileInfo, aURL, charset, aDocument,
                 aContentType, aContentDisposition);
    var fpParams = {
      fpTitleKey: aFilePickerTitleKey,
      isDocument: isDocument,
      fileInfo: fileInfo,
      contentType: aContentType,
      saveMode: saveMode,
      saveAsType: saveAsType,
      file: file,
      fileURL: fileURL
    };
    if (!poseFilePicker(fpParams))
      // If the method returned false this is because the user cancelled from
      // the save file picker dialog.
      return;

    saveAsType = fpParams.saveAsType;
    saveMode = fpParams.saveMode;
    file = fpParams.file;
    fileURL = fpParams.fileURL;
  }

  if (!fileURL)
    fileURL = makeFileURI(file);

  // XXX We depend on the following holding true in appendFiltersForContentType():
  // If we should save as a complete page, the saveAsType is SAVETYPE_COMPLETE_PAGE.
  // If we should save as text, the saveAsType is SAVETYPE_TEXT_ONLY.
  var useSaveDocument = isDocument &&
                        (((saveMode & SAVEMODE_COMPLETE_DOM) && (saveAsType == SAVETYPE_COMPLETE_PAGE)) ||
                         ((saveMode & SAVEMODE_COMPLETE_TEXT) && (saveAsType == SAVETYPE_TEXT_ONLY)));

  // If we're saving a document, and are saving either in complete mode or
  // as converted text, pass the document to the web browser persist component.
  // If we're just saving the HTML (second option in the list), send only the URI.
  var source = useSaveDocument ? aDocument : fileInfo.uri;
  var persistArgs = {
    source      : source,
    contentType : (!aChosenData && useSaveDocument &&
                   saveAsType == SAVETYPE_TEXT_ONLY) ?
                  "text/plain" : aContentType,
    target      : fileURL,
    postData    : isDocument ? getPostData() : null,
    bypassCache : aShouldBypassCache
  };

  var persist = makeWebBrowserPersist();

  // Calculate persist flags.
  const nsIWBP = Components.interfaces.nsIWebBrowserPersist;
  const flags = nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES;
  if (aShouldBypassCache)
    persist.persistFlags = flags | nsIWBP.PERSIST_FLAGS_BYPASS_CACHE;
  else
    persist.persistFlags = flags | nsIWBP.PERSIST_FLAGS_FROM_CACHE;

  // Leave it to WebBrowserPersist to discover the encoding type (or lack thereof):
  persist.persistFlags |= nsIWBP.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;

  // Create download and initiate it (below)
  var tr = Components.classes["@mozilla.org/transfer;1"].createInstance(Components.interfaces.nsITransfer);

  if (useSaveDocument) {
    // Saving a Document, not a URI:
    var filesFolder = null;
    if (persistArgs.contentType != "text/plain") {
      // Create the local directory into which to save associated files.
      filesFolder = file.clone();

      var nameWithoutExtension = filesFolder.leafName.replace(/\.[^.]*$/, "");
      var filesFolderLeafName = getStringBundle().formatStringFromName("filesFolder",
                                                                       [nameWithoutExtension],
                                                                       1);

      filesFolder.leafName = filesFolderLeafName;
    }

    var encodingFlags = 0;
    if (persistArgs.contentType == "text/plain") {
      encodingFlags |= nsIWBP.ENCODE_FLAGS_FORMATTED;
      encodingFlags |= nsIWBP.ENCODE_FLAGS_ABSOLUTE_LINKS;
      encodingFlags |= nsIWBP.ENCODE_FLAGS_NOFRAMES_CONTENT;
    }
    else {
      encodingFlags |= nsIWBP.ENCODE_FLAGS_ENCODE_BASIC_ENTITIES;
    }

    const kWrapColumn = 80;
    tr.init((aChosenData ? aChosenData.uri : fileInfo.uri),
            persistArgs.target, "", null, null, null, persist);
    persist.progressListener = tr;
    persist.saveDocument(persistArgs.source, persistArgs.target, filesFolder,
                         persistArgs.contentType, encodingFlags, kWrapColumn);
  } else {
    tr.init((aChosenData ? aChosenData.uri : source),
            persistArgs.target, "", null, null, null, persist);
    persist.progressListener = tr;
    persist.saveURI((aChosenData ? aChosenData.uri : source),
                    null, aReferrer, persistArgs.postData, null,
                    persistArgs.target);
  }
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

será que eu com estas 2 funções consigo guardar um file em determinado sitio e depois abrir o file retirar o que quero e voltar a fechar?

Se for só assim a extensão só precisa de guardar o file com estas funções e depois a partir dai trabalho só com o javascript ou c++ sem precisar de interagir com o browser.

certo?

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

saveDocument( this.target.ownerDocument );

Pelo que percebi, o argumento passado ali é o equivalente à variável document da página. ;)

será que eu com estas 2 funções consigo guardar um file em determinado sitio e depois abrir o file retirar o que quero e voltar a fechar?

Se for só assim só preciso de determinar o nome do file e caminho onde vai ser guardado e depois é só trabalhar com o file a minha maneira, achas que funciona?

Não faço ideia. ;)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

vou experimentar criar uma extensão que guarde as paginas automaticamente depois se funcionar o resto é "fácil"  ;)

assim que ter alguma coisa dou feedback, desde ja obrigado pela ajuda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nem precisas de salvar primeiro, guarda so mesmo o que te tinteressa. Podes usar a funcao internalSave.

Experimenta por um botaozito num sistio qualquer e chamar uma funcao, quando isso estiver a funcionar, tenta chamar a internalSave.

Como vez nao é assim tao dificil.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

bem já consegui simular o botão do save as, agr so me falta modelar a função saveDocument para guardar o que eu quero mas como faço isso?  :hmm: :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora